在机器学习任务中,特征并不总是连续值,比如性别、国籍、婚姻情况,即使将这些将这些特征转化为数字,也不能直接用于机器用于分类器中,分类器默认所有特征是连续的,这些离散值会被直接当做连续型变量处理。
**Case**——假定已知三个feature,三个feature分别取值如下:
feature1=[“male”, “female”] 表示为[0, 1]
feature2=[“from Europe”, “from US”, “from Asia”] 表示为[0, 1, 2]
feature3=[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”] 表示为[0, 1, 2, 3]
假设有下面两组数据:
[“male”, “from US”, “uses Internet Explorer”] is marked为[0, 1, 3]
[“female”, “from Asia”, “uses Chrome”] is marked为[1, 2, 1]
为了解决上述问题,有一种可能的解决办法为独热编码:
独热编码即One-Hot码,又称一位有效码;该方法是使用N位状态寄存器表达N个状态,且只有一位有效;
例如:
自然状态码为:000, 001, 010, 011, 100, 101
独热编码为: 000001,000010,000100,001000,010000,100000
可以这样理解,对于某个特征有m个取值,转换为独热编码后,就变成了m个二元特征,并且这些特征互斥,每次只有一个激活。
Q:现在将[0, 1, 3]进行独热编码:
A: 则样本中特征变量取值最多的为feature3,所以独热编码应写成4个二元特征,将未取到的特征记为0000;则对于样本中第一个变量feature1,则为[0001,0000];
依此类推,最终独热编码可以表示为:[0001, 0000, 0000, 0010, 0000, 0000, 0000, 0000, 1000]
可以简写为:[1., 0., 0., 1., 0., 0., 0., 0., 1.]
则我们可以用sklearn计算某样本变量的独热编码
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) #4个样本
enc.transform([[0, 1, 3]]).toarray()
输出结果:array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])