您的位置:

Python 中的标签编码

引言

在我们开始学习分类变量编码之前,让我们先了解数据类型及其规模的基础知识。对于学习者来说,理解这些主题以继续进行分类变量编码变得至关重要。众所周知,数据是一种独特的信息类型,通常以特定的方式格式化。我们可以将数据分为三种类型,称为结构化数据、半结构化数据和非结构化数据。

以具有行和列的矩阵形式体现的数据被表示为结构化数据。这些数据可以作为表格存储在 SQL 数据库中,可以作为行和列存储在 excel 工作表中,也可以作为分隔符存储在 CSV 中。

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

让我们考虑一个基于机器学习或数据科学提供的业务问题。如果我们只处理结构化数据,收集的数据是连续变量和分类变量的组合,机器学习中的大多数算法都不会理解或不能处理分类变量。

这种说法意味着,当数据以数字形式表示而不是分类到模型中进行训练和测试时,机器学习中的算法在准确性和其他性能指标上表现得更好。

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

机器学习的一些算法,如基于树的(如决策树、随机森林)算法,在处理分类变量时表现更好。在任何与数据科学相关的项目中,最好的训练是将分类数据转换成数字数据。

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

理解名义规模

*名义标度**被定义为仅是名称的变量。它们用于标记变量。名义尺度从不相互重叠,也没有任何数值意义。*

*#### 注:名义规模仅指那些刚刚命名的变量。

以下是一些代表标称刻度数据的示例。一旦我们收集了数据,我们必须分配一个数字代码来代表一个名义变量。

| 什么是人的性别? | 什么是人的婚姻状况? | 这个人住在哪个城市? | | 男性的 | 单一的 | 德里 | | 女性的 | 已婚的 | 孟买 | | 离婚的 | 金奈 | | 寡居的 | 班加罗尔 |

| 人居住的城市 | 指定的数字代码 | | 德里 | one | | 孟买 | Two | | 金奈 | three | | 班加罗尔 | four |

例如,我们可以为一个分类变量分配一个数字代码 1 来表示德里,2 来表示孟买,3 来表示钦奈,4 来表示班加罗尔——这个人居住在哪个城市。

重要提示:指定的数值没有任何附加的数学值。

上面的陈述暗示了像除法、乘法、减法或加法这样的基本数学运算是没有意义的。因此,像德里/孟买或钦奈+班加罗尔这样的运营完全没有意义。

理解序数尺度

序数标度 是指一个变量,其中的数据值是从一个有序集合中存储的。例如,数据利用李克特量表来表示有限的客户反馈调查,如下表所示:

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

| 反馈 | 指定的数字代码 | | 非常穷 | one | | 穷人 | Two | | 令人满意的 | three | | 好的 | four | | 很好 | five |

在上面的案例中,我们借助五点李克特量表收集了反馈数据。我们将数字代码 1 指定为非常差,2 表示差,3 表示满意,4 表示好,5 表示非常好。我们还可以观察到,5 比 4 好,比 3 好很多。然而,如果我们从满意中减去非常好,那就没有任何意义了。

正如我们已经知道的,大多数机器学习算法只对数值或数据起作用。这就是将分类特征编码成与模型兼容的表示的原因。

因此,有几种众所周知的编码方法,包括:

  1. 标签编码
  2. 一键编码
  3. 序数编码

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

理解标签编码

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

现在,让我们以印度各邦的新冠肺炎病例数据为例,了解标签编码。在观察下面的数据帧时,我们会发现 State 列由一个分类值组成,这对于机器来说并不友好。其他列由数值组成。现在,让我们尝试对状态列进行标签编码。

印度各邦新冠肺炎病例

| 状态 | 确认的 | 死亡 | 恢复 | | 马哈拉施特拉邦 | Two hundred and eighty-four thousand two hundred and eighty-one | Eleven thousand one hundred and ninety-four | One hundred and fifty-eight thousand one hundred and forty | | 泰米尔纳德邦 | One hundred and fifty-six thousand three hundred and sixty-nine | Two thousand two hundred and thirty-six | One hundred and seven thousand four hundred and sixteen | | 德里 | One hundred and eighteen thousand six hundred and forty-five | Three thousand five hundred and forty-five | Ninety-seven thousand six hundred and ninety-three | | 卡纳塔克邦 | Fifty-one thousand four hundred and twenty-two | Two thousand and eighty-nine | Nineteen thousand seven hundred and twenty-nine | | 古吉拉特邦 | Forty-five thousand four hundred and eighty-one | Two thousand and eighty-nine | Thirty-two thousand one hundred and three | | 北方邦(北方邦) | Forty-three thousand four hundred and forty-one | One thousand and forty-six | Twenty-six thousand six hundred and seventy-five |

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

| 状态(标称刻度) | 状态(标签编码) | | 马哈拉施特拉邦 | three | | 泰米尔纳德邦 | four | | 德里 | Zero | | 卡纳塔克邦 | Two | | 古吉拉特邦 | one | | 北方邦(北方邦) | five |

使用 Python 的标签编码

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

语法:


from sklearn import preprocessing 
obj = preprocessing.LabelEncoder()

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

标签编码主要有两种方式:

  1. 借助 scikit-learn 库的 LabelEncoder 类
  2. 类别代码

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

让我们从标签编码的过程开始。数据集编码的主要步骤是拥有数据集。

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

示例:创建数据集


import pandas as pd 
my_data = {
    "Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
    "Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
        }
blk = pd.DataFrame(my_data)
print("Geniune Data Frame:\n")
print(blk)

正如我们所观察到的,借助 Pandas 的 DataFrame() 功能,我们创建了一个字典‘数据’,并将其转换为数据帧。

输出:

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

从上面的数据集中我们可以观察到,我们有一个名为“性别”的变量,它的标签分别为“F”和“M”。

接下来,让我们尝试导入标签编码器类。然后,我们将在数据集的【性别】变量上应用该类。

示例:


import pandas as pd
from sklearn import preprocessing 

my_data = {
    "Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
    "Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
        }
blk = pd.DataFrame( my_data )
print("Geniune Data Frame:\n")
print( blk )

my_label = preprocessing.LabelEncoder() 

blk[ 'Gender' ]= my_label.fit_transform(blk[ 'Gender' ]) 
print(blk[ 'Gender' ].unique())
print("Data Frame after Label Encoding:\n")
print( blk )

输出:

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

说明:

在上例中,我们导入了 scikit-learn 库的Pandas和预处理模块。然后,我们将数据定义为字典,并打印一个数据帧供参考。

稍后,我们使用 fit_transform() 方法将对象指向的标签编码器功能添加到数据变量中。在执行标签编码后,我们打印了关于性别和最终数据帧的唯一代码。

接下来,让我们讨论另一种借助类别代码的标签编码方法。

使用类别代码的标签编码

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

我们可以使用如下所示的数据类型功能来检查数据类型:


import pandas as pd

my_data = {
    "Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
    "Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
        }
blk = pd.DataFrame( my_data )
print( blk.dtypes )

输出:

Gender    object
Name      object
dtype: object

一旦我们检查了变量“性别”的数据类型,我们将转换并将其转换为类别类型。

这可以在下面的代码片段中看到:


import pandas as pd

my_data = {
    "Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
    "Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
        }
blk = pd.DataFrame( my_data )
blk[ 'Gender' ] = blk[ 'Gender' ].astype( 'category' )

print( blk.dtypes )

输出:

Gender    category
Name        object
dtype: object

现在,让我们尝试用Pandas 将标签转换成整数类型。DataFrame.cat.codes 功能。下面是一个基于使用类别代码的标签编码的完整示例:

示例:


import pandas as pd

my_data = {
    "Gender" : ['F', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'M'],
    "Name" : ['Cindy', 'Carl', 'Johnny', 'Stacey', 'Andy', 'Sara', 'Victor', 'Martha', 'Mindy', 'Max']
        }
blk = pd.DataFrame( my_data )
print("Genuine Data Frame:\n")
print( blk )

blk[ 'Gender' ] = blk[ 'Gender' ].astype( 'category' )
print("\nData Frame after Label Encoding using Category codes:\n")
blk[ 'Gender' ] = blk[ 'Gender' ].cat.codes

print( blk )

输出:

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库,并将数据定义为字典。然后,我们打印了原始数据帧供参考。之后,我们将变量“性别”的数据类型转换为一个类别,并使用了Pandas。DataFrame.cat.codes 功能将其转换为类别代码。最后,我们使用类别代码打印了标签编码后的结果。