使用 sklearn columntransfromer 时解包错误

Posted

技术标签:

【中文标题】使用 sklearn columntransfromer 时解包错误【英文标题】:Unpack error while using sklearn columntransfromer 【发布时间】:2020-03-21 21:42:36 【问题描述】:

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

我尝试使用来自sklearn 的常规OneHotEncoder,但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)

【问题讨论】:

【参考方案1】:

首先,ColumnTransformer 的使用不是必要的。

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

    完整示例:

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.]])

    现在请注意,仅使用 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.]])

【讨论】:

感谢您的回答!,我一开始就尝试使用第二种解决方案,但是在我的数据框中有NaNs 使它不起作用,这就是我尝试使用变压器的原因。第一个解决方案似乎最适合我的情况,但我在fit_transform 阶段不断收到argument must be string or number 此错误意味着您的数据框包含不是字符串或数字的内容。是否要包含 NaN? 是的,如果可能的话,主要是因为 NaN 非常分散,所以删除包含它们的行不是一种选择。 然后使用 df.fillna(0) 将 NaN 填充为 0 或其他值

以上是关于使用 sklearn columntransfromer 时解包错误的主要内容,如果未能解决你的问题,请参考以下文章

当我应该使用其中之一时,“sklearn.cluster.k_means”和“sklearn.cluster.KMeans”有啥区别?

sklearn.svm在建立好模型后怎么使用

sklearn使用小贴士

sklearn.svm在建立好模型后怎么使用

Sklearn:使用 CalibratedClassifierCV 校准多标签分类

sklearn:在 RandomizedSearchCV 中使用管道?