使用 scikit 学习标签编码时如何保持自然顺序
how to maintain natural order when label encoding with scikit learn
我正在尝试使用 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[=34 等编码变体=]和一个热编码。
现在,根据大多数文献,当特征值可以自然排序时,应该或可以使用标签编码,例如,'Low'、'Normal'、 'High';否则,应该使用一种热编码,这样当 none 在语义上有意义时,模型不会在值之间建立误导性的顺序关系,例如 'Brazil','Congo', 'Czech Republic'.
所以,这就是我选择编码策略背后的逻辑所在,这就是我问这个问题的原因:
如何让 scikit-learn 的 LabelEncoder
保持值的自然顺序,如何让它像这样编码:
Low -> 0
Normal -> 1
High -> 2
而不是现在的方式:
High -> 0
Low -> 1
Normal -> 2
这完全可以做到吗?它实际上是编码器的任务吗?我必须在编码之前在其他地方做吗?
谢谢
您可以使用 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
我正在尝试使用 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[=34 等编码变体=]和一个热编码。
现在,根据大多数文献,当特征值可以自然排序时,应该或可以使用标签编码,例如,'Low'、'Normal'、 'High';否则,应该使用一种热编码,这样当 none 在语义上有意义时,模型不会在值之间建立误导性的顺序关系,例如 'Brazil','Congo', 'Czech Republic'.
所以,这就是我选择编码策略背后的逻辑所在,这就是我问这个问题的原因:
如何让 scikit-learn 的 LabelEncoder
保持值的自然顺序,如何让它像这样编码:
Low -> 0
Normal -> 1
High -> 2
而不是现在的方式:
High -> 0
Low -> 1
Normal -> 2
这完全可以做到吗?它实际上是编码器的任务吗?我必须在编码之前在其他地方做吗?
谢谢
您可以使用 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