逻辑回归LR(Logistic Regression)原理以及代码实践
简介
逻辑回归应该算得上是机器学习领域必须掌握的经典算法之一,并且由于其简单有效、可并行化、可解释性强等优点,至今仍然也是分类问题中最基础和最受欢迎的算法之一。尽管它的名字里面有“回归”两字,但是实际上它是用来做分类的,“逻辑”两字是其英文名字“Logistic”的音译,实际上是来自于该方法中使用的Logit函数。逻辑回归可以用于一些常见的分类问题,比如垃圾邮件过滤、网上虚假交易识别、肿瘤恶性或者良性的判断等。逻辑回归处理的问题可以简单地看成判断是“0”还是“1”,其输出是一个介于0~1之间的值,表明预测结果属于0或者1的概率。
LR的类型
LR主要可以被分成以下3种:
二值逻辑回归
预测的目标只有2种可能的输出,比如肿瘤的恶性和良性、是否是垃圾邮件等。
多项式逻辑回归
预测的目标类别有三种及其以上,并且不考虑顺序。比如,预测那种食物更受欢迎(苹果,香蕉,橘子等)。
有序逻辑回归
预测的目标类别有三种及其以上,但是顺序很重要。比如,预测用户对电影的评分,从1到5,分值越大说明越受用户喜欢。
决策边界
LR主要是用来处理分类问题,其输出是一个介于0~1之间的概率值,为了预测一个数据究竟属于哪个类别,我们可以设置一个阈值。基于这个阈值,我们就可以来对数据进行分类。下面是逻辑回归过程中决策平面的变化过程:
决策边界
决策平面有助于将模型输出的预测概率分为正负两类,比如下面这个例子:
其中黑色直线的方程为x_1+x_2=3,我们此时就可以设置阈值为3。对于红色叉形的数据,其标签为1,将其带入方程有x_1+x_2 \geqslant 3;对于蓝色圆圈的数据,带入方程有x_1+x_2 \leqslant 3。因此我们就可以说黑色的直线是我们找到的一个合理的决策边界。
线性回归和逻辑回归的区别
线性回归的输出是输入的加权和。逻辑回归并没有直接输出输入的加权和,而是通过了一个激活函数将加权和映射到0~1之间。通过下面的图例来展示他们之间的区别:
线性回归和逻辑回归的区别
可以看到,LR就是在线性回归的基础上增加了一个激活函数。这个激活函数是Sigmoid函数,其表达式为:
Sigmoid表达式
图像如下:
Sigmoid函数
可以看到Sigmoid函数可以把任意的x值压缩到y \in [0,1]之间,而概率值本来就是处于[0,1]之间的,因此把LR的输出看成预测目标属于“0”或者“1”的概率值也是说得通的。
逻辑回归的数学定义
根据上节的内容,我们知道逻辑回归就是在线性回归模型的基础上增加了激活函数,因此我们先来看下线性回归模型的定义:
它其实就是对输入向量x的各个特征赋予相应的权重,来表示各个特征的重要程度,然后再进行加权求和,得到最后的输出。它的输出是一个数值y,因此它是用来解决回归问题的模型。为了表达和计算方便,我们也可以消掉后面的常数项b,可以给输入向量x前面添加一个常数项1,同时把b添加到权重矩阵w中去,即令x’ = [1, x]^T, w’ = [b, w]^T,那么线性回归的表达式就可以转化为:
为了表达方便,我们还是统一使用f(x) = w^Tx这个表达式,但是读者要清楚,完整的线性回归表达式中还有常数项b的存在。
上节已经介绍了Sigmoid激活函数,LR其实就是将线性回归的表达式再放进Sigmoid激活函数中,仅此而已。于是我们就可以得到LR的完整数学表达式:
逻辑回归表达式
对于标准的逻辑回归模型而言,要确定的参数就是特征向量对应的权重向量w。一旦我们得到了权重向量w,我们只需要把输入特征向量x带入方程,得到一个处于[0,1]之间的输出概率值,然后根据提前设置好的阈值来决定输入数据的类别。比如概率值大于0.5,我们认为预测目标类别为1,反之为0。
逻辑回归的损失函数
损失函数是用来衡量模型输出与真实输出之间的差异,它可以指导我们朝着将差异最小化的方向去优化我们的模型。逻辑回归处理的问题的标签就只有"0"和"1"两种,故我们可以令预测结果为正样本(类别为1)的概率为p,预测结果为负样本(类别为0)的概率为1-p,可有如下表达式:
其中p是通过上一节介绍的LR的表达式计算出来的:
我们将预测为“1”和”0“的概率综合起来,可以写成如下形式:
其实这个转变不涉及到什么数学公式,只是为了便于计算和表示简洁而已。它表达的意思跟上面式子是一样的。当y_i=1的时候,结果依旧为p;当y_i=0时,结果为1-p。
论数学的简洁性。😜
上述表达式可以表示单个样本x_i的标签为y_i的概率。假设我们的训练数据包含N个已经标记好的样本,设为x = \left{\left(\boldsymbol{x}{1}, y{1}\right),\left(\boldsymbol{x}{2}, y{2}\right),\left(\boldsymbol{x}{3}, y{3}\right) \ldots\left(\boldsymbol{x}{N}, y{N}\right)\right},这些都是已经发生过的事实,我们需要根据这些样本数据来估计出逻辑回归模型的参数。根据极大似然估计的原理,我们可以写出似然函数:
似然函数
这里的P_总代表的是这些事件同时发生的概率,我们的目的是让这个概率最大(因为这些事件都是已经发生的事实)。
似然函数连乘的形式不便于求导,我们对上式两侧取对数将其变成累加的形式,可以得到:
根据极大似然估计原理,我们需要F(w)越大越好,但是直觉上,这跟损失函数的定义有点违背,因为我们通常希望损失越小越好。处理方法也很简单,我们可以在前面乘以一个-1,这就将求最大值问题转换成了求最小值问题,我们再乘以1/N来计算所有样本数据的平均损失,故最终的损失函数形式为:
怎么来理解这个损失函数呢?下面给出一张图来说明:
当实际标签为1但是模型预测为0的时候,损失函数应该剧烈惩罚这种情况,反之亦然。正如从上图中看到的那样,先看蓝色曲线-log(h(x)),当h(x)接近1的时候,即模型预测为1的时候,损失接近于0;当h(x)接近0的时候,损失接近无穷大。同理,对于绿色曲线-log(1-h(x)),当实际标签为0,模型预测也为0的时候,损失为0;当模型预测为1的时候,损失趋于无穷大。总得来说,就是当模型预测值和实际值一样的时候,损失很小。否则,损失趋于无穷大。这样就可以在模型预测错误的时候,损失也很大,在误差反向传播的时候,计算出来的梯度也很大,可以使模型朝着损失减小的方向快速收敛。
注意,上图中的h(x)对应我们公式中的p,即模型的预测值。
逻辑回归的训练
得到了逻辑回归的目标函数之后,接下来我们需要求出F(w)的梯度,以便后续使用SGD等算法进行优化。在对F(w)求导之前,我们先做一些准备工作,即先对p求导,回想一下概率p的计算公式如下:
p是关于参数w的函数,通过链式求导法则,展开得:
知道了p’之后,也很容易得到(1-p)’ = -p(1-p)x。
下面正式对F(w)求导,求导过程如下:
我们将上式中的p展开,则得到了最终的梯度表达式如下:
在得到了梯度之后,我们就可以使用SGD来对模型的参数进行更新。核心思想是先随机初始化一