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.4 数据预处理常用技巧---离散值编码
|
|
|
|
|
|
|
|
|
|
## 离散值编码的目的
|
|
|
|
|
|
|
|
|
|
想要知道离散值编码的目的,那么首先需要知道什么是离散值。离散值的概念其实你并不陌生,因为早在第 2 章第 1 节中你就已经接触到了离散值的概念,没错!就是离散特征!
|
|
|
|
|
|
|
|
|
|
要知道,不管是数据挖掘还是机器学习算法,它们都只认识数字,一到碰到诸如字符串之类的数据时就会向你抱怨:我太难了!
|
|
|
|
|
|
|
|
|
|
![](5.jpg)
|
|
|
|
|
|
|
|
|
|
所以当我们碰到带有离散值的数据时,我们就要想办法来把这些离散值进行转换,转换成算法所认识的数字。
|
|
|
|
|
|
|
|
|
|
在进行离散值编码时,通常会尝试使用如下两种方法,`LabelEncoder`和`OneHotEncoder`。下面,我们会试图使用这两种编码方法来解决数据中的离散值编码问题。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## LabelEncoder
|
|
|
|
|
|
|
|
|
|
这种方法会对特征中所出现的离散值建立一种映射关系。这种映射关系很简单,例如数据中有`Sex`这一特征,并且该特征中的值的值要么是`male`,要么是`female`。如果我们对`Sex`特征使用`LabelEncoder`方法进行离散值编码的话,可能会得到一个映射关系:`{'male':0, 'female':1}`,即当看到`'male'`时就将其改成`0`,看到`'female'`时将其改成`1`。
|
|
|
|
|
|
|
|
|
|
因此进行编码后的结果为:
|
|
|
|
|
|
|
|
|
|
| Sex |
|
|
|
|
|
|:-:|
|
|
|
|
|
| 0 |
|
|
|
|
|
| 1 |
|
|
|
|
|
| 1 |
|
|
|
|
|
| 1 |
|
|
|
|
|
| 0 |
|
|
|
|
|
|
|
|
|
|
这样,就成功地将字符串类型的特征值转换成了数值类型的特征值。
|
|
|
|
|
|
|
|
|
|
当然,`sklearn`已经为我们提供了实现该功能的接口:`LabelEncoder`,使用案例如下:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
|
|
|
|
# 导入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`,使用案例如下:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
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]])
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|