OneHotEncoder - 仅编码一些分类变量列
Posted
技术标签:
【中文标题】OneHotEncoder - 仅编码一些分类变量列【英文标题】:OneHotEncoder - encoding only some of categorical variable columns 【发布时间】:2019-02-25 02:24:38 【问题描述】:假设我有一个带有以下列名称的 pandas 数据框:
'age'
(例如 33、26、51 等)
'seniority'
(例如“初级”、“高级”等)
'gender'
(例如“男”、“女”)
'salary'
(例如 32000、40000、64000 等)
我想将seniority
分类变量转换为一个热编码值。出于这个原因,我正在做以下事情:
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]
,因此只有第 1 列 (seniority
) 应考虑用于此热编码。
我该如何解决这个错误(例如删除“性别”列除外)?
我过去使用pandas.get_dummies
,没有遇到这个问题。
【问题讨论】:
【参考方案1】:我认为对于这种情况你应该坚持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
问题是sklearn
的OneHotEncoder
需要有一个整数数组作为输入。但是在数组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
以更好的方式完成了这项工作 (IMO)
【讨论】:
感谢您的回答(点赞)。我会稍等一下,看看是否有更好的答案,如果没有,我会勾选你的正确答案。OneHotEncoder
不再要求输入为整数。见这里:scikit-learn.org/stable/modules/…
为了使它工作,我不得不使用方括号而不是括号: data = pd.concat([data,pd.get_dummies(data.seniority)],1)以上是关于OneHotEncoder - 仅编码一些分类变量列的主要内容,如果未能解决你的问题,请参考以下文章
机器学习编码分类特征编码LabelEncoder与OneHotEncoder
机器学习编码分类特征编码LabelEncoder与OneHotEncoder
机器学习编码分类特征编码LabelEncoder与OneHotEncoder
机器学习编码分类特征编码LabelEncoder与OneHotEncoder