首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python :如何在OneHotEncoder之后获得功能名称?

Python :如何在OneHotEncoder之后获得功能名称?
EN

Stack Overflow用户
提问于 2018-03-22 16:10:42
回答 5查看 12.5K关注 0票数 3

我希望在数据集被SKLearn OneHotEncoder转换后获得它的特性名。

OneHotEncoder中的属性中,可以很好地解释n_values_feature_indices_active_features_属性是如何在transform()执行后填充的。

我的问题是:

例如,基于DataFrame的输入数据:

代码语言:javascript
复制
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

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

背景:我希望看到一些算法的特征重要性,以获得对所使用的算法影响最大的特征。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-03-22 16:32:34

您可以使用pd.get_dummies()

代码语言:javascript
复制
pd.get_dummies(data["a"],prefix="a")

会给你:

代码语言:javascript
复制
    a_0 a_1 a_2
0   1   0   0
1   0   1   0
2   0   0   1
3   1   0   0

它可以自动生成列名。您可以将其应用于所有列,然后获取列名。不需要把它们转换成一个numpy矩阵。

因此,在以下方面:

代码语言:javascript
复制
df = pd.DataFrame({"a": [0, 1, 2,0], "b": [0,1,4, 5], "c":[0,1,4, 5]})
data = df.as_matrix()

解决方案如下:

代码语言:javascript
复制
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')
票数 4
EN

Stack Overflow用户

发布于 2018-03-22 16:37:43

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

例如:

代码语言:javascript
复制
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中的第一列相对应的特性,如下所示:

代码语言:javascript
复制
print(ohe_fitted[:,0:3])

拼接数据中的每一列都表示第一个特性中的值。第一列为0,第二列为1,第三列为2。

代码语言:javascript
复制
  a_0 a_1 a_2
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]
 [ 1.  0.  0.]]

注意,在对功能进行编码之前,首先对它们进行排序。

票数 3
EN

Stack Overflow用户

发布于 2019-07-10 13:07:55

您可以使用开放源码包特性-引擎来实现这一点:

代码语言:javascript
复制
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()

您应该看到这个输出返回:

代码语言:javascript
复制
   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://feature-engine.readthedocs.io/en/latest/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49433462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档