独热编码解析

2022年11月19日 1002点热度 0人点赞

什么是独热编码?

独热编码(One-Hot 编码)是一种编码方式,用于对分类变量进行编码。使用时,用0和1作为参数,使用N位移位寄存器来对N个状态进行编码。

使用场景

独热编码适合在分类变量的编码中,一般运用在机器学习,决策树等场景中。例如,一个人的性别有男和女两种,当对性别进行编码时,假设男为1, 女为2, 那么将性别编码输入时,就会出现“女性的权重貌似变大了”的错觉,因为此时的1和2已经拥有的数字的大小属性。这种现象在分类变量非常多(比如成百上千个分类变量)时尤为明显。

解决

为了杜绝这种现象的发生,我们可以将N个分类转化为N为二进制数,再按位进行存储。例如,上述性别男用01存储,性别女用10存储。这样当输入数据时,输入的其实是互斥的N位数而不是具有大小的数。

举例

现在有下述特征属性:

性别:{男, 女}

地区:{中国,美国,欧洲}

若使用传统的分类编码,男用0表示,女用1表示,中国、美国、欧洲分别用0,1,2表示。

那么当一个人为中国男性时,他的编码为{0,0};当他为欧洲女性时,她的编码为{1,2}。此时女性的编码总体比男性大,这样的编码是无法进行机器学习和决策的。因此我们需要进行独热编码。

独热编码后,中国男性的编码为{0,1,0,0,1},欧洲女性的编码为{1,0,1,0,0},这样对互斥的编码进行分析才能够客观地显示出真实结果。

代码实现

from sklearn import preprocessing

enc = preprocessing.OneHotEncoder()

enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])  #这里一共有4个数据,3种特征

array = enc.transform([[0,0,1]]).toarray()  #这里使用一个新的数据来测试

print(array)   #[[1. 0. 1. 0. 0. 0. 1. 0. 0.]]

这里一共有四个数据,三种特征。是哪四个呢,我们列出矩阵

第一种 第二种 第三种
第一个 0 0 3
第二个 1 1 0
第三个 0 2 1
第四个 1 0 2

我们竖着看,可以看出第一种特征中只有0、1两类,第二组有0,、1、2三类,第三种有0、1、2、3四类,因此分别可以用2、3、4个状态类来表示。

enc.transform就是将[0,1,3]这组特征转换成one hot编码,toarray()则是转成数组形式。

第一个数为0,对应第一种特征则为 1 0;

第二个数为1,对应第二种特征则为 0 1 0;

第三个数为3,对应第三种特征则为 0 0 0 1。

所以最后的输出为:[[ 1 0 0 1 0 0 0 0 1]]

同样的,当我们拿小明的表述[0,0,1]来测试的时候,得到了与第一个例子相同的结果。

from sklearn import preprocessing  

enc = preprocessing.OneHotEncoder()  
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])  #这里一共有4个数据,3种特征

array = enc.transform([[0,0,1]]).toarray()  #这里使用一个新的数据来测试

print(array)   [[1. 0. 1. 0. 0. 0. 1. 0. 0.]]

总结

独热编码适合非连续型的分类变量的编码,使用这种编码能很好地消除原本分类数字代码之间的大小关系对结果的影响,得到的结果更为准确。

参考

  1. 机器学习之独热编码(One-Hot)详解(代码解释)

Wantz

这个人很懒,什么都没留下