Python SKLearn:如何在OneHotEncoder之后获取功能名称?

时间:2018-03-22 16:10:43

标签: python machine-learning scikit-learn

我希望在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()

代码如何从原始功能名称abc获取到已转换功能名称的列表 (例如:

a-0a-1a-2b-0b-1b-2b-3c-0c-1c-2c-3

a-0a-1a-2b-0b-1b-2b-3b-4b-5b-6b-7b-8

或任何有助于查看编码列到原始列的分配的内容。)

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

5 个答案:

答案 0 :(得分:2)

您可以使用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')

答案 1 :(得分:0)

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

e.g。

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.]]

请注意,功能在编码之前会先排序。

答案 2 :(得分:0)

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

Package sksurv有一个OneHotEncoder,它将为您返回带有所有列名称的pandas数据框。一探究竟。确保设置一个可以与编码器一起播放的环境,以确保它不会破坏当前的环境。这种编码器节省了我很多时间和精力。

scikit-suvival GitHub

OneHotEncoder Documentation

答案 3 :(得分:0)

您可以使用开源软件包feature-engine来做到这一点:

import pandas as pd
from sklearn.model_selection import train_test_split
from feature_engine.categorical_encoders import OneHotCategoricalEncoder

# 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 = OneHotCategoricalEncoder(
    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)

tmp.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/solegalli/feature_engine

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

答案 4 :(得分:0)

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