【NLP学习笔记】One-hot encoding:独热编码

时间:2024-04-06 21:31:20

一、存在问题

在机器学习算法中,特征并不总是连续值,常会遇到分类特征是离散的、无序的。例如:性别有男、女,城市有北京,上海,深圳等。

离散特征的编码分为两种情况:

  • 离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码
  • 离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}

性别特征:[“男”,“女”] = [ 0,1 ]
地区特征:[“北京”,"上海,“深圳”] = [ 0,1,2 ]
工作特征:[“演员”,“厨师”,“公务员”,“工程师”,“律师”] = [ 0,1,2,3,4 ]

比如,样本(女,北京,工程师)表示为[1,0,3],但是,这样的特征处理并不能直接放入机器学习算法中,因为,分类器通常默认数据是连续且有序。但是,按照我们上述的表示,数字并不是有序的,而是随机分配的。

解决这类问题,一种解决方法是采用独热编码(One-Hot Encoding)。

二、什么是独热编码?

独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。

  • 即,只有一位是1,其余都是零值。

下面结合具体例子对独热编码进行阐述:

  • 对六个状态进行编码: N = 6

自然顺序码为:000,001,010,011,100,101
独热编码则是:000001,000010,000100,001000,010000,100000

回顾文章开头的例子:按照 N 位状态寄存器来对 N 个状态进行编码的原理,结果如下:

  • 性别特征:[“男”,“女”](这里N=2
  • 男 = [ 1 0 ]
  • 女 = [ 0 1 ]
  • 地区特征:[“北京”,"上海,“深圳”](这里N=3):
  • 北京 = [ 1 0 0 ]
  • 上海 = [ 0 1 0 ]
  • 深圳 = [ 0 0 1 ]
  • 工作特征:[“演员”,“厨师”,“公务员”,“工程师”,“律师”](这里N=5):
  • 演 员 = [ 1 0 0 0 0 ]
  • 厨 师 = [ 0 1 0 0 0 ]
  • 公务员 = [ 0 0 1 0 0 ]
  • 工程师 = [ 0 0 0 1 0 ]
  • 律 师 = [ 0 0 0 0 1 ]

因此,当某个样本的特征是 [“女”,“上海”,“律师”] 的时候,独热编码(One-Hot Encoding)的结果为:

[0,1,0,1,0,0,0,0,0,1]

换言之

  • 对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差三个可能值,即 m = 3,变成 one-hot 就是 [100, 010, 001] )。
  • 并且,这些特征互斥,每次只有一个**(如成绩取值为 好时,one-hot 编码是 [100] )。
  • 因此,数据会变成稀疏的。

这样做的好处主要有:

  1. 解决了分类器不好处理属性数据的问题
  2. 在一定程度上也起到了扩充特征的作用

三、为什么需要独热编码?

  1. 因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。
  2. 将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。
  3. 连续型特征归一化的常用方法:
  • Rescale bounded continuous features——线性放缩 [-1,1]
  • Standardize all continuous features——放缩到均值为0,方差为1。

3.1 为什么要将 特征向量 映射到 欧式空间 ?

  • 因为在回归、分类、聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的。
  • 而常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,就是基于欧式空间的。

比如,上面的工作特征,属于离散型特征,共有五个可能取值,不使用独热编码(One-Hot Encoding)的话,其数字表示分别为:

[ 演 员,厨 师,公务员,工程师,律 师 ] = [ 0,1,2,3,4 ]

那么不同工作特征之间的距离为:

d(演 员,厨 师)= 1
d(厨 师,公务员)= 1
d(公务员,工程师)= 1
d(工程师,律 师)= 1
d(演 员,公务员)= 2
d(演 员,工程师)= 3
以此类推…

显然,使用这样的表示 计算出来的特征的距离是不合理。
那如果使用独热编码(One-Hot Encoding),则得到d(演员,厨师) = 1与d(演员,公务员)都是1。那么,两个工作之间的距离就都是sqrt(2)。即每两个工作之间的距离是一样的,显得更合理。

四、优缺点

  • 优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
  • 缺点1:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。
  • 缺点2:在文本特征表示上有些缺点就非常突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征是离散稀疏的。

五、如何解决 特征稀疏 引起的 维度灾难?

  • Dristributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。
  • 所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。
  • 这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。

比如下图我们将词汇表里的词用"Royalty",“Masculinity”, "Femininity"和"Age"4个维度来表示,King这个词对应的词向量可能是(0.99,0.99,0.05,0.7)。当然在实际情况中,我们并不能对词向量的每个维度做一个很好的解释。
【NLP学习笔记】One-hot encoding:独热编码
我们将 king 这个词从一个可能非常稀疏的向量所在的空间,映射到现在这个四维向量所在的空间,必须满足以下性质:

  • 这个映射是单射;
  • 映射之后的向量不会丢失原先向量所含的信息。

这个过程称为word embedding(词嵌入),即将高维词向量嵌入到一个低维空间。 如下图所示:
【NLP学习笔记】One-hot encoding:独热编码
经过上述一系列的降维操作,有了用Dristributed representation表示的较短的词向量,我们就可以较容易的分析词之间的关系了。

六、使用独热编码的条件?

  1. 如果特征是离散的,并且不用独热编码就可以很合理的计算出距离,就没必要进行独热编码。(比如,离散特征共有1000个取值,分成两组是400和600,两个小组之间的距离有合适的定义,组内距离也有合适的定义,就没必要独热编码)
  2. 有些并不是基于向量空间度量的算法,例如基于树的算法,数值只是个类别符号,没有偏序关系,就不用进行独热编码。
  3. Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。
  4. 如果原本的标签编码是有序的,就不必独热编码了,因为会丢失顺序信息。
  5. 用:独热编码用来解决类别型数据的离散值问题,

总的来说,如果one hot encoding的类别数目不太多,建议优先考虑

七、使用归一化的条件?

  • 需要: 基于参数的模型或基于距离的模型,都是要进行特征的归一化。
  • 不需要:基于树的方法是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。

八、one-hot编码为什么可以解决类别型数据的离散值问题?

  • 首先,one-hot编码是N位状态寄存器为N个状态进行编码的方式。

例如:高、中、低不可分,→ 用0 0 0 三位编码之后变得可分了,并且成为互相独立的事件 。

  • 类似于 SVM,原本线性不可分的特征,经过project之后到高维之后变得可分了。
  • GBDT处理高维稀疏矩阵的时候效果并不好,即使是低维的稀疏矩阵也未必比SVM好

九、Tree Model不需要one-hot编码

  • 对于决策树来说,one-hot的本质是增加树的深度
  • tree-model是在动态的过程中生成类似 One-Hot + Feature Crossing 的机制
  1. 一个特征或者多个特征最终转换成一个叶子节点作为编码 ,one-hot可以理解成三个独立事件
  2. 决策树是没有特征大小的概念的,只有特征处于他分布的哪一部分的概念
  • one-hot可以解决线性可分问题,但是比不上label econding 。
  • one-hot降维后的缺点: 降维前可以交叉的,降维后可能变得不能交叉 。

参考资料

[1] 机器学习特征处理——独热编码(One-Hot Encoding)
[2] 数据预处理:独热编码(One-Hot Encoding)和 LabelEncoder标签编码
[3] 通俗理解word2vec
[4] What are good ways to handle discrete and continuous inputs together?
[5] 机器学习:数据预处理之独热编码(One-Hot)