Sklearn预处理标签编码器为多列引发错误

时间:2017-11-28 10:58:44

标签: python machine-learning scikit-learn feature-selection text-analysis

我的pandas Data Frame具有以下结构

item_condition_id                     category
brand_name                            category
price                                  float64
shipping                              category
main_category                         category
category                              category
sub_category                          category
hashing_feature_aa                     float64
hashing_feature_ab                     float64

部分数据示例:

brand_name  shipping  main_category        category
Target         1         Women           Tops & Blouses
unknown        1          Home           Home Décor
unknown        0         Women            Jewelry
unknown        0         Women             Other

我已使用下面的代码将分类(字符串)列转换为数字。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
for i in range(len(X)):
    X.iloc[:,i] = le.fit_transform(X.iloc[:,i])

转换后

   brand_name  shipping  main_category  category
        0         1              1         3
        1         1              0         0
        1         0              1         1
        1         0              1         2

这是按预期工作的,但在尝试应用 inverse_transform 从数字类别中获取原始类别时,它会抛出错误。

for i in range(len(X)):
    X.iloc[:,i] = le.inverse_transform(X.iloc[:,i])
  

ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

如何在我的情况下解决此错误,我的代码出了什么问题?

我的目标是使用Label Encoder将分类(字符串)功能转换为数字,以便应用 sklearn.feature_selection.SelectKbest.fit_transform(X,y),无需标签编码,此步骤失败。< / p>

由于

1 个答案:

答案 0 :(得分:1)

根据您的说明:您的问题是覆盖循环中的le实例,以便仅在最后一列上进行训练。根据您的代码,我建议将它们放入dict,例如如下:

from sklearn.preprocessing import LabelEncoder
le = {}
for i in range(len(X)):
    le[i] = LabelEncoder()
    X.iloc[:,i] = le[i].fit_transform(X.iloc[:,i])
# do stuff
for i in range(len(X)):
    X.iloc[:,i] = le[i].inverse_transform(X.iloc[:,i])

但如上所述,请查看this.