使用 scikit learn 进行标签编码时如何保持自然顺序
Posted
技术标签:
【中文标题】使用 scikit learn 进行标签编码时如何保持自然顺序【英文标题】:how to maintain natural order when label encoding with scikit learn 【发布时间】:2020-03-22 17:12:48 【问题描述】:我正在尝试使用 scikit-learn 模块为决策树分类器拟合模型。我有 5 个特征,其中之一是分类的,而不是数字的
from sklearn.tree import DecisionTreeClassifier
from sklearn.preprocessing import LabelEncoder
df = pd.read_csv()
labelEncoders =
for column in df.dtypes[df.dtypes == 'object'].index:
labelEncoders[column] = LabelEncoder()
df[column] = labelEncoders[column].fit_transform(df[column])
print(labelEncoders[column].inverse_transform([0, 1, 2])) #['High', 'Low', 'Normal']
我是 ML 新手,我一直在阅读有关在将数据帧提供给模型之前对分类特征进行编码的必要性,以及如何存在编码变体,如 标签编码 和 一种热编码。
现在,根据大多数文献,标签编码应该或可以在特征值可以自然排序时使用,例如,'Low'、'Normal'、'High';否则应该使用一种热编码,这样模型就不会在没有语义上有意义的值之间建立误导性的顺序关系,例如,'Brazil', 'Congo', 'Czech Republic'。
所以,这就是我选择编码策略背后的逻辑所在,这就是我问这个的原因:
我怎样才能让 scikit-learn 的 LabelEncoder
保持值的自然顺序,我怎样才能让它像这样编码:
Low -> 0
Normal -> 1
High -> 2
而不是现在的方式:
High -> 0
Low -> 1
Normal -> 2
这可以做到吗?它实际上是编码器的任务吗?在编码之前我必须在其他地方做吗?
谢谢
【问题讨论】:
“误导”关系不会损害分类器。分类器将学习这些关系,而不关心它是否是“你的正确顺序”......根本不需要调整它 @PV8 OP 的声明由scikit-learn
文档支持,请参阅此处的“5.3.4. 编码分类特征”:scikit-learn.org/stable/modules/…
对于决策树分类器,这是无效的......如果我们谈论回归,我同意,但不是决策树
【参考方案1】:
您可以使用pandas' replace function pandas.DataFrame.replace()
显式传入您要使用的编码。举个例子:
import pandas as pd
df = pd.DataFrame(data=
"ID": [1, 2, 3, 4, 5],
"Label": ["Low", "High", "Low", "High", "Normal"],
)
print("Original:")
print(df)
label_mapping = "Low": 0, "Normal": 1, "High": 2
df = df.replace("Label": label_mapping)
print("Mapped:")
print(df)
输出:
Original:
ID Label
0 1 Low
1 2 High
2 3 Low
3 4 High
4 5 Normal
Mapped:
ID Label
0 1 0
1 2 2
2 3 0
3 4 2
4 5 1
【讨论】:
只是为了理解,您的建议是我不使用LabelEncoder
对它们进行编码,而只是手动进行?我的意思是,如果它有效,我可以接受,但是,LabelEncoder
有什么用呢?什么时候可以使用它?
是的,这就是我的建议。在序号标签的情况下,您必须以某种方式提供映射,否则编码器如何知道low < normal < high
?您可以随时使用LabelEncoder
尝试一次,使用DataFrame.replace()
尝试一次,看看您的结果有何不同。 LabelEncoder
只是另一个可以选择使用或不使用的工具。以上是关于使用 scikit learn 进行标签编码时如何保持自然顺序的主要内容,如果未能解决你的问题,请参考以下文章
SciKit-Learn 标签编码器导致错误“参数必须是字符串或数字”
如何在 scikit-learn 中有效地编码数字目标变量?