2.3 KiB
2.3 KiB
3.5 离散值编码
LabelEncoder
在数据挖掘中,特征经常不是数值型的而是分类型的。举个例子,一个人可能有["male", "female"]
,["from Europe", "from US", "from Asia"]
,["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]
等分类的特征。这些特征能够被有效地编码成整数,比如["male", "from US", "uses Internet Explorer"]
可以被表示为[0, 1, 3]
,["female", "from Asia", "uses Chrome"]
表示为[1, 2, 1]
。
在sklearn
中,通过LabelEncoder
来实现:
from sklearn.preprocessing import LabelEncoder
label = ['male','female']
int_label = LabelEncoder()
label = int_label.fit_transform(label)
>>>label
array([1, 0])
OneHotEncoder
这种整数特征表示并不能在sklearn
的估计器中直接使用,因为这样的连续输入,估计器会认为类别之间是有序的,但实际却是无序的。如将male,female
,转换为1,0
。1
比0
要大,机器就会把这个关系考虑进去,而male,female
之间是没有这样的关系的。所以我们需要使用另外一种编码方式,OneHot
编码。
OneHot
编码其实非常简单,就是在将原来的特征展开成一个二进制列,假设sex
这个特征有两种取值,分别为:male
和female
。数据如下:
id | sex |
---|---|
1 | male |
2 | male |
3 | female |
4 | male |
5 | female |
那么经过OneHot
编码之后,数据会变成如下形式(原来数据中sex
为male
的在编码后sex_male
的值为1
,sex
为female
的在编码后sex_female
的值为1
):
id | sex_male | sex_female |
---|---|---|
1 | 1 | 0 |
2 | 1 | 0 |
3 | 0 | 1 |
4 | 1 | 0 |
5 | 0 | 1 |
你会发现,经过OneHot
编码后,sex
特征变成了无序的二进制特征。当然,在sklearn
中已经为我们提供了OneHot
编码的接口。可以通过OneHotEncoder
来实现,使用方法如下:
import numpy as np
from sklearn.preprocessing import OneHotEncoder
label = np.array([1,0])
label = np.array(label).reshape(len(label),1)#先将X组织成(sample,feature)的格式
# 实例化OneHotEncoder对象
onehot_label = OneHotEncoder()
# 对数据进行编码
label = onehot_label.fit_transform(label).toarray()
>>>label
array([[0., 1.],
[1., 0.]])