Scikit learn 使用scikit学习标签编码时如何保持自然秩序
我正试图用scikit学习模块为决策树分类器建立一个模型。我有5个特征,其中一个是分类的,不是数字的Scikit learn 使用scikit学习标签编码时如何保持自然秩序,scikit-learn,classification,decision-tree,one-hot-encoding,label-encoding,Scikit Learn,Classification,Decision Tree,One Hot Encoding,Label Encoding,我正试图用scikit学习模块为决策树分类器建立一个模型。我有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: labelEn
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新手,我一直在阅读关于在将数据帧提供给模型之前对分类特征进行编码的需要,以及如何存在编码变体,如标签编码和一种热编码
现在,根据大多数文献,当特征值可以自然排序时,应该或可以使用标签编码,例如,“低”、“正常”、“高”;否则,应该使用一种热编码,这样当没有语义上有意义的值时,模型不会在值之间建立误导性的顺序关系,例如,“巴西”、“刚果”、“捷克共和国”
这就是我选择编码策略背后的逻辑所在,这就是为什么我要问这个问题:
如何使scikit learn的LabelEncoder
保持值的自然顺序,如何使其编码如下:
Low -> 0
Normal -> 1
High -> 2
而不是现在的做法:
High -> 0
Low -> 1
Normal -> 2
这能做到吗?这实际上是编码器的任务吗?我必须在编码之前在其他地方做吗
谢谢您可以使用pandas.DataFrame.replace()
显式传递您想要使用的编码。例如:
将熊猫作为pd导入
df=pd.DataFrame(数据帧={
“ID”:[1,2,3,4,5],
“标签”:[“低”、“高”、“低”、“高”、“正常”],
})
打印(“原件:”)
打印(df)
标签_映射={“低”:0,“正常”:1,“高”:2}
df=df.replace({“Label”:Label_mapping})
打印(“映射:”)
打印(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
“误导”关系不会损害分类器。分类器将学习这些关系,而不在乎它是否是“您的正确顺序”…根本不需要调整it@PV8OP的声明得到了scikit学习文档的支持,请参见此处的“5.3.4.编码分类特征”:对于决策树分类器,这是无效的……如果我们谈论回归,我同意,但不是使用决策树。我要理解的是,您的建议是,我不使用
LabelEncoder
对它们进行编码,而只是手动进行编码?我的意思是,如果它能工作,我可以接受,但是,LabelEncoder
有什么用呢?什么时候可以使用它?是的,这就是我的建议。在顺序标签的情况下,您必须提供映射,否则编码器如何知道low
?您可以使用LabelEncoder
尝试一次,也可以使用DataFrame.replace()
尝试一次,然后查看结果的差异LabelEncoder
只是另一个可以选择使用或不使用的工具。