pt5jvslni/Chapter3/离散值编码.md

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,010要大,机器就会把这个关系考虑进去,而male,female之间是没有这样的关系的。所以我们需要使用另外一种编码方式,OneHot编码。

OneHot编码其实非常简单,就是在将原来的特征展开成一个二进制列,假设sex这个特征有两种取值,分别为:malefemale。数据如下:

id sex
1 male
2 male
3 female
4 male
5 female

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

# 实例化OneHotEncoder对象
onehot_label = OneHotEncoder()
# 对数据进行编码
label = onehot_label.fit_transform(label).toarray()

>>>label
array([[0., 1.],
       [1., 0.]])