我们是否应该在具有 2 作为每列中分类特征的最大数字表示的数据中使用一个热编码器类?

数据挖掘 机器学习 Python 分类数据
2022-03-02 08:00:51

我正在Play Golf使用决策树分类器测试数据集:

在此处输入图像描述

我将数据拆分为 Outlook、Temp、Humidity 和 windy 作为特征和Play Golf目标特征。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset
dataset = pd.read_excel('data.xlsx')
X = dataset.iloc[:, 0:4]
y = dataset.iloc[:, 4]

要测试DecisionTreeClassifier我需要将分类数据转换为数字:

from sklearn.preprocessing import LabelEncoder
lb = LabelEncoder()

X['Outlook'] = lb.fit_transform(X['Outlook'])
X['Temp'] = lb.fit_transform(X['Temp'])
X['Humidity'] = lb.fit_transform(X['Humidity'])
X['Windy'] = lb.fit_transform(X['Windy'])
y = lb.fit_transform(y)

结果是:

ix  Otk T   H   W
0   1   1   0   0
1   1   1   0   1
2   0   1   0   0
3   2   2   0   0
4   2   0   1   0
5   2   0   1   1
6   0   0   1   1
7   1   2   0   0
8   1   0   1   0
9   2   2   1   0
10  1   2   1   1
11  0   2   0   1
12  0   1   1   0
13  2   2   0   1

之后我应该使用OneHotEncoder()课程吗?或者2这样做不是很大吗?

2个回答

one-hot encoding 的目的是对分类标签进行二值化,这样您的模型就不会学习虚假的序数关系。

例如,如果您有类别RedYellow、 ,则编码为 0、1和2Blue会很糟糕,因为您的模型可能会意外地“学习”到 Red < Yellow < Blue。在这种情况下,您应该使用 one-hot 编码。RedYellowBlue

但是对于某些分类特征,序数编码是有意义的。例如,您的数据集具有“温度”特征,可以是CoolMildHot在这种情况下,Cool < Mild < Hot 的关系在语义上是有意义的,所以如果你愿意的话,你可以不用序数编码。

但是,您仍然必须确保在您的编码中保留序数关系,而 scikit-learnLabelEncoder不会为您处理这个问题。为了说明,看看“温度”是如何被编码的:

  • Hot=> 1
  • Mild=> 2
  • Cool=> 0

那可不好!你想Hot拥有最高的价值。相反,您应该使用 scikitOrdinalEncoder并明确告诉它如何排序类别:

from sklearn.preprocessing import LabelEncoder, OrdinalEncoder

outlook_encoder = OrdinalEncoder(categories=['Rainy', 'Overcast', 'Sunny'])
X['Outlook'] = outlook_encoder.fit_transform(X['Outlook'])

temp_encoder = OrdinalEncoder(categories=['Cool', 'Mild', 'Hot'])
X['Temp'] = temp_encoder.fit_transform(X['Temp'])

# humidity and wind are binary features, so we don't need the ordinal encoder

humidity_encoder = LabelEncoder()
X['Humidity'] = humidity_encoder.fit_transform(X['Humidity'])

windy_encoder = LabelEncoder()
X['Windy'] = windy_encoder.fit_transform(X['Windy'])


尽管在您的大多数分类特征中确实存在序数关系,但您仍然应该随意使用 one-hot 编码。当您处理分类特征时,这始终是一个安全的选择。

由于您的数据集很小,您应该对两者都进行试验,看看哪个效果最好!

直接回答问题:

之后我应该使用 OneHotEncoder() 类吗?

不。之后LabelEncoder你不需要再做OneHotEncoder一次。我不知道你的意思是:

或者2不是那么大吗?

但是我建议你不要这样做LabelEncoder想一想你编码的内容。基本上,您按特定顺序将数值分配给类别。例如,对于 Outlook 变量,您执行 Rainy: 1、Overcast:0 和 Sunny:2。通过这种方式,您暗示模型要学习:

2 (Sunny) is greater than 1 (Rainy)

事实并非如此,而且显然是错误的!

这里实际上OneHotEncoder会是一个更好的选择。我有根据的猜测是,您应该能够看到经过训练的模型会表现得更好OneHotEncoder(也许不是!:D)。如果 Order 很重要或有意义,例如在 Humadity 变量的情况下,OrdinalEncoder也可以使用。

我进一步建议阅读更多关于分类编码的内容。有很多文章、博客文章,比如这个,或者这个,或者这个基准,还有很多其他的。这仅仅是开始。;-)