Python 中的标签编码

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

简介

在开始学习类别变量编码之前,让我们先了解数据类型及其量表的. 学习者理解这些主题对于进行类别变量编码工作至关重要。众所周知,数据是一种特殊类型的信息,通常以特定格式呈现。我们可以将数据分为三种类型:结构化数据、半结构化数据和非结构化数据。

以矩阵形式(行和列)表示的数据称为结构化数据。这些数据可以存储为 SQL 数据库中的表,Excel 表格中的行和列,或 CSV 文件中用分隔符分隔的数据。

不以矩阵形式存在的数据称为半结构化数据非结构化数据。我们通常可以将半结构化数据存储在 XML 文件、JSON 格式以及更多格式中,而非结构化数据则以图像、电子邮件、视频、日志数据和文本数据的形式存在。

让我们考虑一个基于 机器学习或数据科学 的业务问题。如果我们只处理结构化数据,并且收集的数据是连续变量类别变量的组合,那么大多数 机器学习 算法将无法理解或无法处理类别变量。

这句话意味着,当数据以数值形式而不是类别形式输入模型进行训练和测试时,机器学习算法在准确性和其他性能指标方面表现会更好。

因此,在使用类别数据拟合和评估模型之前,必须将其编码为数字。

某些机器学习算法,例如基于树的算法(如决策树、随机森林),在处理类别变量方面表现更好。在与 数据科学 相关的任何项目中,将类别数据转换为数值数据都是最佳实践。

既然目标明确,在开始构建任何统计模型、深度学习模型或机器学习模型并开始编码或将类别数据转换为数值形式之前,让我们先了解几种类别的类型。

理解名义量表

名义量表 定义为仅用于命名的变量。它们用于标记变量。名义量表之间从不重叠,并且没有任何数值意义。

注意:名义量表仅指那些仅用于命名的变量。

以下是一些代表名义量表数据的示例。一旦我们收集到数据,我们通常需要分配一个代表名义变量的数值代码。

一个人的性别是什么?一个人的婚姻状况是什么?该人居住在哪座城市?
男性 (Male)单精度德里
女性 (Female)已婚孟买
离婚金奈
丧偶班加罗尔
某人居住的城市分配的数值代码
德里1
孟买2
金奈3
班加罗尔4

例如,对于类别变量“某人居住在哪座城市?”,我们可以将德里分配数值代码 1,将孟买分配 2,将金奈分配 3,将班加罗尔分配 4。

重要提示: 分配的数值不具有任何附加的数学值。

上述陈述意味着基本的数学运算,如除法、乘法、减法或加法是无意义的。因此,像德里/孟买或金奈+班加罗尔这样的运算毫无意义。

理解顺序量表

顺序量表 指的是数据值存储在有序集合中的变量。例如,数据使用李克特量表表示有限的客户反馈调查,如下表所示。

客户反馈:5 点李克特量表

反馈分配的数值代码
非常差1
2
满意3
4
非常好5

在上例中,我们使用五点李克特量表收集了反馈数据。我们将“非常差”分配数值代码 1,“差”分配 2,“满意”分配 3,“好”分配 4,“非常好”分配 5。我们还可以观察到 5 比 4 好,比 3 好得多。但是,如果我们从“满意”中减去“非常好”,就没有意义了。

我们已经知道,大多数机器学习算法只能处理数值。这就是将类别特征编码为模型兼容表示的原因。

因此,有几种著名的编码方法可用,包括:

  1. 标签编码
  2. 独热编码
  3. 序数编码

但是,在本教程中,我们将只介绍标签编码。

理解标签编码

Python 标签编码中,我们需要用一个介于零和类别总数减一之间的数值来替换类别值。例如,如果类别变量的值有六个不同的类别,我们将使用 0、1、2、3、4 和 5。

现在,让我们以印度各州 COVID-19 病例数据为例来理解标签编码。观察以下数据框时,我们会发现“State”列包含不是机器友好的类别值。其他列包含数值。现在,让我们尝试对“State”列进行标签编码。

印度各州 COVID-19 病例

国家确诊死亡康复
马哈拉施特拉邦28428111194158140
泰米尔纳德邦1563692236107416
德里118645354597693
卡纳塔克邦51422208919729
古吉拉特邦45481208932103
北方邦43441104626675

正如我们所观察到的,在执行标签编码后,我们将数值分配给了每一个类别值。有些人可能会想,为什么编号是无序的(自上而下)。原因是我们将数字按字母顺序分配,这意味着德里分配给 0,古吉拉特邦分配给 1,卡纳塔克邦分配给 2,依此类推。

州(名义量表)州(标签编码)
马哈拉施特拉邦3
泰米尔纳德邦4
德里0
卡纳塔克邦2
古吉拉特邦1
北方邦5

使用 Python 进行标签编码

Python 的 sklearn 库为用户提供了预定义的函数,用于在数据集上进行标签编码。

语法

正如我们所观察到的,我们创建了 LabelEncoder 类的对象,然后使用该对象将标签编码应用于数据。

主要有两种方法可以进行标签编码:

  1. 使用 scikit-learn 库的 LabelEncoder 类
  2. 类别代码

使用 scikit-learn 库进行标签编码

让我们开始标签编码过程。数据集编码的第一步是拥有一个数据集。

因此,我们在此创建了一个简单的数据集。

示例:创建数据集

正如我们所观察到的,我们创建了一个名为 'data' 的字典,并使用 pandas 的 DataFrame() 函数将其转换为 Data Frame。

输出

Geniune Data Frame:

  Gender    Name
0      F   Cindy
1      M    Carl
2      M  Johnny
3      F  Stacey
4      M    Andy
5      F    Sara
6      M  Victor
7      F  Martha
8      F   Mindy
9      M     Max

从上述数据集中,我们可以看到我们有一个名为“Gender”的变量,其标签分别为“F”和“M”。

接下来,让我们尝试导入 LabelEncoder 类。然后,我们将该类应用于数据集的 'Gender' 变量。

示例

输出

Geniune Data Frame:


  Gender    Name
0      F   Cindy
1      M    Carl
2      M  Johnny
3      F  Stacey
4      M    Andy
5      F    Sara
6      M  Victor
7      F  Martha
8      F   Mindy
9      M     Max
[0 1]
Data Frame after Label Encoding:

   Gender    Name
0       0   Cindy
1       1    Carl
2       1  Johnny
3       0  Stacey
4       1    Andy
5       0    Sara
6       1  Victor
7       0  Martha
8       0   Mindy
9       1     Max

说明

在上面的示例中,我们导入了 pandasscikit-learn 库的 preprocessing 模块。然后,我们定义了字典形式的数据,并打印了数据框以供参考。

之后,我们使用 fit_transform() 方法将由对象指向的标签编码器功能添加到数据变量中。我们打印了“Gender”的唯一代码以及执行标签编码后的最终 Data Frame。

接下来,让我们讨论另一种标签编码方法,即通过类别代码。

使用类别代码进行标签编码

在我们深入了解使用类别代码进行标签编码的过程之前,让我们检查一下数据集中变量的数据类型。

我们可以使用 dtypes 函数检查数据类型,如下所示。

输出

Gender    object
Name      object
dtype: object

检查完“Gender”变量的数据类型后,我们将将其转换并转换为类别类型。

这可以在以下代码片段中看到。

输出

Gender    category
Name        object
dtype: object

现在,让我们尝试使用 pandas.DataFrame.cat.codes 函数将标签转换为整数类型。以下是基于使用类别代码进行标签编码的完整示例。

示例

输出

Genuine Data Frame:

  Gender    Name
0      F   Cindy
1      M    Carl
2      M  Johnny
3      F  Stacey
4      M    Andy
5      F    Sara
6      M  Victor
7      F  Martha
8      F   Mindy
9      M     Max

Data Frame after Label Encoding using Category codes:

   Gender    Name
0       0   Cindy
1       1    Carl
2       1  Johnny
3       0  Stacey
4       1    Andy
5       0    Sara
6       1  Victor
7       0  Martha
8       0   Mindy
9       1     Max

说明

在上面的示例中,我们导入了 pandas 库并定义了字典形式的数据。然后,我们打印了原始数据框以供参考。之后,我们将“Gender”变量的数据类型转换为类别,并使用 pandas.DataFrame.cat.codes 函数将其转换为类别代码。最后,我们打印了使用类别代码进行标签编码后的结果。


下一主题Django vs. Node JS