前言
One-Hot编码(独热编码)是机器学习数据预处理中的一种方法1,其目的就是将分类变量转换成二进制向量,简化神经网络的输入。
定义: One-Hot编码,又称一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
One-Hot编码的实现
案例1
举个例子:
Feature_1 | Feature_2 | Feature_3 | Feature_4 | |
---|---|---|---|---|
Sample_1 | 0 | 4 | 2 | 0 |
Sample_2 | 1 | 0 | 2 | 0 |
Sample_3 | 2 | 3 | 5 | 1 |
Sample_4 | 3 | 3 | 0 | 0 |
上表中有4组数据,并且每组数据在4个特征上都有不同的状态,例如:特征1有4个不同的状态[0、1、2、3],特征2、3有3种不同的状态[4、0、3],特征4有2种不同的状态[0、1](按出现顺序进行排列)。
以特征1为例,进行 One-Hot编码 时,含有4种不同状态,所有最终的编码有4位,并且One-Hot编码要保证单个特征只有1位处于状态1,其他的都是0,因此,特征1在4种状态时的编码分别为 0001、0010、0100、1000。
所有上表中的4组数据经过 One-Hot编码 后的结果如下:
Feature_1 | Feature_2 | Feature_3 | Feature_4 | |
---|---|---|---|---|
Sample_1 | 0001 | 001 | 001 | 01 |
Sample_2 | 0010 | 010 | 001 | 01 |
Sample_3 | 0100 | 100 | 010 | 10 |
Sample_4 | 1000 | 100 | 100 | 11 |
案例2 词袋模型
One-Hot编码 在特征提取上属于词袋模型,所以除了对有具体分类的特征数据进行编码外,One-Hot编码 另一种常用之处是语言库2。
- 我爱中国
- 爸爸妈妈爱我
- 爸爸妈妈爱中国
首先将以上语言进行拆分并进行编号:[1:我,2:爱,3:中国,4:爸爸:5:妈妈]。
然后通过 One-Hot编码 对上述特征进行编码分别是:
编号 | 内容 | 编码 |
---|---|---|
1 | 我 | 1xxxx |
2 | 爱 | x1xxx |
3 | 中国 | xx1xx |
4 | 爸爸 | xxx1x |
5 | 妈妈 | xxxx1 |
最总得到分别得到三句话的 One-Hot编码:
- 我爱中国 ⇨ 11100
- 爸爸妈妈爱我 ⇨ 11011
- 爸爸妈妈爱中国 ⇨ 01111
One-Hot编码的优点
- 解决了 分类器不好处理离散数据 的问题。
- 欧式空间/距离,在回归、分类、聚类等机器学习算法中,特征间距离计算 或 相似度/置信度的计算 都是以基于欧式空间。
- One-Hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值 就 对应欧式空间的某个点。
- 在一定程度上也起到了 扩充特征 的作用。
One-Hot编码的缺点
One-Hot编码的缺点在文本特征表示上比较突出。
- 它是一个词袋模型,不考虑 词与词之间的顺序。
- 它 假设词与词相互独立。
- 它得到的 特征是离散稀疏 的。
首先是缺点1,由于不考虑词之间的顺序,仅仅以词是否出现作为依据,所以两句不同的语句可能出现相同的编码,例如上面举过的例子:爸爸妈妈爱我 的编码是 11011,但 我爱爸爸妈妈 的编码同样是 11011,两句话虽然在编码相同,但从实际表达的含义上缺不同。
然后是缺点2,苹果是一种水果,苹果是一家公司,很显然两句话里的 苹果 是两个不同的含义,如果使用相同编码很显然无法进行区分。
缺点3则是在大数据量的情况下尤为突出,假设将整个世界上的所有城市都通过 One-Hot 进行编码,就会出现如下情况:
杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0] 上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0] 宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0] 北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]
在数据库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。