引言
逻辑回归常用于预测疾病发生的概率,例如因变量是是否恶性肿瘤,自变量是肿瘤的大小、位置、硬度、患者性别、年龄、职业等等(很多文章里举了这个例子,但现代医学发达,可以通过病理检查,即获取标本放到显微镜下观察是否恶变来判断);广告界中也常用于预测点击率或者转化率(cvr/ctr),例如因变量是是否点击,自变量是物料的长、宽、广告的位置、类型、用户的性别、爱好等等。
本章主要介绍逻辑回归算法推导、梯度下降法求最优值的推导及spark的源码实现。
常规方法
一般回归问题的步骤是:
1. 寻找预测函数(h函数,hypothesis)
2. 构造损失函数(J函数)
3. 使损失函数最小,获得回归系数θ
而第三步中常见的算法有:
1. 梯度下降
2. 牛顿迭代算法
3. 拟牛顿迭代算法(BFGS算法和L-BFGS算法)
其中随机梯度下降和L-BFGS在spark mllib中已经实现,梯度下降是最简单和容易理解的。
推导
二元逻辑回归
-
构造预测函数
<nobr style="margin:0px; padding:0px"> hθ(x)=g(θTx)=11+e−θTx </nobr>
其中:
<nobr style="margin:0px; padding:0px"> θTx=∑i=1nθixi=θ0+θ1x1+θ2x2+...+θnxnθ=⎡⎣⎢⎢⎢θ0θ1...θn⎤⎦⎥⎥⎥,x=⎡⎣⎢⎢⎢x0x1...xn⎤⎦⎥⎥⎥ </nobr>
为何LR模型偏偏选择sigmoid 函数呢?逻辑回归不是回归问题,而是二分类问题,因变量不是0就是1,那么我们很自然的认为概率函数服从伯努利分布,而伯努利分布的指数形式就是个sigmoid 函数。
函数 <nobr style="margin:0px; padding:0px"> hθ(x) </nobr>表示结果取1的概率,那么对于分类1和0的概率分别为:
<nobr style="margin:0px; padding:0px"> P(y=1|x;θ)=hθ(x)P(y=0|x;θ)=1−hθ(x) </nobr>
概率一般式为:
<nobr style="margin:0px; padding:0px"> P(y|x;θ)=(hθ(x))y((1−hθ(x)))1−y </nobr> -
最大似然估计的思想
当从模型总体随机抽取m组样本观测值后,我们的目标是寻求最合理的参数估计 <nobr style="margin:0px; padding:0px"> θ′ </nobr>使得从模型中抽取该m组样本观测值的概率最大。最大似然估计就是解决此类问题的方法。求最大似然函数的步骤是:- 写出似然函数
- 对似然函数取对数
- 对对数似然函数的参数求偏导并令其为0,得到方程组
- 求方程组的参数
为什么第三步要取对数呢,因为取对数后,乘法就变成加法了,且单调性一致,不会改变极值的位置,后边就更好的求偏导。
- 构造损失函数
线性回归中的损失函数是:
<nobr style="margin:0px; padding:0px"> J(θ)=12m∑i=1m(yi−hθ(xi))2 </nobr>
线性回归损失函数有很明显的实际意义,就是平方损失。而逻辑回归却不是,它的预测函数 <nobr style="margin:0px; padding:0px"> hθ(x) </nobr>明显是非线性的,如果类比的使用线性回归的损失函数于逻辑回归,那 <nobr style="margin:0px; padding:0px"> J(θ) </nobr>很有可能就是非凸函数,即存在很多局部最优解,但不一定是全局最优解。我们希望构造一个凸函数,也就是一个碗型函数做为逻辑回归的损失函数。
按照求最大似然函数的方法,逻辑回归似然函数:
<nobr style="margin:0px; padding:0px"> L(θ)=∏i=1mP(yi|xi;θ)=∏i=1m(hθ(xi))yi((1−hθ(xi)))1−yi </nobr>
其中m表示样本数量,取对数:
<nobr style="margin:0px; padding:0px"> l(θ)=logL(θ)=∑i=1m(yiloghθ(xi)+(1−yi)log(1−hθ(xi))) </nobr>
我们的目标是求最大 <nobr style="margin:0px; padding:0px"> l(θ) </nobr>时的 <nobr style="margin:0px; padding:0px"> θ </nobr>,如上函数是一个上凸函数,可以使用梯度上升来求得最大似然函数值(最大值)。或者上式乘以-1,变成下凸函数,就可以使用梯度下降来求得最小负似然函数值(最小值):
<nobr style="margin:0px; padding:0px"> J(θ)=−1ml(θ) </nobr>
同样是取极小值,思想与损失函数一致,即我们把如上的 <nobr style="margin:0px; padding:0px"> J(θ) </nobr>作为逻辑回归的损失函数。Andrew Ng的课程中,上式乘了一个系数1/m,我怀疑就是为了和线性回归的损失函数保持一致吧。 - 求最小值时的参数
我们求最大似然函数参数的第三步时,令对参数 <nobr style="margin:0px; padding:0px"> θ </nobr>偏导=0,然后求解方程组。考虑到参数数量的不确定,即参数数量很大,此时直接求解方程组的解变的很困难,或者根本就求不出精确的参数。于是,我们用随机梯度下降法,求解方程组的值。
当然也可以使用牛顿法、拟牛顿法。梯度下降法是最容易理解和推导的,如下是推导过程:
梯度下降 <nobr style="margin:0px; padding:0px"> θ </nobr>的更新过程,走梯度方向的反方向:
<nobr style="margin:0px; padding:0px"> θj:=θj−αδδθjJ(θ) </nobr>
其中:
<nobr style="margin:0px; padding:0px"> δδθjJ(θ)=−1m∑i=1m(yi1hθ(xi)δδθjhθ(xi)−(1−yi)11−hθ(xi)δδθjhθ(xi))=−1m∑i=1m(yi1g(θTxi)−(1−yi)11−g(θTxi))δδθjg(θTxi)=−1m∑i=1m(yi1g(θTxi)−(1−yi)11−g(θTxi))g(θTxi)(1−g(θTxi))δδθjθTxi=−1m∑i=1m(yi(1−g(θTxi))−(1−yi)g(θTxi))xji=−1m∑i=1m(yi−g(θTxi))xji=1m∑i=1m(hθ(xi)−yi))xji </nobr>
第二步推导请注意:
<nobr style="margin:0px; padding:0px"> </nobr>
那么可以推导:
<nobr style="margin:0px; padding:0px"> δδθjg(θTxi)=−e−θTxi(1+e−θTxi)2δδθj(−1)θTxi=g(θTxi)(1−g(θTxi))δθjθTxi </nobr>
因此更新过程可以写成:
<nobr style="margin:0px; padding:0px"> θj:=θj−α1m∑i=1m(hθ(xi)−yi))xji </nobr>
那迭代多少次停止呢,spark是指定迭代次数和比较两次梯度变化或者cost变化小于一定值时停止。 - 过拟合问题
过拟合问题,即我们求得的回归系数在实验集中效果很好,但之外的数据效果很差。机器学习中的特征基本上是靠人的经验选择的,有可能某一些特征或者特征组合与因变量没有任何关系,即某些 <nobr style="margin:0px; padding:0px"> θi≈0 </nobr>。所以我们需要把不必要的特征剔除,一般我们使用正则化来保留所有特征,并让它相应的系数 <nobr style="margin:0px; padding:0px"> ≈0 </nobr>,L1范数正则化后 <nobr style="margin:0px; padding:0px"> θ </nobr>的更新:
<nobr style="margin:0px; padding:0px"> θj:=θj−α1m∑i=1m(hθ(xi)−yi))xji−λmθj </nobr>
<nobr style="margin:0px; padding:0px"> λ </nobr>越大,对模型的复杂度惩罚越大,有可能出现欠拟合现象。 <nobr style="margin:0px; padding:0px"> λ </nobr>越小,惩罚越小,可能新出现过拟合现象。spark逻辑回归的随机梯度下降法中,使用的是L2范数正则化。