引言

逻辑回归常用于预测疾病发生的概率,例如因变量是是否恶性肿瘤,自变量是肿瘤的大小、位置、硬度、患者性别、年龄、职业等等(很多文章里举了这个例子,但现代医学发达,可以通过病理检查,即获取标本放到显微镜下观察是否恶变来判断);广告界中也常用于预测点击率或者转化率(cvr/ctr),例如因变量是是否点击,自变量是物料的长、宽、广告的位置、类型、用户的性别、爱好等等。 
本章主要介绍逻辑回归算法推导、梯度下降法求最优值的推导及spark的源码实现。

常规方法

一般回归问题的步骤是: 
1. 寻找预测函数(h函数,hypothesis) 
2. 构造损失函数(J函数) 
3. 使损失函数最小,获得回归系数θ

而第三步中常见的算法有: 
1. 梯度下降 
2. 牛顿迭代算法 
3. 拟牛顿迭代算法(BFGS算法和L-BFGS算法) 
其中随机梯度下降和L-BFGS在spark mllib中已经实现,梯度下降是最简单和容易理解的。

推导

二元逻辑回归

  1. 构造预测函数 

    <nobr style="margin&#58;0px&#59; padding&#58;0px"> hθ(x)=g(θTx)=11+eθTx </nobr>

    其中: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> θTx=i=1nθixi=θ0+θ1x1+θ2x2+...+θnxnθ=θ0θ1...θn,x=x0x1...xn </nobr>

    为何LR模型偏偏选择sigmoid 函数呢?逻辑回归不是回归问题,而是二分类问题,因变量不是0就是1,那么我们很自然的认为概率函数服从伯努利分布,而伯努利分布的指数形式就是个sigmoid 函数。 
    函数 <nobr style="margin&#58;0px&#59; padding&#58;0px"> hθ(x) </nobr>表示结果取1的概率,那么对于分类1和0的概率分别为: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> P(y=1|x;θ)=hθ(x)P(y=0|x;θ)=1hθ(x) </nobr>

    概率一般式为: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> P(y|x;θ)=(hθ(x))y((1hθ(x)))1y </nobr>

  2. 最大似然估计的思想 
    当从模型总体随机抽取m组样本观测值后,我们的目标是寻求最合理的参数估计 <nobr style="margin&#58;0px&#59; padding&#58;0px"> θ </nobr>使得从模型中抽取该m组样本观测值的概率最大。最大似然估计就是解决此类问题的方法。求最大似然函数的步骤是:

    1. 写出似然函数
    2. 对似然函数取对数
    3. 对对数似然函数的参数求偏导并令其为0,得到方程组
    4. 求方程组的参数

    为什么第三步要取对数呢,因为取对数后,乘法就变成加法了,且单调性一致,不会改变极值的位置,后边就更好的求偏导。

  3. 构造损失函数 
    线性回归中的损失函数是: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> J(θ)=12mi=1m(yihθ(xi))2 </nobr>

    线性回归损失函数有很明显的实际意义,就是平方损失。而逻辑回归却不是,它的预测函数 <nobr style="margin&#58;0px&#59; padding&#58;0px"> hθ(x) </nobr>明显是非线性的,如果类比的使用线性回归的损失函数于逻辑回归,那 <nobr style="margin&#58;0px&#59; padding&#58;0px"> J(θ) </nobr>很有可能就是非凸函数,即存在很多局部最优解,但不一定是全局最优解。我们希望构造一个凸函数,也就是一个碗型函数做为逻辑回归的损失函数。 
    按照求最大似然函数的方法,逻辑回归似然函数: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> L(θ)=i=1mP(yi|xi;θ)=i=1m(hθ(xi))yi((1hθ(xi)))1yi </nobr>

    其中m表示样本数量,取对数: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> l(θ)=logL(θ)=i=1m(yiloghθ(xi)+(1yi)log(1hθ(xi))) </nobr>

    我们的目标是求最大 <nobr style="margin&#58;0px&#59; padding&#58;0px"> l(θ) </nobr>时的 <nobr style="margin&#58;0px&#59; padding&#58;0px"> θ </nobr>,如上函数是一个上凸函数,可以使用梯度上升来求得最大似然函数值(最大值)。或者上式乘以-1,变成下凸函数,就可以使用梯度下降来求得最小负似然函数值(最小值): 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> J(θ)=1ml(θ) </nobr>

    同样是取极小值,思想与损失函数一致,即我们把如上的 <nobr style="margin&#58;0px&#59; padding&#58;0px"> J(θ) </nobr>作为逻辑回归的损失函数。Andrew Ng的课程中,上式乘了一个系数1/m,我怀疑就是为了和线性回归的损失函数保持一致吧。
  4. 求最小值时的参数 
    我们求最大似然函数参数的第三步时,令对参数 <nobr style="margin&#58;0px&#59; padding&#58;0px"> θ </nobr>偏导=0,然后求解方程组。考虑到参数数量的不确定,即参数数量很大,此时直接求解方程组的解变的很困难,或者根本就求不出精确的参数。于是,我们用随机梯度下降法,求解方程组的值。 
    当然也可以使用牛顿法、拟牛顿法。梯度下降法是最容易理解和推导的,如下是推导过程: 
    梯度下降 <nobr style="margin&#58;0px&#59; padding&#58;0px"> θ </nobr>的更新过程,走梯度方向的反方向: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> θj:=θjαδδθjJ(θ) </nobr>

    其中: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> δδθjJ(θ)=1mi=1m(yi1hθ(xi)δδθjhθ(xi)(1yi)11hθ(xi)δδθjhθ(xi))=1mi=1m(yi1g(θTxi)(1yi)11g(θTxi))δδθjg(θTxi)=1mi=1m(yi1g(θTxi)(1yi)11g(θTxi))g(θTxi)(1g(θTxi))δδθjθTxi=1mi=1m(yi(1g(θTxi))(1yi)g(θTxi))xji=1mi=1m(yig(θTxi))xji=1mi=1m(hθ(xi)yi))xji </nobr>

    第二步推导请注意: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> </nobr>

    那么可以推导: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> δδθjg(θTxi)=eθTxi(1+eθTxi)2δδθj(1)θTxi=g(θTxi)(1g(θTxi))δθjθTxi </nobr>

    因此更新过程可以写成: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> θj:=θjα1mi=1m(hθ(xi)yi))xji </nobr>

    那迭代多少次停止呢,spark是指定迭代次数和比较两次梯度变化或者cost变化小于一定值时停止。
  5. 过拟合问题 
    过拟合问题,即我们求得的回归系数在实验集中效果很好,但之外的数据效果很差。机器学习中的特征基本上是靠人的经验选择的,有可能某一些特征或者特征组合与因变量没有任何关系,即某些 <nobr style="margin&#58;0px&#59; padding&#58;0px"> θi0 </nobr>。所以我们需要把不必要的特征剔除,一般我们使用正则化来保留所有特征,并让它相应的系数 <nobr style="margin&#58;0px&#59; padding&#58;0px"> 0 </nobr>,L1范数正则化后 <nobr style="margin&#58;0px&#59; padding&#58;0px"> θ </nobr>的更新: 
    <nobr style="margin&#58;0px&#59; padding&#58;0px"> θj:=θjα1mi=1m(hθ(xi)yi))xjiλmθj </nobr>

    <nobr style="margin&#58;0px&#59; padding&#58;0px"> λ </nobr>越大,对模型的复杂度惩罚越大,有可能出现欠拟合现象。 <nobr style="margin&#58;0px&#59; padding&#58;0px"> λ </nobr>越小,惩罚越小,可能新出现过拟合现象。spark逻辑回归的随机梯度下降法中,使用的是L2范数正则化。