分类数据编码方法是什么?

2025年1月7日 | 阅读10分钟

在数据科学和机器学习中,处理分类数据是一项常见的挑战。分类变量代表属性,例如颜色、类型或字体。然而,大多数机器学习算法需要数值输入,因此需要将分类数据转换为数值形式。这个过程称为编码,并且有许多方法可以优化这个过程。在本文中,将讨论各种分类数据编码方法及其应用。

什么是分类数据?

分类记录是指表示定性属性或属性的数据类型。这些因素通常是多样的,并且可以分为类别或分组。分类事实描述了不具有统计意义的趋势或属性,例如颜色、物种或教育程度。

有两种主要的范围记录类型

  1. 标称信息:标称记录是指没有固有顺序或区域的指令。例如,汽车类型(轿车、SUV、货车)或颜色(粉色、蓝色、绿色)。命名法通常用于标记或分类观察结果。
  2. 分层统计:换句话说,分层信息包含具有自然顺序或分组的类别。虽然类别本身不同,但可以按逻辑顺序组织它们。例如,评级(低、中、高)或教育水平(小学、高中、大学)。但是,类别之间的差异可能不相等。

分类数据在算术、生命科学和机器(设备)学习等领域发挥着重要作用。理解和研究分类数据可以帮助研究人员和专家根据定性属性进行探索、评估和做出明智的决策。此外,正确使用特定数据对于机器(设备)学习和其他应用程序的数据预处理至关重要,这些应用程序通常需要数值数据作为算法的输入。

解释分类数据编码方法

分类数据编码方法是将分类变量转换为数值形式的技术,可以用作机器学习算法的输入。分类变量是代表属性的变量,例如颜色、性别或车辆类型。

不同的分类数据编码方法描述如下

  1. 独热编码
  2. 标签编码
  3. 虚拟编码

独热编码

独热编码是最流行的分类信息编码技术之一。它通过为原始变量中存在的每个类别创建二进制列来工作。例如,如果一个分类变量有 3 个类别(例如,红色、绿色、蓝色),独热编码将生成 3 个二进制列,其中每个类别由 1 或 0 表示。此方法可确保不假定类别之间存在顺序关系,使其适用于标称变量。

在独热编码中,原始变量的每个方格都被转换为二进制向量,其中只有一个位是“热”(1),而所有其他位都是“冷”(0)。其工作原理如下:

  • 二进制列创建:为特定变量的每个唯一部分创建新的二进制列。
  • 分配值:在每个实例中,对应于其类别的二进制列设置为一,所有其他二进制列设置为零。

此框架可将每个类别正确地表示为一个单独的实体,从而可以相应地描述和管理机器学习过程。

让我们通过一个例子来说明:假设我们有一个名为“水果”的类别变量;它有 3 个观察值:苹果、芒果和葡萄。

提供的原始数据

观察水果
1Apple
2芒果
3葡萄

独热编码后,这些数据将显示如下

观察Apple芒果葡萄
1100
2010
3001

每个类别现在都有自己的二进制列,值为 1 表示该类别存在于每个观察值中。

独热编码广泛用于机器学习任务,例如分类和聚类,其中需要将分类变量转换为数值形式以进行分析和模型训练。但是,概率信息是必需的,因为存在维度灾难。但是,在处理过程中,独热编码是机器学习应用程序中有效处理分类数据的强大工具。

在 Python 中实现独热编码

Python 提供了一个名为 category_encoders 的库,用于实现独热编码。可以使用 pip 命令进行安装

这是 Python 中独热编码器的详细工作流程

输出

	Fruits
0	Apple
1	Banana
2	Pineapple
3	Grapes
4	Orange
5	Pomegranate
6	Watermelon

输出是原始数据帧。现在,使用 fit_transform() 方法,可以对数据进行编码。

输出

   Fruits_Apple  Fruits_Banana  Fruits_Pineapple  Fruits_Grapes  Fruits_Orange  Fruits_Promegenate  Fruits_Watermelon
0	1.0    0.0    0.0    0.0    0.0    0.0    0.0
1	0.0    1.0    0.0    0.0    0.0    0.0    0.0
2	0.0    0.0    1.0    0.0    0.0    0.0    0.0
3	0.0    0.0    0.0    1.0    0.0    0.0    0.0
4	0.0    0.0    0.0    0.0    1.0    0.0    0.0
5	0.0    0.0    0.0    0.0    0.0    1.0    0.0
6	0.0    0.0    0.0    0.0    0.0    0.0    1.0

标签编码

在标签编码中,每个变量类别都被赋予一个唯一的整数值。给定的整数通常是连续的,从零开始。此方法适用于具有自然顺序的序数变量,例如低、中和高。但是,在使用标签编码时必须小心,因为可能会暗示不存在的顺序关系。也称为序数编码器。

标签编码是一种数据预处理方法,用于处理分类变量的数量。与为每个类别拥有二进制列的独热编码不同,标签编码为每个变量类别分配唯一的整数值。

标签编码的工作原理如下。

  1. 分配整数值:为特定变量的每个类别分配唯一的整数价格。这些整数值通常按顺序给出,从零开始或
  2. 更改类别:原始的变量表达式值将被替换为其对应的整数值。

标签编码主要用于表示具有自然顺序或类别之间差异的变量,称为序数记录。它有助于建立类别之间的序列关系,并以数学方式反转它们。

让我们通过一个例子来说明:假设有一个名为“班级”的类别变量,包含三个类别:第一、第二和第三。

原始数据

观察Class
1第一个
2第二个
3第三

标签编码后,数据将显示如下

观察大小
10
21
32

在这里,每个类别都被更改为一个唯一的标签。“First”类表示为零,“Second”表示为 1,“Third”表示为 2。

标签编码简单高效,适合机器学习任务中的序数变量。但是,在使用标签编码处理没有自然顺序的标称变量时需要谨慎,因为这可能会导致在这些情况下不存在的顺序关系,此时独热编码或其他编码策略可能更合适。

在 Python 中实现标签编码器

输出

	Fruits
0	Apple
1	Banana
2	Orange
3	Pineapple
4	Apple
5	Grapes
6	Watermelon
7	Banana
8	Orange
9	Pineapple
10	Pomegranate
11	Watermelon

这是由不同水果组成的数据帧。使用 OrdinalEncoder() 函数将这些水果名称映射到一个值。fit_transform() 函数用于使用标签编码器对数据进行编码。

输出

	Fruits
0	1
1	2
2	3
3	6
4	1
5	4
6	5
7	2
8	3
9	6
10	7
11	5

这里,输出是标签编码的数据,其中包含每个类别的不同标签。

虚拟编码

虚拟编码,也称为二进制编码或 one-of-k 编码,是一种数据预处理方法,用于将分类变量转换为适合机器学习算法的数学形式。它与独热编码相似,但在创建二进制列时,虚拟编码有所不同。

在虚拟编码中,对于具有 n 个不同类别的分类变量,将生成 n-1 个二进制列。每个二进制列代表一个类别,除了一个参考类别,当所有二进制列都为空时,该类别将被明确表示。这种方法有助于避免在使用单热编码时出现的复共线性问题,尤其是在线性回归模型中。

虚拟编码的工作原理如下。

  1. 创建二进制列:对于排名变量中的每个唯一类别,将创建一个新的二进制列,除了一个参考类别。
  2. 分配二进制值:在每个视图中,对应于其类别的二进制列设置为 1,所有其他二进制列设置为 0。

可以使用一个例子来解释虚拟编码的工作原理。假设有一个名为“地区”的分类变量,有四个类别:北方、南方、东方和西方。

提供的原始数据

观察地区
1北部
2
3
4西

虚拟编码后,数据将显示如下

观察北部西
11000
20100
30010
40001

这里有三个二进制列,每个列代表一个类别(“北方”、“南方”、“东方”和“西方”)。“北方”类别充当参考类别,因此如果所有二进制列都为空,则表示该实例属于“北方”类别。

虚拟编码广泛用于各种机器学习任务,尤其是在处理多类特定变量时。它在避免独热编码中出现的一些线性问题时,提供了对分类数据的紧凑表示。但是,至关重要的是要关注参考类别的选择及其对模型解释的影响。

在 Python 中实现虚拟编码

输出

	Fruits
0	Apple
1	Banana
2	Orange
3	Pineapple
4	Apple
5	Grapes
6	Watermelon
7	Banana
8	Orange
9	Pineapple
10	Pomegranate
11	Watermelon

这是由不同水果组成的数据帧。get_dummies() 函数用于使用虚拟编码器对数据进行编码,该编码器在输出时为每个类别创建虚拟变量。

	Fruits_Banana	Fruits_Grapes	Fruits_Orange	Fruits_Pineapple	Fruits_Pomegranate
0	0	0	0	0	0
1	1	0	0	0	0
2	0	0	1	0	0
3	0	0	0	1	0
4	0	0	0	0	0
5	0	1	0	0	0
6	0	0	0	0	0
7	1	0	0	0	0
8	0	0	1	0	0
9	0	0	0	1	0
10	0	0	0	0	1
11	0	0	0	0	0

还有一些不同的编码技术,例如

  • 频率编码

频率编码使用类别在数据集中出现的频率来替换类别。每个类别都映射到其对应的频率价格,表明基于事件的重要性。此技术可用于捕捉数据集中稀有或不常见组的重要性。

  • 目标编码(均值编码)

目标编码,也称为均值编码,包括将每个类别更改为该类别中目标变量的均值(例如,因变量的平均值)。此方法对于分类任务尤其有效,因为它衡量了类别之间变量与目标变量之间的相关性。但是,如果不加以小心或数据集较小,可能会发生过拟合。

  • 哈希编码

哈希编码是一种将哈希运算应用于映射到多个维度的分类变量的方法。此方法在处理高基数平方变量时可能有用,因为它减少了内存消耗和计算复杂性。但是,它可能导致不一致,即不同的类别映射到相同的哈希价格。

这些编码技术各有优缺点,选择哪种方法取决于诸如分类变量的性质、使用的机器学习算法以及项目的具体要求等因素。通过实验和仔细考虑,才能为给定的数据集和问题域选择最合适的编码方法。

除了上述编码策略外,还有一些额外的策略可能有助于在机器学习任务中使用特定数据

  1. 证据权重编码:证据权重(WOE)编码通常用于概率建模程序,例如信用评分。它计算目标变量(例如,违约或非违约)的概率的对数以及目标变量在每个类别中的总体概率。此技术通过基于其预测强度对类别进行编码来衡量特定变量与目标变量之间的关联。
  2. 效应编码:效应编码,也称为方差编码或和编码,与虚拟编码类似,但使用了不同的编码方案。效应编码包括将每个特定变量级别与其通用平均响应进行比较。当类别之间存在不平衡或类别之间存在相互作用时,此方法特别有用。
  3. 似然比编码:似然比编码(PRE)类似于 WOE 编码,但计算每个类别中目标变量的概率与整个数据集中目标变量的概率之比。
  4. 留一法编码:留一法编码(LOO)用当前计算出的目标变量的平均值替换每个方格。此方法在处理小型数据时可能有用;但是,如果不小心使用,可能会导致过度。因此需要谨慎。

结论

特定数据编码方法在为机器学习算法准备数据方面发挥着至关重要的作用。编码技术的需求取决于各种因素,包括特定变量的性质、正在使用的集合规则以及项目的具体要求。通过正确理解和应用这些编码策略,数据科学家可以在其设备学习工作流程中有效地利用特定数据,从而实现更准确、更可靠的模型。