Logistic回归又叫做逻辑回归,虽然叫做回归算法,但是逻辑回归实际上是分类算法,常用于二分类。
一、分类问题
分类问题包括二分类和多分类,我们先从二分类开始。
(一)肿瘤病人案例
肿瘤病人的样本集是对肿瘤进行恶性或良性分类得到的数据集,注意标签只有恶性或良性两个值,0代表良性,1代表恶性。我们将线性回归算法应用到这个数据集, 如下图所示,其中x中代表肿瘤大小,y轴表示良性0、恶性1:
如果我们想预测,可以将分类器的输出阈值设置为0.5。如果,预测为恶性;如果
,预测为良性。
线性回归看似能很好的解决分类问题,但是会存在很多问题,我们将x轴延长,在较远的地方得到一个新的样本,重新训练线性回归模型(图中的蓝色线),将阈值还是设置为0.5,会发现以下情况:由于新样本的加入,有的样本被错分了。
这证明,线性回归并不是一个很好的分类算法。
还有一个问题,我们在使用线性回归时,样本的标签只有0和1,但是得到的结果常常远远大于1或者远小于0。这也是有些问题的。
二、Logistic回归算法
(一)假设陈述
前面提到,我们期望模型的输出值在0和1之间,因此我们提出一个假设来满足该性质。
对于线性回归,我们的假设函数为:
对于Logistic回归,我们对假设函数进行一些修改:
我们对g函数定义如下:
( 其中z为实数)
这个g函数就是经典的Sigmoid函数或者Logistic函数,这两个术语意思是一样的,可以互换,这也是逻辑回归名字的由来。
我们将两个公式进行合并,得到逻辑回归的假设函数:
推出
Sigmoid函数图像在负半轴无限趋近于0,在原点处为0.5,在正半轴无限趋近于1,如下所示:
因为g(z)函数的取值在0到1之间,所以的取值也在0到1,所以我们就可以和之前一样用这个假设函数来拟合数据。
(二)模型解释
对于的输出,我们将它看做是对于输入变量x,输出y的概率估计。比如,我们用上面肿瘤分类的例子,我们有一个特征向量x,与当初训练线性模型一样,让
=1,然后另一个特征
是肿瘤的大小
假设有一个病人来了,他的肿瘤是某个大小,把他的特征向量x代入到假设函数中,假如得到的输出为0.7。那么模型被解释为:对于一个特征为x的患者,y=1的概率为0.7。换句话说,这个患者有70%的可能性是恶性肿瘤。
用概率分布的公式来解释就是
这个表达式的意思是在给定x的条件下y=1的概率,其中这个概率的参数是
在二分类问题中,结果只能是0或1,所以,对给定的特征向量x,患者肿瘤是良性和恶性的概率加起来一定是1
(三)决策边界
我们上面提到,逻辑回归的假设函数是:
我们刚刚提到,的值可以看成是y=1时的概率,所以我们可以将概率大于等于0.5时,认为y=1;小于0.5时,y=0。我们观察g(z)的函数图像可以发现,只要z≥0,则g(z)≥0.5。由于
,所以只要
≥0,则
≥0.5,此时y=1。同理可得, 只要
<0,则
<0.5,此时y=0
现在假设我们有一个数据集如下所示
该数据集的假设函数为:
假设我们已经计算出了各个的值,
,
,
,即
所以根据刚刚提到的“ 只要≥0,则
≥0.5,此时y=1”,可知“y=1”时,
即
,我们把“
”这条线画在数据集的图像中,如下图所示:
图像中,直线的右上半部分对应的是的部分,也就是预测为y=1的部分;直线的左下半部分对应的是
的部分,也就是预测为y=0的部分。其中,这条粉红色的直线就是决策边界。这条线上的点就是h(x)正好等于0.5的区域。
现在,我们再看一个复杂的案例,和上面一样,我们使用X表示正样本,○ 表示负样本,那么我们该如何使用逻辑回归来划分这些数据呢?
之前,我们在学习多项式回归和线性回归中,发现可以添加额外的高阶多项式项来拟合复杂非线性模型。对于逻辑回归,我们也可以使用同样的方法。
假如假设函数是下面这个的,我们额外添加了两项多项式:
现在我们有了到
五个参数,假设五个参数的值分别为:
,
,
,
,
,如果预测“y=1”,那么可推出
化简得到:
,这条曲线是一个以原点为圆心,半径为1的圆,我们把它画在图上,这就是这个数据集的决策边界。
在圆上的点就是的点,也就是h(x)正好等于0.5的区域,在圆圈外面的点,我们预测为1,在圆圈里面的点,我们预测为0.
决策边界不是训练集的属性而是假设本身及其参数的属性。只要给定了假设方程的参数就确定了决策边界。
(四)代价函数
设训练集为:{(),(
),...,(
)}
则m个特征向量的x矩阵为:,其中
=1,表示常数值,
到
对应训练集中的
到
此时解决的是二分类问题,所以标签只存在0和1两种情况,即
逻辑回归的假设函数为:
化简得到
其中的就是我们要计算的最佳参数值向量。
在线性回归中,我们使用的损失函数为,则线性回归中的每项的损失可以表示为
,在线性回归中,每个样本的损失值被定义为预测值
和真实值y的差值的平方的二分之一。但是在逻辑回归中,该函数会变成一个非凸函数,因为在逻辑回归中,
,是一个非线性的函数,从而导致代价函数
极有可能是下图中左边这样,存在大量的局部最优解,而我们需要的是右边这样的单弓形的凸函数,这样才能更好的使用梯度下降法。
所以,我们需要另外找一个符合我们要求的损失函数,尤其是由于Sigmoid函数存在e的n次方的形式,我们提出的逻辑回归的损失函数如下:
为Sigmoid函数,取值范围为(0,1),所以在y=1时,
在(0,1)区间上的取值范围为
;在y=-1时,
在(0,1)区间上的取值范围为
,这个损失函数在实际值y和预测值
一致时,损失值为0,相反时,损失值趋近于正无穷。
| |
y=1时的损失值函数图像 | y=0时的损失值函数图像 |
(五)简化代价函数与梯度下降
逻辑回归的整体损失函数如下:
为了更好的使用梯度下降法,我们将Cost函数合并为一个,无论y=0还是y=1,Cost函数如下:
这个函数,其实将y=0或y=1代入,就是原始的Cost这种形式,只是简化写法而已。
所以,逻辑回归的整体代价函数,就可以写成如下形式:
这个式子其实是从统计学中的极大似然法得到的。它是一个很好的凸函数。
现在需要找出让取得最小值的参数
,与线性回归同理,我们需要重复的进行
减去学习率α乘以
的导数:
,同时更新所有
可以看出这个下降更新的式子是和线性回归完全一样的。但是其中的假设函数
存在不同。线性回归中
是一个线性函数,而逻辑回归中,
是一个非线性的
(六)高级优化
高级优化方法主要为了提升逻辑回归的训练速度和应对特征或样本数巨多的数据集。
除了梯度下降法外,还有很多优秀的优化算法,如共轭梯度法(Conjugate gradient),拟牛顿法(BFGS),有限内存的BFGS算法(Limited-Memory BFGS,L-BFGS),这三种方法都有很优越的性能,并且不需要手动选择学习率α。这三种算法的思路是给出计算导数项和代价函数的方法,采用智能内循环的方式自动计算,这种方式被称为线搜索算法,他们会自动尝试不同的学习速率α并自动选择一个最好的学习速率,他们甚至可以为每次迭代选择不同的学习速率。通常,他们的收敛速度远远快于梯度下降
三、多元分类:一对多
(一)多元分类任务
现实中的分类问题不止包含二元分类,常常是多元分类任务,如邮件的标签可能存在工作、朋友、家人、兴趣四个标签;天气可以分为晴天、多云、雨天、雪天等多种,这些都是多元分类问题。相比于二元分类问题,多元分类问题的数据集形状如下图右半部分,左半部分对应的是二元分类数据。
(二)一对多(one-vs-rest)
一对多的多元分类方法,也被称为一对余方法,英文名称one-vs-rest,简写为OVR,主要思想是训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个分类器,然后根据每个分类器给出的正类的概率大小判断样本归属。
如上图所示,该数据中存在三个类别,Class1,Class2,Class3,根据OVR的思想,我们需要将它转换为三个独立的二元分类问题。首先从三角形的类别Class1开始,将Class1作为正样本,剩余的Class2/3作为负样本创建一个新的数据集,训练一个逻辑回归分类器,从而得到第一个决策边界;同理,将Class2作为正样本,剩余的Class1/3作为负样本创建一个新的数据集,训练一个逻辑回归分类器,从而得到第二个决策边界,依次得到三个分类器。这三个分类器的正类分别为Class1,Class2,Class3,将样本输入三个分类器,比较每个分类器给出的概率大小,判断该样本属于哪个类别(概率最大的类别)。
(三)一对一(one-vs-one)
一对一,英文名称one-vs-one,简写为OVO,一次选取任意两个类别的样本,在选取的两个样本之间构建一个二元分类器。如果是n个类别样本就需要构建n(n-1)/2个二元分类器。在测试一组数据时,对这n(n-1)/2个分类器的预测结果进行集成以获得最终分类结果,最终的结果为所有预测结果中最多的那一个。
举例:
假设有A,B,C,D四类。在训练的时候我选择A,B; A,C; A,D; B,C; B,D; C,D所对应的样本作为训练集(4*3/2=6个二元分类模型),然后得到六个训练结果,在测试的时候,把对应的向量分别对六个结果进行测试,然后采取投票形式,最后得到一组结果。投票过程如下:
首先将权重值都设为零A=B=C=D=0;
对于使用(A,B)子数据集训练的分类器,如果分类结果是A,则A=A+1,即A类得一分;否则,B=B+1,即B类得一分;同理:
(A,C)训练的分类器,如果是A win,则A=A+1;否则,C=C+1;
...
(C,D)训练的分类器,如果是C win,则C=C+1;否则,D=D+1;
最后根据各类的得分,选择得分最高的类别作为最终类别。
(四)两者的优势和劣势
一对多 | 优点:训练k个分类器,个数较少,其分类速度相对较快。 |
一对一 | 这种方法虽然好,但是当类别很多的时候,分类器的个数是n*(n-1)/2,代价还是相当大的。与一对多相比不会有样本不属于任何一类的情形出现,但是复杂度变大了。 |