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.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# 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 ]])
```