使用 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”有啥区别?