如何在 Python 中将分类特征转换为数值特征?


在机器学习中,数据有多种类型,包括数值数据、分类数据和文本数据。分类特征是指取值有限的一组值的特征,例如颜色、性别或国家。但是,大多数机器学习算法都需要数值特征作为输入,这意味着我们需要在训练模型之前将分类特征转换为数值特征。

在本文中,我们将探讨在 Python 中将分类特征转换为数值特征的各种技术。我们将讨论独热编码、标签编码、二进制编码、计数编码和目标编码,并提供使用 category_encoders 库实现这些技术的示例。在阅读完本文后,您将对如何在机器学习项目中处理分类特征有一个很好的理解。

标签编码

标签编码是一种通过为每个类别分配一个唯一的整数值来将分类数据转换为数值数据的技术。例如,一个名为“颜色”的分类特征,其类别为“红色”、“绿色”和“蓝色”,可以分别分配值 0、1 和 2。

标签编码易于实现且内存效率高,只需要一列来存储编码后的值。但是,它可能无法准确表示类别的固有顺序或排名,并且某些机器学习算法可能会将编码后的值解释为连续变量,从而导致错误的结果。

为了在 Python 中实现标签编码,我们可以使用 scikit-learn 库中的 LabelEncoder 类。以下是一个示例

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
data['color_encoded'] = le.fit_transform(data['color'])

在这段代码中,我们首先创建 LabelEncoder 类的实例。然后,我们将编码器拟合到数据集的“颜色”列,并将该列转换为其编码后的值。

独热编码

独热编码是一种将类别转换为数字的方法。我们为每个类别创建一个新特征,如果某一行具有该类别,则其特征获取 1,而其他特征获取 0。此技术非常适合表示名义分类特征,并允许轻松比较类别。但是,如果类别很多,它可能需要大量内存并且速度很慢。

为了在 Python 中实现独热编码,我们可以使用 pandas 库中的 get_dummies() 函数。以下是一个示例

To implement one-hot encoding in Python, we can use the get_dummies() function from the pandas library. Here is an example:

在这段代码中,我们首先从 CSV 文件读取数据集。然后,我们使用 get_dummies() 函数为“颜色”列中每个类别的创建新的二进制特征。

二进制编码

二进制编码是一种将分类特征转换为二进制表示的技术。例如,我们可以为名为“颜色”的特征的类别分配值 0、1 和 2,然后将其转换为二进制表示:0 变成 00,1 变成 01,2 变成 10。此技术结合了标签编码和独热编码的优点。

二进制编码可以减少内存使用并捕获有关类别的某些序数信息。但是,它可能无法准确表示名义分类特征,并且在类别很多时可能会变得复杂。

为了在 Python 中实现二进制编码,我们可以使用 category_encoders 库。以下是一个示例

import category_encoders as ce

encoder = ce.BinaryEncoder(cols=['color'])
encoded_data = encoder.fit_transform(data)

在这段代码中,我们首先导入 category_encoders 库。然后,我们创建 BinaryEncoder 类的实例,并将“颜色”列指定为要编码的列。我们将编码器拟合到数据集,并将该列转换为其二进制编码后的值。

计数编码

计数编码是一种用类别在数据集中出现的次数替换每个类别的技术。例如,如果名为“颜色”的分类特征具有三个类别,“红色”出现 10 次,“绿色”出现 5 次,“蓝色”出现 3 次,我们可以将“红色”替换为 10,“绿色”替换为 5,“蓝色”替换为 3。

计数编码对于高基数分类特征很有用,因为它减少了通过独热编码创建的列数。它还可以捕获类别的频率,但对于序数分类特征可能并不理想,在序数分类特征中,频率不一定表示类别的顺序或排名。

为了在 Python 中实现计数编码,我们可以使用 category_encoders 库。以下是一个示例

import category_encoders as ce

encoder = ce.CountEncoder(cols=['color'])
encoded_data = encoder.fit_transform(data)

在这段代码中,我们首先导入 category_encoders 库。然后,我们创建 CountEncoder 类的实例,并将“颜色”列指定为要编码的列。我们将编码器拟合到数据集,并将该列转换为其计数编码后的值。

目标编码

目标编码是一种用该类别的平均目标值替换每个类别的方法。例如,如果我们有一个名为“颜色”的分类特征和一个二进制目标变量,我们可以将“红色”替换为 0.3 的平均目标值,“绿色”替换为 0.6,“蓝色”替换为 0.4。目标编码适用于高基数分类特征,并且可以捕获类别与目标变量之间的关系。但是,如果类别很少见或目标变量不平衡,它可能会过拟合。

为了在 Python 中实现目标编码,我们可以使用 category_encoders 库。以下是一个示例

import category_encoders as ce

encoder = ce.TargetEncoder(cols=['color'])
encoded_data = encoder.fit_transform(data, target)

在这段代码中,我们首先导入 category_encoders 库。然后,我们创建 TargetEncoder 类的实例,并将“颜色”列指定为要编码的列。我们将编码器拟合到数据集,并将该列转换为其目标编码后的值,使用目标变量作为目标。

结论

总而言之,在本文中,我们介绍了在 Python 中将分类特征转换为数值特征的不同方法,例如独热编码、标签编码、二进制编码、计数编码和目标编码。方法的选择取决于分类特征的类型和使用的机器学习算法。将分类特征转换为数值特征有助于机器学习算法更准确地处理和分析分类数据,从而可以获得更好的模型。

更新于: 2023-07-21

293 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告