【问题标题】:Python SKLearn: How to Get Feature Names After OneHotEncoder?Python SKLearn:如何在 OneHotEncoder 之后获取特征名称?
【发布时间】:2018-09-01 04:11:04
【问题描述】:

我想获取经过 SKLearn OneHotEncoder 转换后的数据集的特征名称。

在active_features_ attribute in OneHotEncoder 中可以很好地解释n_values_、feature_indices_ 和active_features_ 属性是如何在transform() 执行后填充的。

我的问题是:

例如基于 DataFrame 的输入数据:

data = pd.DataFrame({"a": [0, 1, 2,0], "b": [0,1,4, 5], "c":[0,1,4, 5]}).as_matrix()

代码如何从原始特征名称a、b 和c 到转换后的特征名称列表 (例如:

a-0,a-1,a-2,b-0,b-1,b-2,b-3,c-0,c-1,c-2,c-2,@987

或

a-0,a-1,a-2,b-0,b-1,b-2,b-3,b-4,b-5,b-7,@98654351@,@9867654351@

或任何有助于查看编码列与原始列的分配情况)。

背景:我想看看一些算法的特征重要性,以了解哪个特征对所用算法的影响最大。

【问题讨论】:

  • 我不确定您需要知道什么。您想知道“从……到……”的代码。您只想列出新列的名称吗?看到编码器用来生成新列名的代码了吗? “查看分配”会混淆问题,因为这些列未“分配给”原始列;它们派生自原始列,不再具有数据流连接..

标签: python machine-learning scikit-learn


【解决方案1】:

你可以使用pd.get_dummies():

pd.get_dummies(data["a"],prefix="a")

会给你:

    a_0 a_1 a_2
0   1   0   0
1   0   1   0
2   0   0   1
3   1   0   0

可以自动生成列名。您可以将此应用于所有列,然后获取列名称。无需将它们转换为 numpy 矩阵。

所以:

df = pd.DataFrame({"a": [0, 1, 2,0], "b": [0,1,4, 5], "c":[0,1,4, 5]})
data = df.as_matrix()

解决方案如下:

columns = df.columns
my_result = pd.DataFrame()
temp = pd.DataFrame()
for runner in columns:
    temp = pd.get_dummies(df[runner], prefix=runner)
    my_result[temp.columns] = temp
print(my_result.columns)

>>Index(['a_0', 'a_1', 'a_2', 'b_0', 'b_1', 'b_4', 'b_5', 'c_0', 'c_1', 'c_4',
       'c_5'],
      dtype='object')

【讨论】:

    【解决方案2】:

    如果我理解正确,您可以使用feature_indices_ 来识别哪些列对应于哪个功能。

    例如

    import pandas as pd
    from sklearn.preprocessing import OneHotEncoder
    data = pd.DataFrame({"a": [0, 1, 2,0], "b": [0,1,4, 5], "c":[0,1,4, 5]}).as_matrix()
    ohe = OneHotEncoder(sparse=False)
    ohe_fitted = ohe.fit_transform(data)
    print(ohe_fitted)
    print(ohe.feature_indices_) # [ 0  3  9 15]
    

    从上面的feature_indices_我们知道如果我们拼接来自0:3的OneHotEncoded数据,我们将得到与data中第一列对应的特征,如下所示:

    print(ohe_fitted[:,0:3])
    

    拼接数据中的每一列代表第一个特征中的一个值。第一列是 0,第二列是 1,第三列是 2。为了在拼接数据上说明这一点,列标签如下所示:

      a_0 a_1 a_2
    [[ 1.  0.  0.]
     [ 0.  1.  0.]
     [ 0.  0.  1.]
     [ 1.  0.  0.]]
    

    请注意,特征在编码之前先排序。

    【讨论】:

      【解决方案3】:

      有一个 OneHotEncoder 可以为您完成所有工作。

      包 sksurv 有一个 OneHotEncoder,它将返回一个熊猫数据框,其中包含为您设置的所有列名。看看这个。确保您设置了一个环境来使用编码器,以确保它不会破坏您当前的环境。这个编码器为我节省了很多时间和精力。

      scikit-suvival GitHub

      OneHotEncoder Documentation

      【讨论】:

        【解决方案4】:

        您可以使用开源包功能引擎来做到这一点:

        import pandas as pd
        from sklearn.model_selection import train_test_split
        from feature_engine.encoding import OneHotEncoder
        
        # load titanic data from openML
        pd.read_csv('https://www.openml.org/data/get_csv/16826755/phpMYEkMl')
        
        # divide into train and test
        X_train, X_test, y_train, y_test = train_test_split(
            data[['sex', 'embarked']],  # predictors for this example
            data['survived'],  # target
            test_size=0.3,  # percentage of obs in test set
            random_state=0)  # seed to ensure reproducibility
        
        ohe_enc = OneHotEncoder(
            top_categories=None,
            variables=['sex', 'embarked'],
            drop_last=True)
        
        ohe_enc.fit(X_train)
        
        X_train = ohe_enc.transform(X_train)
        X_test = ohe_enc.transform(X_test)
        
        X_train.head()
        

        您应该会看到返回的输出:

           sex_female  embarked_S  embarked_C  embarked_Q
        501            1           1           0           0
        588            1           1           0           0
        402            1           0           1           0
        1193           0           0           0           1
        686            1           0           0           1
        

        这里有更多关于功能引擎的细节:

        https://www.trainindata.com/feature-engine

        https://github.com/feature-engine/feature_engine

        https://feature-engine.readthedocs.io/en/latest/

        【讨论】:

        • 您的 tmp 变量未声明!
        【解决方案5】:

        OneHotEncoder 现在有一个方法get_feature_names。您可以使用input_features=data.columns 来匹配训练数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-05
          • 2014-09-20
          • 2017-06-03
          • 2017-11-21
          • 2019-09-04
          • 2016-08-06
          • 1970-01-01
          • 2020-03-26
          相关资源
          最近更新 更多