机器学习中的类别型数据



什么是类别型数据?

机器学习中的类别型数据指的是由类别或标签组成的数据,而不是数值数据。这些类别可能是名义上的,这意味着它们之间没有固有的顺序或等级(例如,颜色、性别),也可能是顺序的,这意味着类别之间存在自然顺序(例如,教育水平、收入等级)。

类别型数据通常使用离散值表示,例如整数或字符串,并且在用作机器学习模型的输入之前,通常会编码为独热向量。独热编码涉及为每个类别创建一个二进制向量,其中向量在对应于该类别的位置上为1,在所有其他位置上为0。

处理类别型数据的技巧

处理类别型数据是机器学习预处理的重要组成部分,因为许多算法都需要数值输入。根据算法和类别型数据的性质,可以使用不同的编码技术,例如标签编码、序数编码或二进制编码等。

在本章的后续部分,我们将讨论以下处理机器学习中类别型数据的不同技术,以及它们在Python中的实现。

让我们了解上面提到的每种处理机器学习中类别型数据的技术。

1. 独热编码

独热编码是处理机器学习中类别型数据的一种常用技术。它涉及为每个类别创建一个二进制向量,其中向量的每个元素表示该类别的存在或不存在。例如,如果我们有一个表示颜色的类别变量,其值为红色、蓝色和绿色,则独热编码将分别创建三个二进制向量:[1, 0, 0]、[0, 1, 0] 和 [0, 0, 1]。

示例

下面是使用Pandas库在Python中执行独热编码的示例:

import pandas as pd

# Creating a sample dataset with a categorical variable
data = {'color': ['red', 'green', 'blue', 'red', 'green']}
df = pd.DataFrame(data)

# Performing one-hot encoding
one_hot_encoded = pd.get_dummies(df['color'], prefix='color')

# Combining the encoded data with the original data
df = pd.concat([df, one_hot_encoded], axis=1)

# Drop the original categorical variable
df = df.drop('color', axis=1)

# Print the encoded data
print(df)

输出

这将创建一个具有三个二进制变量(“color_blue”、“color_green”和“color_red”)的独热编码数据框,如果存在相应的颜色,则这些变量取值为1,否则取值为0。此编码数据(下面给出的输出)可用于机器学习任务,例如分类和回归。

      color_blue    color_green    color_red
0        0              0              1
1        0              1              0
2        1              0              0
3        0              0              1
4        0              1              0

独热编码技术适用于小型且有限的类别变量,但对于大型类别变量可能会存在问题,因为它会导致大量的输入特征。

2. 标签编码

标签编码是处理机器学习中类别型数据的另一种技术。它涉及为类别变量中的每个类别分配一个唯一的数值,数值的顺序基于类别的顺序。

例如,假设我们有一个名为“Size”的类别变量,它有三个类别:“small”、“medium”和“large”。使用标签编码,我们将分别为这些类别分配值0、1和2。

示例

下面是使用scikit-learn库在Python中执行标签编码的示例:

from sklearn.preprocessing import LabelEncoder

# create a sample dataset with a categorical variable
data = ['small', 'medium', 'large', 'small', 'large']

# create a label encoder object
label_encoder = LabelEncoder()

# fit and transform the data using the label encoder
encoded_data = label_encoder.fit_transform(data)

# print the encoded data
print(encoded_data)

这将创建一个编码数组,其值为[0, 1, 2, 0, 2],分别对应于编码类别“small”、“medium”和“large”。请注意,默认情况下,编码基于类别的字母顺序,但可以通过传递自定义列表到LabelEncoder对象来更改顺序。

输出

[2 1 0 2 0]

当类别之间存在自然顺序时,例如序数类别变量,标签编码很有用。但是,对于名义类别变量,应谨慎使用它,因为数值可能会暗示实际上不存在的顺序。在这些情况下,独热编码是更安全的选择。

3. 频率编码

频率编码是处理机器学习中类别型数据的另一种技术。它涉及用类别在数据集中出现的频率(或计数)替换类别变量中的每个类别。频率编码背后的思想是,更频繁出现的类别可能对机器学习算法更重要或更有信息量。

示例

下面是使用Python执行频率编码的示例:

import pandas as pd

# create a sample dataset with a categorical variable
data = {'color': ['red', 'green', 'blue', 'red', 'green']}
df = pd.DataFrame(data)

# calculate the frequency of each category in the categorical variable
freq = df['color'].value_counts(normalize=True)

# replace each category with its frequency
df['color_freq'] = df['color'].map(freq)

# drop the original categorical variable
df = df.drop('color', axis=1)

# print the encoded data
print(df)

这将创建一个编码数据框,其中包含一个变量(“color_freq”),表示原始类别变量中每个类别的频率。例如,如果原始变量有两个“red”和三个“green”,则相应的频率将分别为0.4和0.6。

输出

      color_freq
0        0.4
1        0.4
2        0.2
3        0.4
4        0.4

频率编码可能是独热编码或标签编码的有用替代方案,尤其是在处理高基数类别变量(即具有大量类别的变量)时。但是,它可能并不总是有效,其性能可能取决于所使用的数据集和机器学习算法。

4. 目标编码

目标编码是处理机器学习中类别型数据的另一种技术。它涉及用该类别的目标变量(即您想要预测的变量)的平均值(或其他聚合)替换类别变量中的每个类别。目标编码背后的思想是,它可以捕获类别变量和目标变量之间的关系,从而提高机器学习模型的预测性能。

示例

下面是使用Scikit-learn库在Python中执行目标编码的示例,通过结合标签编码器和平均编码器:

import pandas as pd
from sklearn.preprocessing import LabelEncoder

# create a sample dataset with a categorical variable and a target variable
data = {'color': ['red', 'green', 'blue', 'red', 'green'],
   'target': [1, 0, 1, 0, 1]}
df = pd.DataFrame(data)

# create a label encoder object and fit it to the data
label_encoder = LabelEncoder()
label_encoder.fit(df['color'])

# transform the categorical variable using the label encoder
df['color_encoded'] = label_encoder.transform(df['color'])

# create a mean encoder object and fit it to the transformed data
mean_encoder = df.groupby('color_encoded')['target'].mean().to_dict()

# map the mean encoded values to the categorical variable
df['color_encoded'] = df['color_encoded'].map(mean_encoder)

# print the encoded data
print(df)

在此示例中,我们首先创建一个Pandas DataFrame df,其中包含一个类别变量'color'和一个目标变量'target'。然后,我们从scikit-learn创建一个LabelEncoder对象,并将其拟合到df的'color'列。

接下来,我们使用标签编码器转换类别变量'color',通过在标签编码器对象上调用transform方法,并将生成的编码值分配给df中的新列'color_encoded'。

最后,我们通过对'color_encoded'列进行分组并计算每个组的'target'列的平均值来创建一个平均编码器对象。然后,我们将此平均编码器对象转换为字典,并将平均编码值映射到df的原始'color'列。

输出

   color     target     color_encoded
0  red        1           0.5
1  green      0           0.5
2  blue       1           1.0
3  red        0           0.5
4  green      1           0.5

目标编码可能是提高机器学习模型预测性能的强大技术,尤其是在具有高基数类别变量的数据集中。但是,重要的是要避免过度拟合,方法是使用交叉验证和正则化技术。

5. 二进制编码

二进制编码是另一种用于在机器学习中对类别变量进行编码的技术。在二进制编码中,每个类别都分配一个二进制代码,其中每个数字表示该类别是否存在(1)或不存在(0)。二进制代码通常基于类别在所有类别排序列表中的位置。

示例

以下是使用category_encoders库在Python中实现二进制编码的示例:

import pandas as pd
import category_encoders as ce

# create a sample dataset with a categorical variable
data = {'color': ['red', 'green', 'blue', 'red', 'green']}
df = pd.DataFrame(data)

# create a binary encoder object and fit it to the data
binary_encoder = ce.BinaryEncoder(cols=['color'])
binary_encoder.fit(df['color'])

# transform the categorical variable using the binary encoder
encoded_data = binary_encoder.transform(df['color'])

# merge the encoded variable with the original dataframe
df = pd.concat([df, encoded_data], axis=1)

# print the encoded data
print(df)

在此示例中,我们首先创建一个Pandas DataFrame df,其中包含一个类别变量'color'。然后,我们从category_encoders库创建一个BinaryEncoder对象,并将其拟合到df的'color'列。

接下来,我们使用二进制编码器转换类别变量'color',通过在二进制编码器对象上调用transform方法,并将生成的编码值分配给新的DataFrame encoded_data

最后,我们使用concat方法沿列轴(axis=1)将编码变量与原始DataFrame df合并。结果DataFrame应包含原始'color'列以及编码的二进制列。

输出

运行代码后,将产生以下输出:

   color    color_0    color_1
0   red       0           1
1   green     1           0
2   blue      1           1
3   red       0           1
4   green     1           0

二进制编码最适合具有中等数量类别的分类变量,因为对于具有大量类别的变量,它可能会很快变得效率低下。

广告