如何在 Python 中对序列数据进行独热编码

2025年3月17日 | 阅读 8 分钟

在本教程中,我们将学习如何将我们的输入或输出序列数据转换为独热编码,以用于序列分类。

独热编码是机器学习的一个有用特征,因为很少有机器学习算法可以直接处理类别数据。在处理数据集时,我们会遇到没有特定偏好顺序的列。

如果我们处理的是序列分类类型的问题,那么类别数据必须转换为数字。当我们使用深度学习方法(如长短期记忆循环神经网络)时,也会用到这种技术。

首先,我们将讨论类别数据。

什么是分类数据?

类别数据是具有标签值而不是数值的变量类型。这些类型的变量也称为标称变量。让我们看下面的类别数据示例。

  • 一个“汽车”变量,其值为:“Maruti”和“Jaguar”。
  • 一个“食物”变量,其值为:“素食”和“非素食”。
  • 一个“地点”变量,其值为:“第一”,“第二”和“第三”。

正如我们在上面的代码中所见,有些类别可能具有自然关系,例如自然顺序。在第三个示例中,“地点”变量的值具有自然顺序。

类别数据的问题

一些机器学习算法可以直接处理类别数据。少数算法无法直接处理标签数据,因为它们要求所有数据变量和输出变量都是数值。

How to One Hot Encode Sequence Data in Python

因此,我们必须将层次数据转换为数值形式。假设类别变量是输出变量。在这种情况下,您可能还想将模型的预测转换回类别形式,以表示它们或在某些应用程序中使用它们。

如何将类别数据转换为数值数据

有两种方法可以将类别数据转换为数值数据。

  • 整数编码
  • 独热编码

在下一节中,我们将讨论独热编码

什么是独热编码?

独热编码用于将类别变量转换为数值。在进行进一步的数据分析之前,会将类别值映射到整数值。每列包含“0”或“1”,对应于它所在的列。在此过程中,每个整数值都表示为一个二进制向量,该向量除索引为 1 的整数外,其余全为零。

独热编码示例

让我们通过以下简单示例来理解它。

假设我们有一组值为“黄色”和“红色”的标签序列。要将它们转换为数值,我们将“黄色”分配为整数值 1,对应于列中存在的类别数量,将“红色”分配为 0。当我们遇到这些标签时,我们将分配相同的整数值。这称为整数编码。

让我们看另一个例子 - 假设有一个名为“动物”的类别,它有四个值 - 猫、狗、牛和骆驼。考虑下表,其中包含动物及其对应的类别值。

输入表 -

动物动物的类别值
5
10
15
骆驼11

独热编码后将显示如下输出。

骆驼
1000
0100
0010
0001

如果我们以向量形式表示上述输出,它将如下所示。

猫 - > [1, 0, 0, 0]

狗 - > [0, 1, 0, 0]

牛 - > [0, 0, 1, 0]

骆驼 - > [0, 0, 0, 1]

为什么要使用独热编码?

独热编码的一个最佳优点是它能够使类别数据更具表现力。正如我们之前讨论过的,许多机器学习算法无法直接处理类别数据,因此需要将其转换为整数。

我们可以直接使用整数值,或者在需要的地方使用。它可以解决具有自然序数关系的类别之间的问题。例如 - 我们可以为“天气”标签分配整数值,如“冬季”、“夏季”和“季风”。

但是,如果没有找到序数关系,可能会出现问题。如果我们允许表示倾向或任何此类关系,可能会损害解决问题的学习能力。

手动独热编码

在下面的示例中,我们将考虑一个字母字符串,该字符串将被转换为整数值。

现在,我们将对上述字符串值实现独热编码。让我们看下面的例子。

示例 -

输出

hello python

[7, 4, 11, 11, 14, 26, 15, 24, 19, 7, 14, 13]

[[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

说明

在上面的代码中,我们声明了输入字符串并打印了它。接下来,我们定义了所有可能的输入值集合。然后,创建了从字符值到整数值的映射。我们使用此映射对输入字符串进行编码。

正如我们在上面的输出中所见,第一个字母h被编码为 7。然后,此整数编码被转换为独热编码。一个整数一次编码一个字符。

每个字符都有特定的索引值,我们将该特定字符的索引标记为 1。第一个字符在 27 的二进制向量中表示为 7。我们将 h 的第 7 个索引标记为 1。

现在,我们将学习使用scikit-learn库实现独热编码。

使用 Scikit-learn 进行独热编码

在此示例中,让我们假设有以下 3 个标签的输出序列。

一个具有 10 个时间步长的示例序列可能是。

我们使用整数值 1、2、3 对上述标签进行编码。在独热编码中,我们将使用具有 3 个值的二进制向量,例如 [1, 0, 0]。序列至少包含序列中一个可能值的一个示例。

我们将使用 scikit-learn 库。我们将使用其中的LabelEncoder模块来创建标签的整数编码,并使用OneHotEncoder来创建整数编码值的独热编码。

让我们理解下面的例子。

示例 -

输出

['apple' 'apple' 'mango' 'apple' 'banana' 'banana' 'mango' 'apple']
[0 0 2 0 1 1 2 0]
[[1. 0. 0.]
 [1. 0. 0.]
 [0. 0. 1.]
 [1. 0. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [1. 0. 0.]]

解释 -

在上面的代码中,我们首先打印了标签序列。然后,我们执行了整数编码,最后是独热编码。OneHotEncoder 类返回组织良好的稀疏编码。但对于某些应用程序(如与 keras 库一起使用)来说,它效率不高。

使用 Keras 进行独热编码

假设我们有一个已经整数编码的序列。我们可以直接处理整数编码,或者将整数编码映射到标签值。我们可以使用to_categorical()函数对整数数据进行独热编码。

在此示例中,我们有五个整数值 [0, 1, 2, 3, 4],并且有一个包含以下 15 个数字的输入序列。

让我们理解下面的例子。

示例 -

输出

[1 4 3 3 0 3 2 2 4 0 1 2 1 4 3]
[[0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 1. 0.]]
1

解释 -

在上面的代码中,我们将整数编码编码为二进制向量并打印。然后,我们使用 Numpy 的argmax()函数来反转序列中第一个值的编码。