0

我正在尝试使用 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 新手,我一直在阅读有关在将数据帧提供给模型之前对分类特征进行编码的必要性,以及如何存在编码变体,如标签编码一种热编码

现在,根据大多数文献,当特征的值可以自然排序时,应该或可以使用标签编码,例如“低”、“正常”、“高”;否则应该使用一种热编码,这样当没有语义上有意义的值时,模型不会在值之间建立误导性的顺序关系,例如'Brazil', 'Congo', 'Czech Republic'

所以,这就是我选择编码策略背后的逻辑所在,这就是我问这个的原因:

我怎样才能让 scikit-learnLabelEncoder保持值的自然顺序,我怎样才能让它像这样编码:

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

而不是它现在的方式:

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

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

谢谢

4

1 回答 1

1

您可以使用pandas 的 replace 函数 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
于 2019-11-27T08:16:48.467 回答