One-Hot编码,又称“独热编码”,是一种编码方式。
一、问题的产生
在进行机器学习,例如回归,分类,聚类或者NLP等问题的时候,通常很多数据都是无法直接利用的。例如一个学生信息数据集中样本有三种类别,每个类别分别对应不同种类的标签:“性别”(男、女)、“班级”(1班、2班、3班)、“年级”(一年级、二年级、三年级、四年级)。
在计算机中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。所以在处理上面学生信息数据集的时候就要考虑如何将其进行恰当的编码,以便于后续的计算处理。这个时候就提出了One-Hot编码格式。
二、什么是One-Hot编码
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
看到这里可能有一些蒙,没有关系,下面给出一个具体的例子。
三、实例分析
我们还是用最上面的例子,按照N位寄存器来对N个状态进行编码,并且除了整数索引之外,其他都是零值。
性别:[“男”,”女”]
只有两个特征,所以N为2,下面同理。
男=>10
女=>01
班级:[“1班”,”2班”,”3班”]
1班=>100
2班=>010
3班=>001
年纪:[“一年级”,”二年级”,”三年级”,”四年级”]
一年级=>1000
二年级=>0100
三年级=>0010
四年级=>0001
所以如果一个样本为[“男”,”2班”,”四年级”]的时候,完整的特征数字化的结果为:
[1,0,0,1,0,0,0,0,1]
到这里我们就实现了对数据集样本的编码,就可以顺利进行后续的回归、聚类或者其他操作。
四、优缺点
优点:
(1)能够处理非连续型数值特征,也就是离散值。
(2)在一定程度上也扩充了特征。比如性别本身是一个特征,经过one hot编码以后,就变成了男或女两个特征,将离散特征通过one-hot编码映射到欧式空间,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。
(3)将离散型特征使用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).即每两个工作之间的距离是一样的,显得更合理。
缺点:
(1)如果原本的标签编码是有序的,那one hot编码就不合适了——会丢失顺序信息。
(2)如果特征的特征值数目特别多,特征向量就会非常大,且非常稀疏。
五、NLP用途
我们在自然语言领域,可以将文本分词,分词后的所有单词作为一个总体的特征数目,进行one-hot编码,其中每一个单词就是一个one-hot向量,然后文本中每个句子也同样分词,分词后将这些单词作为一个句子的表示方式,这样一个句子就是一个二维向量,向量的行数是这个句子包含的单词总数,如此还可以用one-hot向量组成表示为文章。
六、代码展示
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder() #One-Hot编码
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]]) #定义样本
print(enc.transform([[0,1,1]]).toarray()) #[[1.0.0.1.0.0.1.0.0.]]
print(enc.transform([[1,1,1]]).toarray()) #[[0.1.0.1.0.0.1.0.0.]]
print(enc.transform([[1,2,1]]).toarray()) #[[0.1.0.0.1.0.1.0.0.]]
参考链接:
https://blog.csdn.net/Dorothy_Xue/article/details/84641417
https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html
https://www.imooc.com/article/35900
https://blog.csdn.net/randompeople/article/details/83244766
https://www.cnblogs.com/fujian-code/p/8717579.html