Python教程-Python中的标签编码
简介
在我们开始学习分类变量编码之前,让我们首先了解数据类型及其尺度的基础知识。学习这些主题对于继续使用分类变量编码非常重要。众所周知,数据是一种特定方式格式化的不同类型的信息。我们可以将数据分类为三种类型,分别称为结构化数据、半结构化数据和非结构化数据。
以矩阵形式呈现的数据,具有行和列,被称为结构化数据。这些数据可以存储为SQL数据库中的表格,Excel表格中的行和列,或者以CSV格式分隔。
没有以矩阵形式呈现的数据被称为半结构化数据和非结构化数据。我们通常可以将半结构化数据存储为XML文件、JSON格式等等,而非结构化数据以图像、电子邮件、视频、日志数据和文本数据的形式存在。
让我们考虑一个基于机器学习或数据科学的提供的业务问题。如果我们只处理结构化数据,而所收集的数据是连续变量和分类变量的组合,那么大多数机器学习算法将无法理解或无法处理分类变量。
这意味着机器学习中的算法在数据以数字形式而不是分类形式呈现给模型进行训练和测试时,会在准确性和其他性能指标方面表现得更好。
因此,在将分类数据用于拟合和评估模型之前,必须将分类数据编码为数字。
一些机器学习算法,例如基于树的算法(如决策树、随机森林),在处理分类变量时表现更好。与数据科学相关的任何项目的最佳训练是将分类数据转换为数值数据。
由于目标现在已经清晰,让我们在开始构建任何统计模型、深度学习模型或机器学习模型之前,首先了解一下几种分类数据的类型,并开始将分类数据编码或转换为数值形式。
了解名义尺度
名义尺度定义为仅具有名称的变量。它们用于标记变量。名义尺度永远不会重叠,也没有任何数字意义。
注意:名义尺度仅指那些只有名称的变量。
以下是一些代表名义尺度数据的示例。一旦我们收集了数据,我们必须为名义变量通常分配一个表示名义变量的数值代码。
人的性别是什么? | 人的婚姻状况是什么? | 人居住在哪个城市? |
---|---|---|
男性 | 单身 | 德里 |
女性 | 已婚 | 孟买 |
离异 | 金奈 | |
丧偶 | 孟加拉 |
人居住的城市 | 分配的数字代码 |
---|---|
德里 | 1 |
孟买 | 2 |
金奈 | 3 |
孟加拉 | 4 |
例如,我们可以为分类变量“人居住在哪个城市”分配数值代码1表示德里,2表示孟买,3表示金奈,4表示孟加拉。
重要说明:分配的数值值没有附加的数学值。
上述陈述意味着基本的数学运算如除法、乘法、减法或加法是没有意义的。因此,像德里/孟买或金奈+孟加拉这样的操作完全没有意义。
了解有序尺度
有序尺度是指数据值存储在有序集合中的变量。例如,数据使用Likert量表表示客户反馈调查,该量表是有限的,如下表所示:
客户反馈:5点Likert量表
反馈 | 分配的数字代码 |
---|---|
非常差 | 1 |
差 | 2 |
一般满意 | 3 |
好 | 4 |
非常好 | 5 |
在上述案例中,我们使用了五点Likert量表来收集反馈数据。我们为“非常差”分配了数值代码1,为“差”分配了2,为“一般满意”分配了3,为“好”分配了4,为“非常好”分配了5。我们还可以观察到,5比4好,比3好得多。但如果我们从“非常好”中减去“一般满意”,这将毫无意义。
正如我们已经知道的,大多数机器学习算法仅使用数值值或数据进行工作。这是对特征进行编码以使其与模型兼容的原因。
因此,有多种已知的编码方法可供选择,包括:
- 标签编码
- 独热编码
- 有序编码
但在本教程中,我们只涵盖标签编码:
了解标签编码
在Python的标签编码中,我们需要使用介于零和总类数减一之间的数字值来替换分类值。例如,如果分类变量的值有六个不同的类别,我们将使用0、1、2、3、4和5。
现在,让我们以印度各邦的COVID-19病例为例,来了解标签编码。观察以下数据框,我们会发现“State”列包含一个分类值,不太适合机器处理。其他列包含数值值。现在,让我们尝试对“State”列进行标签编码。
印度各邦的COVID-19病例
州名 | 确诊人数 | 死亡人数 | 治愈人数 |
---|---|---|---|
马哈拉施特拉邦 | 284281 | 11194 | 158140 |
泰米尔纳德邦 | 156369 | 2236 | 107416 |
德里 | 118645 | 3545 | 97693 |
卡纳塔克邦 | 51422 | 2089 | 19729 |
古吉拉特邦 | 45481 | 2089 | 32103 |
北方邦 | 43441 | 1046 | 26675 |
正如我们所见,进行标签编码后,我们为每个分类值分配了数值值。有些人可能会想知道为什么编号是无序的(从上到下)。原因是我们按字母顺序分配了编号,这意味着德里分配给0,古吉拉特分配给1,卡纳塔克分配给2,依此类推。
州名(名义尺度) | 州名(标签编码) |
---|---|
马哈拉施特拉邦 | 3 |
泰米尔纳德邦 | 4 |
德里 | 0 |
卡纳塔克邦 | 2 |
古吉拉特邦 | 1 |
北方邦 | 5 |
使用Python进行标签编码
Python的sklearn库为用户提供了在数据集上使用标签编码的预定义函数。
语法:
from sklearn import preprocessing
obj = preprocessing.LabelEncoder()
正如我们所见,我们创建了LabelEncoder类的对象,然后使用该对象将标签编码应用于数据。
主要有两种标签编码的方式:
- 使用scikit-learn库的LabelEncoder类
- 使用Category codes
使用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)
正如我们所见,我们创建了一个名为'data'的字典,并使用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
从上面的数据集中,我们可以看到有一个名为“Gender”的变量,其标签分别为“F”和“M”。
接下来,让我们尝试导入LabelEncoder类。然后,我们将该类应用于数据集的'Gender'变量。
示例:
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
解释:
在上面的示例中,我们导入了pandas和preprocessing模块。我们然后定义了数据作为字典,并打印了一个参考的数据框。接下来,我们使用fit_transform()方法来将标签编码功能指向数据变量。我们打印了关于Gender的唯一代码以及在进行标签编码后的最终数据框。
接下来,让我们讨论另一种标签编码的方法,即使用Category codes。
使用Category codes进行标签编码
在使用Category codes进行标签编码的过程之前,让我们检查数据集变量的数据类型。我们可以使用dtypes函数来检查变量的数据类型,如下所示:
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
一旦我们检查了变量“Gender”的数据类型,我们将其转换并转换为类别类型。
这可以在下面的代码段中看到:
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函数。以下是一个使用Category 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库并定义了数据作为字典。我们然后打印了参考的原始数据框。之后,我们将变量“Gender”的数据类型转换为类别,并使用pandas.DataFrame.cat.codes函数将其转换为类别代码。最后,我们打印了使用Category codes进行标签编码后的结果。