跳至主要內容

逻辑回归

原创Xenny约 2085 字大约 9 分钟机器学习机器学习监督学习逻辑回归

逻辑回归

  • 虽然叫做回归,但逻辑回归实际上是一个分类模型,至于为啥叫回归据我搜索的资料是历史遗留的命名问题。

二分类问题

  • 首先我们需要了解一下什么是分类,在分类问题中,我们将尝试预测一个样本是否属于某一个类,对于最简单的分类问题也就是二元分类问题,它将包含两个类(正和负),我们将因变量可能属于的类分别称为正向类和负向类,例如y=0y^{'} = 0代表负向,y=1y^{'} = 1代表正向,故对于此我们要求模型的输出hθ(x)h_\theta(x)满足0hθ(x)10\le h_\theta(x) \le 1

    如果我们使用线性回归无法满足我们的要求,它的输出可能会很大,而对于逻辑回归将永远输出一个0011之间的结果。当然我们可以定义hθ(x)0.5h_\theta(x)\ge 0.5时,y=1y^{'}=1,反之hθ(x)<0.5h_\theta(x)<0.5时,y=1y^{'}=1,这使得输出值满足我们的要求,但是我们来查看如下数据。

    线性回归1

    例如对于图例,我们按照上述规则使用拟合直线对后续点进行分类,其中黄色点是我们的分解点,显然这个拟合直线可以完成我们的要求,对于样本为正的的点,其预测值都大于0.50.5也代表为正,样本为负的点,其预测值都小于0.50.5代表负。但是如果我们观察到了一个新的样本,可能会使拟合直线变成如下情况

    线性回归2

    此时我们发现再使用0.50.5作为阈值已经不再合适。此时我们将引入逻辑回归来解决此类问题。

逻辑函数

  • 逻辑回归中的假说函数为hθ(x)=g(θTX)h_\theta(x) = g(\theta^T\boldsymbol{X}),其中X\boldsymbol{X}代表特征向量,gg为逻辑函数。

    逻辑函数一般使用S形函数(sigmoid function),表达式为g(z)=11+ezg(z) = \frac{1}{1+e^{-z}}

    该函数图像为

    Sigmoid函数

    通过该假说函数,我们将可以根据选择的参数预测变量=1=1可能性,例如若输出为0.6则代表有60%的几率为正向类。

判定边界

  • 在逻辑回归中,我们预测hθ(x)0.5h_\theta(x)\ge 0.5y=1y^{'} = 1,反之y=0y=0。同时我们根据Sigmoid函数图像也有当z0z\ge0时,g(z)0.5g(z)\ge 0.5,则有θTX0\theta^T\boldsymbol{X}\ge 0时,y=1y^{'} = 1

    我们来看一个具体例子:

    线形判定边界

    其中蓝色点为y=0y=0样本,绿色点为y=1y=1样本,模型输出的假说函数hθ(x)=g(3+x1+x2)h_\theta(x) = g(-3 + x_1 + x_2),也就是说x1+x23x_1+x_2\ge 3时,模型将预测y=1y=1,我们将直线绘制在即上图黄线,这便是我们模型的分界线,它将y=1y=1y=0y=0的区域分隔开。

    有些时候我们的模型数据可能更加复杂,可能会需要用到二次或更多的特征,此时判定边界所绘制的图像也会更加复杂。

    例如,这是一个二次方特征的判定边界图像及其样本数据

    圆形判定边界

    其中hθ(x)=g(θ0x1+θ1x2+θ2x12+θ3x22))h_\theta(x) = g(\theta_0 x_1+\theta_1 x_2 + \theta_2 x_1^2+\theta_3 x_2^2))θ=(1,0,0,1,1)\theta=(-1,0,0,1,1),其判定边界为一个单位圆。

代价函数

  • 在线性回归中我们使用MSE作为代价函数,这依然可以继续在逻辑回归模型中使用,但是如果我们直接将这里的hh带入MSE时,会得到一个非凸函数,这也意味着我们在梯度下降中可能找到的不是全局最小值,所以在逻辑回归中我们将使用新的代价函数。

    在逻辑回归中,通常使用

    J(θ)=1mi=1mCost(hθ(x(i),y(i))) J(\theta) = \frac{1}{m}\sum_{i=1}^m{\mathrm{Cost}(h_\theta(x^{(i)}, y^{(i)}))}

    作为逻辑函数,其中Cost\mathrm{Cost}函数为

    Cost(hθ(x),y)={log(hθ(x)),y=1log(1hθ(x)),y=0 \mathrm{Cost}(h_\theta(x), y) = \begin{cases} -\log(h_\theta(x))&,y=1\\ -\log(1-h_\theta(x))&,y=0\\ \end{cases}

    同时我们也可以将Cost\mathrm{Cost}进一步简化,去掉分段定义让J(θ)J(\theta)变成

    J(θ)=1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))] J(\theta) = -\frac{1}{m}\sum_{i=1}^m{\left[y^{(i)}\log\left(h_\theta(x^{(i)})\right) + (1-y^{(i)})\log\left(1-h_\theta(x^{(i)})\right)\right]}

    此时我们就可以使用梯度下降算法求使得代价函数取最小值的参数,同样我们需要求解J(θ)J(\theta)的梯度θJ\nabla_\theta J,首先我们将hθ(x(i))h_\theta(x^{(i)})带入J(θ)J(\theta)进行化简,有

    J(θ)=1mi=1m[y(i)log(11+eθTx(i))+(1y(i))log(111+eθTx(i))]=1m(y(i)log(1+eθTx(i))+(1y(i))log(1+eθTx(i))) \begin{aligned} J(\theta) &= -\frac{1}{m}\sum_{i=1}^m\left[y^{(i)}\log\left(\frac{1}{1+e^{-\theta^Tx^{(i)}}}\right) + (1-y^{(i)})\log\left(1-\frac{1}{1+e^{\theta^Tx^{(i)}}}\right)\right]\\ &= \frac{1}{m}\left(y^{(i)}\log(1+e^{-\theta^Tx^{(i)}}) + (1-y^{(i)})\log(1+e^{\theta^Tx^{(i)}})\right) \end{aligned}

    θjJ(θ)=θj1m(y(i)log(1+eθTx(i))+(1y(i))log(1+eθTx(i)))=1mi=1m(y(i)xj(i)eθTx(i)1+eθTx(i)+(1y(i))xj(i)eθTx(i)1+eθTx(i))=1mi=1m(y(i)xj(i)1+eθTx(i)+(1y(i))xj(i)eθTx(i)1+eθTx(i))=1mi=1m(y(i)xj(i)+xj(i)eθTx(i)y(i)xj(i)eθTx(i)1+eθTx(i))=1mi=1m(11+eθTx(i)y(i))xj(i)=1mi=1m(hθ(x(i))y(i))xj(i) \begin{aligned} \frac{\partial}{\partial \theta_j}J(\theta) &= \frac{\partial}{\partial \theta_j}\frac{1}{m}\left(y^{(i)}\log(1+e^{-\theta^Tx^{(i)}}) + (1-y^{(i)})\log(1+e^{\theta^Tx^{(i)}})\right)\\ &= \frac{1}{m}\sum_{i=1}^m\left(y^{(i)}\frac{-x^{(i)}_je^{-\theta^Tx^{(i)}}}{1+e^{-\theta^Tx^{(i)}}} + (1-y^{(i)})\frac{x^{(i)}_je^{\theta^Tx^{(i)}}}{1+e^{\theta^Tx^{(i)}}}\right)\\ &=\frac{1}{m}\sum_{i=1}^m\left(y^{(i)}\frac{-x^{(i)}_j}{1+e^{\theta^Tx^{(i)}}}+(1-y^{(i)})\frac{x^{(i)}_je^{\theta^Tx^{(i)}}}{1+e^{\theta^Tx^{(i)}}}\right)\\ &=\frac{1}{m}\sum_{i=1}^m\left(\frac{-y^{(i)}x^{(i)}_j+x^{(i)}_je^{\theta^Tx^{(i)}}-y^{(i)}x^{(i)}_je^{\theta^Tx^{(i)}}}{1+e^{\theta^Tx^{(i)}}}\right)\\ &=\frac{1}{m}\sum_{i=1}^m(\frac{1}{1+e^{-\theta^Tx^{(i)}}}-y^{(i)})x^{(i)}_j\\ &=\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)}) - y^{(i)})x^{(i)}_j \end{aligned}

多分类问题

  • 同样逻辑回归也能用来解决多分类问题,有些时候数据的类别可能有多个y={1,2,3,}y=\{1,2,3,\dots\},此时我们要如何使用逻辑回归来进行分类呢?我们可以使用一对多算法(one-vs-all)来做到。

    假设我们有kk个类别,也就是yy的取值可能是1,2,,k1,2,\dots,k,此时我们将定义kk个分类器,第ii个分类器的假说函数将y=iy=i看为正向类,将其余所有看为负向类。在做预测时我们需要将所有的分类机都运行一遍,对于每一个输入变量输出其最高可能性预测值。

高级优化

  • 共轭梯度法 BFGS (变尺度法) 、L-BFGS (限制变尺度法) 和线性搜索(line search)算法,能够自动确定学习速率。

    详细很复杂,之后再根据是否需求看是直接这里补一些介绍还是开一篇单独讲,先加个todo

过拟合

正则化

  • 同样我们也可以在逻辑回归中使用正则化避免模型过拟合。加上惩罚项后,代价函数变为

    J(θ)=1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]+λ2mj=1nθj2 J(\theta) = -\frac{1}{m}\sum_{i=1}^m{\left[y^{(i)}\log\left(h_\theta(x^{(i)})\right) + (1-y^{(i)})\log\left(1-h_\theta(x^{(i)})\right)\right]} + \frac{\lambda}{2m}\sum_{j=1}^n{\theta_j^2}