首页 > 解决方案 > 使用 sklearn columntransfromer 时解包错误

问题描述

我试图对一个数据帧进行热编码以进行一些测试。

我尝试使用常规OneHotEncoderfromsklearn但它似乎有一些NaN值问题(NaN我想编码的列上不存在的值)

根据我的搜索,一种解决方案是使用列转换器,它可以仅将编码应用于某些列,如下所示

ct = ColumnTransformer([(OneHotEncoder(categories = categories_list),['col1','col2','col3'])])

其中categories_list是所有当前类别的列表。

问题是当我尝试将此转换器应用于我的数据帧时,我总是会not enough values to unpack出错。

我这样变身

ct.fit_transform(df_train_xgboost)

关于我应该怎么做的任何想法?

编辑:

一些示例数据

id | col1 | col2 | col3 | price | has_something
1    blue   car    new    23781       NaN
2    green  truck  used   24512       1
3    red    van    new    44521       0

更多代码

categories_list = ['blue','green','red','car','truck','van','new','used']
df_train_xgboost = df_train
df_train_xgboost = df_train_xgboost.drop(columns_I_dont_want, axis=1)
df_train_xgboost = df_train_xgboost.fillna(value = {'col1': 0, 'col2': 0, 'col3': 0})

ct = ColumnTransformer([(OneHotEncoder(categories = categories_list),['col1','col2','col3'])])

print(df_train_xgboost.shape)
ct.fit_transform(df_train_xgboost)

标签: pythonpython-3.xmachine-learningscikit-learnsklearn-pandas

解决方案


首先,使用ColumnTransformer没有必要的。

  1. 要使您的代码正常工作,您还需要一个输入参数,即转换器的“名称”。

    完整示例:

df
    col1   col2  col3
0   blue    car   new
1  green  truck  used
2    red    van   new

ct = ColumnTransformer([("onehot",OneHotEncoder(),[0,1,2])])

ct.fit_transform(df.values)
array([[1., 0., 0., 1., 0., 0., 1., 0.],
       [0., 1., 0., 0., 1., 0., 0., 1.],
       [0., 0., 1., 0., 0., 1., 1., 0.]])

  1. 现在请注意,您仅使用以下命令即可获得相同的输出OneHotEncoder
o = OneHotEncoder()
o.fit_transform(df).toarray()

array([[1., 0., 0., 1., 0., 0., 1., 0.],
       [0., 1., 0., 0., 1., 0., 0., 1.],
       [0., 0., 1., 0., 0., 1., 1., 0.]])

推荐阅读