OneHotEncoder - 只对部分分类变量列进行编码

11
假设我有一个带有以下列名的Pandas数据框:'age'(例如33、26、51等)、'seniority'(例如'junior'、'senior'等)、'gender'(例如'male'、'female')和'salary'(例如32000、40000、64000等)。我想将'seniority'分类变量转换为One-Hot编码的值。因此,我正在执行以下操作:
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])

from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(categorical_features=[1])
data = one_hot_encoder.fit_transform(data.values)

但是我遇到了这个错误

ValueError: could not convert string to float: 'gender'

在行上

data = one_hot_encoder.fit_transform(data.values)

然而,我已明确指定 categorical_features=[1] ,因此仅应考虑该热编码的第一列(seniority)。

除了删除“gender”列之外,我怎样才能解决这个错误?

过去我使用过 pandas.get_dummies ,并没有这个问题。

1个回答

12

我认为对于这种情况,你应该坚持使用pd.get_dummies

>>> data
   age seniority  gender  salary
0    1    junior    male       5
1    2    senior  female       6
2    3    junior  female       7

# One hot encode with get_dummies
data = pd.concat((data,pd.get_dummies(data.seniority)),1)

>>> data
   age seniority  gender  salary  junior  senior
0    1    junior    male       5       1       0
1    2    senior  female       6       0       1
2    3    junior  female       7       1       0

问题在于sklearnOneHotEncoder需要将输入作为整数数组。但是在data.values数组中,您仍然具有gender的字符串表示。如果您愿意,可以只对资深度值进行独热编码,但如果您想要知道这些特征的含义,这并不是很好。您必须手动传递列名称(在许多情况下不可行):

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])

from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
data[['junior','senior']] = one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1))

>>> data
   age  seniority  gender  salary  junior  senior
0    1          0    male       5     1.0     0.0
1    2          1  female       6     0.0     1.0
2    3          0  female       7     1.0     0.0

或者,如果功能名称不重要:

from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
data['seniority'] = label_encoder.fit_transform(data['seniority'])

from sklearn.preprocessing import OneHotEncoder
one_hot_encoder = OneHotEncoder(sparse=False)
data = pd.concat((data,pd.DataFrame(one_hot_encoder.fit_transform(data['seniority'].values.reshape(-1,1)))),1)

   age  seniority  gender  salary    0    1
0    1          0    male       5  1.0  0.0
1    2          1  female       6  0.0  1.0
2    3          0  female       7  1.0  0.0

但最终,pd.get_dummies以一种更加优美的方式完成了工作(依我之见)


2
谢谢你的回答(点赞)。我会等一段时间看看是否有更好的答案,如果没有,我会选择你的作为正确答案。 - Outcast
OneHotEncoder 不再要求输入为整数。请参见此处:https://scikit-learn.org/stable/modules/preprocessing.html#encoding-categorical-features - Pablo
为使此代码正常工作,我必须使用方括号而非圆括号:data = pd.concat([data,pd.get_dummies(data.seniority)],1) - krock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接