​前言

在面试的时候,我经常会问候选人“One-Hot编码和哑变量有什么区别”,虽然是个不太难的问题,但很少遇到候选人能够给出一个较清晰且满意的解答。前些天在给机器学习课程班的同学介绍大规模离散LR模型时,介绍了One-Hot编码以及哑变量,并介绍了它们的区别和联系,以及正确运用的姿势。今天Ryan对此做一下整理,方便课程同学后续查看。

 

LR模型回顾

让我们先来简单回顾一下LR模型

上面是LR模型的假设函数,其基本含义为对每个特征值乘上一个权重系数,汇总后做一个sigmoid变换就拿到了我们模型的预估值。这个时候就有很多有意思的地方了

(1)假设函数使用了特征的真实取值,那么特征的单位就需要考虑了,以米为单位还是以厘米为单位是不同的。

(2)不同的特征乘上权重系数后,做了一个加和,那么这样是否真的合适?例如,年薪100万*年薪系数+身高180cm*身高系数,这样计算得到的到底是个啥?

如果我们换个角度来考虑这个问题,也许就容易很多了。我们抽取特征时,主要是为了考察这个特征对于我们最终想要预估的值的重要性,而这个特征具体是什么值可能并不是很重要。

例如,我们想要预测一个人的薪水,身高180cm这个特征对于薪水到底多重要是我们考察的重点,至于180cm这个数值我们并不认为与薪水有关系,换句话说我们考察的是180cm这个数值的背后意味着什么。如果我们的度量单位和方法全都变了,身高180cm在新的度量体系下为29X,那么这个数值虽然变了,但是重要程度还是以前那么多,并没有变。如果我们认为身高180cm对于薪水的重要程度为0.09,那么我们计算预估值时,直接用0.09替换掉身高180cm这个特征即可。

那么为什么标准的LR模型将权重系数乘以了特征的取值了呢?从某种角度上来说,这种做法是很不合理的,例如身高180cm的特征重要性为0.09,身高170cm的特征重要性为0.089,身高160cm的特征重要性为0.091时,我们发现我们无法找到一个统一的公式,使得:w*x=身高特征重要性。此时,特征取值与特征重要性不成线性关系,而LR却建模成了线性关系。

但是LR模型是否没用呢?不是的。还是上面的例子,如果身高180cm的特征重要性为0.09,身高170cm的特征重要性为0.085,身高160cm的特征重要性为0.080时,我们可以找到一个统一的公式,使得:0.0005*身高=特征重要性。此时LR模型就能够正确的建立特征取值与特征重要性之间的关系。

从上面的分析,我们可以看出,LR建模时,要求特征具有线性关系,而实际应用中很少有满足这个假设关系的,因此LR模型效果很难达到应用要求。如果对特征离散化,每个离散化的特征取值都有一个权重系数表示特征重要性,这样就能够更准确的建模,也就能够获得更精准的模型。

One-Hot编码和哑变量分别是什么

在机器学习问题中,我们首先要做的就是把原始的训练数据转化为模型可以接受的输入,并保留尽可能多的信息,这个过程通常叫做特征工程。而抽取出来的特征,有离散型特征(例如省份、性别等)和连续型特征(体重、价格等)。对于简单的模型来说,例如LR模型(Logistic Regression)模型,工业界通常会把连续性特征离散化(此时相当于是离散类特征了),以此增加LR的非线性表达能力。

对于离散类特征来说,一般来说其值只是一个编号,并不具备比较大小的意义,因此要作为模型的输入,通常还要做进一步转化。转化有两种方式,一种是One-Hot编码,一种是哑变量。

One-Hot编码

既然离散类特征的取值为编号,不具备比较大小的关系,而我们的模型需要考察的是每个特征在模型中的重要程度,那么我们可以不用考虑每个特征的取值,只需要考虑该特征取值是否存在即可。One-Hot编码的基本思想是,对于一个离散型特征来说,将每个类别的取值转化为一个变量,该变量为“类别值是否等于X类别”。举例来说,考虑一个学历特征,其取值可以为小学、中学、本科、硕士和博士,那么One-Hot编码会将各个取值编码为:

小学 -> [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来说,如果一个特征有N个类别,那么就有N个变量,每个变量“管理一个类别取值”,这样就形成了一个长度为N的稀疏向量。

哑变量

哑变量与One-Hot编码很类似,区别在于哑变量认为对于一个具有N个类别的特征,我们只需要考察N-1个类别是否存在,第N个类别自然就知道了。对于上面的学历特征来说,如果知道一个特征值不是小学、不是中学、不是本科、不是硕士,我们自然就知道该学历特征是博士了,因此各个类别的编码变为:

小学 -> [1, 0, 0, 0]

中学 -> [0, 1, 0, 0]

本科 -> [0, 0, 1, 0]

硕士 -> [0, 0, 0, 1]

博士 -> [0, 0, 0, 0]

也就是说,One-Hot编码方式冗余了,我们只需要知道N-1个类别,自然就知道第N个类别的信息了。

One-Hot编码和哑变量应该怎么用

考虑一个具有三个类别的离散型特征,采用 One-Hot 编码后:

其中

因此有

从上面的公式可以看出,参数(θ0, θ1, θ2, θ3与参数(θαθ3, θ− αθ3, θ− αθ3(1 − α)θ3等价,α 可以取任意值。此时模型很难学到靠谱的参数,此问题被称为虚拟陷阱(dummy variable trap)。产生这种问题的原因是因为偏置项θ与其它变量之间有线性相关关系,解决这个问题有以下三种方法:

(1)去掉偏置项θ。此时上面公式中θ0=0,此时模型只有唯一解(思考下为什么)。

2)引入正则项。既然有很多等价的参数,那我们可以考虑从这些等价的参数中选择我们最想要的,常用的做法就是使用正则项,控制参数的取值范围。

3)使用哑变量替代One-Hot编码。此时上面公式中x3=0,模型只有唯一解(思考下为什么)。

此问题思考的关键点在于,对于特征变量的引入,要保证参数之间不存在线性相关关系,如果存在线性相关关系,则容易出现虚拟陷阱的问题。

上面考虑的是一个离散型特征的情况,如果有很多种不同类型的离散型特征,例如三个离散型特征,分别是M类、N类和P类,那么最终我们要用多少个变量来表示他们并且不出问题呢?相信聪明的读者,你能够解决这个问题。