1、独热编码的优点
- 能处理非连续型数值特征
- 在一定程度上扩充了特征。如性别,经过one hot编码后,变成了男或女两个特征。
2、独热编码原理
使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值对用欧式空间的某个点。
将离散型特征使用One-hot编码,可以让特征之间的距离计算更加合理。我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
如,有一个离散型特征,代表工作类型,该离散型特征共有三个取值,不使用one-hot编码,其表示分别是:
x_1=(1),x_2=(2),x_3=(3)。
两个工作之间的距离是:
(x_1,x_2)=1,d(x_2,x_3)=1,d(x_1,x_3)=2.
那么x_1和x_3工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理的。
如果使用one-hot编码,则得到:
x_1=(1,0,0),x_2=(0,1,0),x_3=(0,0,1)
那么两个工作之间的距离都是sqrt(2)。即每两个工作之间的距离都是一样的,显得更合理。
3、sklearn中的one-hot
代码示例:
import numpy as np
from sklearn.preprocessing import OneHotEncoder
enc=OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
print('enc.n_values_ is :',enc.n_values_)
print('enc.feature_indices_ is:',enc.feature_indices_)
print(enc.transform([[0,1,1]]).toarray())
运行结果:
enc.n_values_ is: [2 3 4]
enc.feature_indices_ is: [0 2 5 9]
[[ 1. 0. 0. 1. 0. 0. 1. 0. 0.]]
代码解释:
为OneHotEncoder类传递进来的数据集:
[[0,0,3],
[1,1,0],
[0,2,1],
[1,0,2]]
- 对象
enc
的n_values_
成员变量,记录着每一个属性的最大取值数目,如本例第一个属性:0, 1, 0, 1
⇒ 2,0, 1, 2, 0
⇒ 3,3, 0, 1, 2
⇒4
; - 即各个属性(feature)在 one hot 编码下占据的位数;
- 对象
enc
的feature_indices_
,则记录着属性在新 One hot 编码下的索引位置
- feature_indices_ 是对 n_values_ 的累积值,不过 feature_indices 的首位是 0;
进一步通过 fit 好的 one hot encoder 对新来的特征向量进行编码:
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]])
- 前 2 位 1, 0,对 0 进行编码
- 中间 3 位 0, 1, 0 对 1 进行编码;
- 末尾 4 位 0, 1, 0, 0 对 1 进行编码;