【问题标题】:How to prevent LabelEncoder from sorting label values?如何防止 LabelEncoder 对标签值进行排序?
【发布时间】:2019-11-17 18:09:15
【问题描述】:

Scikit LabelEncoder 在我的 Jupyter Notebook 中显示出一些令人费解的行为,如下所示:

from sklearn.preprocessing import LabelEncoder
le2 = LabelEncoder()
le2.fit(['zero', 'one'])
print (le2.inverse_transform([0, 0, 0, 1, 1, 1]))

打印['one' 'one' 'one' 'zero' 'zero' 'zero']。 这很奇怪,它不应该打印['zero' 'zero' 'zero' 'one' 'one' 'one']吗?然后我尝试了

le3 = LabelEncoder()
le3.fit(['one', 'zero'])
print (le3.inverse_transform([0, 0, 0, 1, 1, 1]))

也打印['one' 'one' 'one' 'zero' 'zero' 'zero']。也许发生了字母排序的事情?接下来,我尝试了

le4 = LabelEncoder()
le4.fit(['nil', 'one'])
print (le4.inverse_transform([0, 0, 0, 1, 1, 1]))

打印['nil' 'nil' 'nil' 'one' 'one' 'one']!

我已经为此花费了几个小时。 FWIW,the documentation 中的示例按预期工作,所以我怀疑我期望 inverse_transform 工作的方式存在缺陷。我的部分研究包括thisthis

如果相关,我使用的是 iPython 7.7.0、numpy 1.17.3 和 scikit-learn 版本 0.21.3。

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    问题是 LabelEncoder.fit() 总是返回排序后的数据。那是因为它使用了np.unique这里是源code

    我猜想做你想做的唯一方法是创建你自己的 fit 方法并覆盖来自 LabelEncoder 的原始方法。

    您只需要重用链接中给出的现有代码,示例如下:

    import pandas as pd
    from sklearn.preprocessing import LabelEncoder
    from sklearn.utils import column_or_1d
    
    class MyLabelEncoder(LabelEncoder):
    
        def fit(self, y):
            y = column_or_1d(y, warn=True)
            self.classes_ = pd.Series(y).unique()
            return self
    
    le2 = MyLabelEncoder()
    le2.fit(['zero', 'one'])
    print (le2.inverse_transform([0, 0, 0, 1, 1, 1]))
    

    给你:

    ['zero' 'zero' 'zero' 'one' 'one' 'one']
    

    【讨论】:

    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 2015-05-22
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多