如何防止LabelEncoder对标签值排序?

2024-09-29 19:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

Scikit LabelEncoder在我的Jupyter笔记本中显示了一些令人费解的行为,如:

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

如果相关的话,我将使用ipython7.7.0、numpy1.17.3和sciketlearn版本0.21.3


Tags: transform笔记本jupyterscikitthisonefitprint
1条回答
网友
1楼 · 发布于 2024-09-29 19:22:20

问题是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']

相关问题 更多 >

    热门问题