在 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 中指定编码顺序的主要内容,如果未能解决你的问题,请参考以下文章

在Java中指定默认文件编码[重复]

获取魔术线/shebang中指定的编码(来自模块内)

在 JSON API 中指定排序顺序

亚马逊:是不是可以在亚马逊搜索结果的 URL 中指定邮政编码?

架构指令不按架构中指定的 LTR 顺序执行

struts中指定编码(使用Filter后仍然乱码)