提问者:小点点

使用scikit学习标签编码时如何保持自然秩序


我正试图用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:
    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

这能做到吗?这实际上是编码器的任务吗?我必须在编码之前在其他地方做吗?

谢谢


共1个答案

匿名用户

您可以使用熊猫的替换功能pandas。数据帧。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