python - OneHotEncoder - 仅编码一些分类变量列

标签 python scikit-learn one-hot-encoding

假设我有一个包含以下列名称的 pandas 数据框:

  • '年龄'(例如 33、26、51 等)
  • '资历'(例如'初级'、'高级'等)
  • “性别”(例如“男”、“女”)
  • '薪水'(例如 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,但没有遇到这个问题。

最佳答案

我认为对于这种情况,您应该坚持使用 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 以更好的方式完成了这项工作 (IMO)

关于python - OneHotEncoder - 仅编码一些分类变量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52430798/

相关文章:

machine-learning - 对非语言概念使用嵌入?

python - get_dummies 分割字符

python - Luigi:如何将不同的参数传递给叶任务?

python - 标准 1 误差的差距统计

Python:从源代码中安装模块

python - 从相似度 numpy.ndarray 中获取 top-K 相关文档

python - 这个 joblib 并行语法是做什么的?这么多括号

python - 向 pandas 数据框插入多列而不是现有的一列

Python:将整数转换为日期时间戳

python - 更改 python 发行版