3.6 KiB
3.4 数据预处理常用技巧---离散值编码
离散值编码的目的
想要知道离散值编码的目的,那么首先需要知道什么是离散值。离散值的概念其实你并不陌生,因为早在第 2 章第 1 节中你就已经接触到了离散值的概念,没错!就是离散特征!
要知道,不管是数据挖掘还是机器学习算法,它们都只认识数字,一到碰到诸如字符串之类的数据时就会向你抱怨:我太难了!
所以当我们碰到带有离散值的数据时,我们就要想办法来把这些离散值进行转换,转换成算法所认识的数字。
在进行离散值编码时,通常会尝试使用如下两种方法,LabelEncoder
和OneHotEncoder
。下面,我们会试图使用这两种编码方法来解决数据中的离散值编码问题。
LabelEncoder
这种方法会对特征中所出现的离散值建立一种映射关系。这种映射关系很简单,例如数据中有Sex
这一特征,并且该特征中的值的值要么是male
,要么是female
。如果我们对Sex
特征使用LabelEncoder
方法进行离散值编码的话,可能会得到一个映射关系:{'male':0, 'female':1}
,即当看到'male'
时就将其改成0
,看到'female'
时将其改成1
。
因此进行编码后的结果为:
Sex |
---|
0 |
1 |
1 |
1 |
0 |
这样,就成功地将字符串类型的特征值转换成了数值类型的特征值。
当然,sklearn
已经为我们提供了实现该功能的接口:LabelEncoder
,使用案例如下:
# 导入LabelEncoder类
from sklearn.preprocessing import LabelEncoder
# 定义数据
label = ['male','female']
# 实例化LabelEncoder对象
int_label = LabelEncoder()
# 进行离散值编码
label = int_label.fit_transform(label)
# 成功将male转换成0,将female转换成1
>>>label
array([0, 1])
OneHotEncoder
虽然LabelEncoder
能将代表不同意义的字符串转换成数字,但是在转换之后很可能会带入顺序信息。比如将‘male’
映射成0
,'female'
映射成1
时,有可能会使得数据挖掘算法认为'female'
更重要,或者‘male’
和'female'
之间存在着一定的大小关系。
我们知道,现在是男女平等的时代,不应该出现男权或者女权的现象。那应该怎样避免将特征值分成三六九等呢?我们可以使用OneHotEncoder
方法来进行离散值编码。
OneHotEncoder
其实非常简单,就是在将原来的特征展开成一个二进制列,假设sex
这个特征有两种取值,分别为:male
和female
。数据如下:
sex |
---|
male |
male |
female |
male |
female |
那么经过OneHotEncoder
编码之后,数据会变成如下形式(原来数据中sex
为male
的在编码后sex_male
的值为1
,sex
为female
的在编码后sex_female
的值为1
):
sex_male | sex_female |
---|---|
1 | 0 |
1 | 0 |
0 | 1 |
1 | 0 |
0 | 1 |
你会发现,经过OneHotEncoder
编码后,sex
特征变成了无序的二进制特征。而且能够轻松的看出第一条样本的性别是male
,第三条样本的性别是female
。
当然,sklearn
已经为我们提供了实现该功能的接口:OneHotEncoder
,使用案例如下:
import numpy as np
# 导入OneHotEncoder类
from sklearn.preprocessing import OneHotEncoder
# 定义数据
label = ['male','female']
# 实例化OneHotEncoder对象
onehot_label = OneHotEncoder()
# 对数据进行编码
label = onehot_label.fit_transform(label)
# 样本的特征变成了2个,分别表示male和female
>>>label
array([[1, 0],
[0, 1]])