在 Ordinal Encoder 中指定编码顺序

Ale*_*rti 10 python-3.x scikit-learn categorical-data

我正在使用 OrdinalEncoder,但找不到如何指定编码顺序。我的意思是我有像“坏”、“一般”、“好”这样的类别,它们自然有顺序。但我想指定该顺序,因为编码器本身无法知道类别的含义。实际上,对于categories='auto',某些类别相对于其他类别的编码方向错误,我不希望这样,因为我知道,至少对于其中一些类别,相关性是正的还是负的。

但是在拟合过程中指定类别会导致错误:

“OrdinalEncoder”对象没有“handle_unknown”属性。

如果我不指定类别,拟合过程会顺利进行,我不明白为什么(拟合后属性“categories_”显示我尝试指定它们时手动输入的相同类别)。

我将类别指定为列表列表。这里没有指定类别会发生什么。

import pandas as pd
from sklearn.preprocessing import OrdinalEncoder

df = pd.DataFrame(np.array([['a','a','a'], ['b','c','c']]).transpose())
oE = OrdinalEncoder(categories='auto')
oE.fit(df)

print(oE.categories_)
Run Code Online (Sandbox Code Playgroud)

导致: [array(['a'], dtype=object), array(['b', 'c'], dtype=object)]

明确指定类别:

df = pd.DataFrame(np.array([['a','a','a'], ['b','c','c']]).transpose())
oE = OrdinalEncoder(categories=[['a'], ['b', 'c']])
oE.fit(df)
Run Code Online (Sandbox Code Playgroud)

结果是这个错误:

回溯(最近一次调用最后一次):

文件“”,第 3 行,oE.fit(df)

文件“/home/alessio/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py”,第774行,适合self._fit(X)

文件“/home/alessio/anaconda3/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py”,第 85 行,在 _fit 如果 self.handle_unknown == 'error':

AttributeError: 'OrdinalEncoder' 对象没有属性 'handle_unknown'

小智 1

我有同样的问题。这是 scikit-learn 中的错误,已修复并添加到版本 0.20.1,但尚未发布。 https://github.com/scikit-learn/scikit-learn/issues/12365

我通过将修复复制_encoders.py到我的项目并使用来暂时解决了这个问题。

from _encoders import OrdinalEncoder
Run Code Online (Sandbox Code Playgroud)