一、独热码
独热码(one-hot code),直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。
机器学习中,对于离散型的类别数据,需对其进行数字化。比如数字化性别属性,有男性、女性及其他三种值,最简单的数字化表达是设置男性为0,女性为1,其他为2,但使用该简单的序列对分类值进行表示后,进行模型训练时可能会产生一个问题就是特征因为数字值不同影响模型的训练效果,在模型训练的过程中不同的值使得同一特征在样本中的权重可能发生变化,假如直接编码成1000,是不是比编码成1对模型的的影响更大。为了解决上述的问题,使训练过程中不受到因为分类值表示的问题对模型产生的负面影响,引入独热码对分类型的特征进行独热码编码。
二、独热编码
1)只一个特征是离散值
例如:{sex:{male, female,other}},该特征总共有3个不同的分类值,此时需要3个bit位表示该特征是什么值,对应bit位为1的位置对应原来的特征的值(一般情况下可以将原始的特征的取值进行排序,以便于后期使用),此时得到独热码为{100}男性 ,{010}女性,{001}其他;
2)有多个特征是离散值
例如:{sex:{male, female,other}} & {grade:{一年级, 二年级,三年级, 四年级}},此时先按上述方法依次对每个特征进行独热编码,再将各独热码拼接起来,比如对于输入为{sex:male; grade: 四年级}进行独热编码,可先将sex按上述方法进行编码得到{100},然后将grade进行编码为{0001},再将两者连接起来得到最后的独热码{1000001}。
三、独热码函数库
1)python中scikit_learn封装该编码函数
from sklearn import preprocessing enc = preprocessing.OneHotEncoder() enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) enc.transform([[0, 1, 3]]).toarray() #输出 array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
2)spark中也有相应函数