You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.6 KiB

3.4 数据预处理常用技巧---离散值编码

离散值编码的目的

想要知道离散值编码的目的,那么首先需要知道什么是离散值。离散值的概念其实你并不陌生,因为早在第 2 章第 1 节中你就已经接触到了离散值的概念,没错!就是离散特征!

要知道,不管是数据挖掘还是机器学习算法,它们都只认识数字,一到碰到诸如字符串之类的数据时就会向你抱怨:我太难了!

所以当我们碰到带有离散值的数据时,我们就要想办法来把这些离散值进行转换,转换成算法所认识的数字。

在进行离散值编码时,通常会尝试使用如下两种方法,LabelEncoderOneHotEncoder。下面,我们会试图使用这两种编码方法来解决数据中的离散值编码问题。

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这个特征有两种取值,分别为:malefemale。数据如下:

sex
male
male
female
male
female

那么经过OneHotEncoder编码之后,数据会变成如下形式(原来数据中sexmale的在编码后sex_male的值为1sexfemale的在编码后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]])