在 Ordinal Encoder 中指定编码顺序
Posted
技术标签:
【中文标题】在 Ordinal Encoder 中指定编码顺序【英文标题】:Specifying the order of encoding in Ordinal Encoder 【发布时间】:2019-04-17 02:59:29 【问题描述】:我正在使用 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_)
导致:[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)
结果是这个错误:
Traceback(最近一次调用最后一次):
文件“”,第 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 == '错误':
AttributeError: 'OrdinalEncoder' 对象没有属性 'handle_unknown'
【问题讨论】:
你从哪一行得到这个错误? ->'OrdinalEncoder' object has no attribute 'handle_unknown'.
来自 ordEnc.fit(dataframe)
【参考方案1】:
我遇到了同样的问题。这是 scikit-learn 中的错误,已修复并添加到版本 0.20.1,但仍未发布。 https://github.com/scikit-learn/scikit-learn/issues/12365
我通过将固定的_encoders.py
复制到我的项目并使用来暂时解决它。
from _encoders import OrdinalEncoder
【讨论】:
谢谢你的回答托马斯,至少我知道这不是我的错!但是在我的文件夹中复制 _encoders.py 不起作用:ImportError:尝试使用没有已知父包的相对导入以上是关于在 Ordinal Encoder 中指定编码顺序的主要内容,如果未能解决你的问题,请参考以下文章