使用scikit进行标签编码时如何保持自然顺序

时间:2019-11-27 07:38:17

标签: scikit-learn classification decision-tree one-hot-encoding label-encoding

我正在尝试使用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的新手,并且我一直在阅读有关在将数据帧输入模型之前对分类特征进行编码的需求,以及如何使用 label encoding 一种热编码

现在,根据大多数文献,当要素的值可以自然排序时,应该或可以使用标签编码,例如,“低”,“普通”,“高” ;否则,应该使用一种热编码,这样当没有值在语义上有意义时,例如“巴西”,“刚果”,“捷克共和国” < / strong>。

所以,这就是我选择编码策略背后的逻辑所在,这就是为什么我问这个问题:

如何使scikit-learn的LabelEncoder保持值的自然顺序,如何使它像这样编码:

Low -> 0
Normal -> 1
High -> 2

而不是现在的方式:

High -> 0
Low -> 1
Normal -> 2

可以完全做到吗?它实际上是编码器的任务吗?在编码之前,我是否必须在其他地方做?

谢谢

1 个答案:

答案 0 :(得分: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