【问题标题】:Sklearn preprocessing label encoder is throwing error for mutiple columnsSklearn预处理标签编码器对多列抛出错误
【发布时间】:2018-05-11 19:27:12
【问题描述】:

我有以下结构的熊猫数据框

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()

在我的情况下如何解决这个错误,我的代码有什么问题?

我的目标是使用标签编码器将分类(字符串)特征转换为数值,以便应用 sklearn.feature_selection.SelectKbest.fit_transform(X,y),如果没有标签编码,此步骤将失败。

谢谢

【问题讨论】:

  • 如果不准备带有数据的最小示例,则很难重现此问题。只是一个想法:您是否使用相同的 le 实例来调用 fit_transform() 和 inverse_transform()?因为如果您遍历列并且每列适合一个 LabelEncoder() le,则必须使用相同的 le 实例来调用 inverse_transform()(例如,将其存储在 dict 中)
  • 是的,就像@MarcusV。已经指出,在迭代中 LabelEncoder 实例将被覆盖,从而产生问题。如果我们有一个简单的例子就好了。
  • 大家好,添加了一个小例子。是的,我对 fit_transform 和 inverse_transform 都使用了 LabelEncoder() 文件的相同实例。我是否必须为每一列创建单独的 LabelEncoder 实例!?比如 le_brand_name 、le_category 等等。
  • 是的,您必须这样做(例如,将它们存储在字典中)。或查看this 解决此问题的优雅方法。
  • 对于未来,还请查看this 了解良好的最小示例。

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


【解决方案1】:

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

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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2016-01-30
    • 1970-01-01
    • 2020-03-13
    • 2021-12-18
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多