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.

109 lines
3.6 KiB

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