上一篇:机器学习笔记(4)——多变量线性回归
逻辑回归实际是一种有监督学习中的分类算法,称为回归是历史原因
前言
前面我们已经学习了线性回归,线性回归适用于预测一个连续值,就是说预测值可能的范围存在连续,比如前面讲的房价问题,房价可能的值就是一个连续的范围(比如0~10w),但是它不能很好的处理分类问题,也就是要预测一个离散值(如0,1,2),比如判断一封邮件是否为垃圾邮件,预测值只有1和0两种,其实可以领会到线性回归是对样本整体的一个统计平均,就像一个和事佬,哪边大预测函数的整体趋势就往哪边走一点,而这种思想并不能坚定的将样本分为几类每一类都有自己的立场,如下图案例所示,真实临界点两边的样本平均特征值相差越大,线性回归的预测效果就越差,数据集不一样会严重影响预测效果。那么对于处理这种分类问题,就要用到逻辑回归算法。
分类问题和线性回归问题一个很大的区别就是分类问题的样本集中的样本的特征值只要超过了真实临界点,那么无论特征的值多大或者多小,样本的值都是一个常数(1或0),就不存在像线性回归问题那样的线性相关关系,对于线性回归来说不同的样本集同样可以分析出其内在的线性关系,而如果对于分类问题也采用线性回归的方法的话不同的样本集预测效果的差异就非常之大了
一、二分类的逻辑回归及其预测函数
我们先通过讨论二分类(就是预测结果只有1和0两种)来理解逻辑回归,其逻辑回归预测函数的形式是在线性回归预测函数的外面再套一个g(z),可以观察下图右边g(z)的函数曲线,它能把函数的输出值压缩在(0,1)内,这样就能把因样本集不同而产生的趋势差异压缩在合理的范围内,使得预测结果更接近真实结果。这个函数g(z)叫激活函数(Sigmoid函数,也称为逻辑函数,这就是逻辑回归名称的由来)。
那么预测函数h()输出的值就是预测结果为1的可能性,当h()输出值大于等于0.5(也就是z>=0)时,我们就可以判断就判断预测结果为1,当输出值小于0.5(也就是z<0)时,就判断预测结果为0。那么z=0这个边界就很重要,我们应该如何设计一个z=0的边界函数,能够将特征空间划分为两部分,使得空间中满足z>=0的部分中尽量是样本集中值为1的样本的特征向量,满足z<0的部分中尽量是值为0的样本的特征向量呢?
1. 决策边界(Decision Boundary)
假设样本只有x1,x2两个特征,并且两类样本在空间中呈如下分布,那我们就可以假设z=0是一个线性函数:θ0 + θ1x1 + θ2x2 = 0,假设就是-3 + x1 + x2 = 0(如何推导出参数向量下面会讲),那么这条边界下方的特征点代入z都是小于0,边界上方的特征点代入z都是大于0,这样把空间中的样本划分为两类的边界z=0就叫决策边界。
如果样本在特征空间中呈如下分布,那么我们应该如何划定决策边界z=0呢,其实解决方法前面讲多变量线性回归时也提到过,就是添加额外的高阶多项式,如下图上边,添加额外两个特征x12和x22,再通过调整参数向量就可以获得一个圆形的决策边界,再比如下图下边,通过添加更复杂的多项式作为额外特征,可以使我们获得更复杂的决策边界而不只是简单的直线。
2. 代价函数
这里我们同样是通过代价函数来确定上述预测函数的参数θ。但是逻辑回归的代价函数形式就不再是平方误差函数了,因为我们前面也看到了逻辑函数的预测函数h(x)是个比较复杂的函数,如果代入到平方误差函数会发现J(θ)的函数图像是凹凸不平的(如下图左边所示),专业术语叫非凸函数,那么对于这样的代价函数进行梯度下降很难得到一个合适的局部最低点,而我们希望的代价函数的函数图像应该是一个凸函数(如下图右边所示,如果J(θ)函数图像是三维的那对应的凸函数就是碗状的),这样我们进行梯度下降时就比较容易得到一个有用的局部最低点。
这里再强调一下,代价函数就是以某种形式计算每个样本的特征代入预测函数得到的预测值hθ(x)与其真实值y的误差的总量J(θ),我们的目标就是求得J(θ)最小值点(即总误差或者说总代价最小)时的一组参数θ(θ就是代价函数中的变量),从而构造出更精准误差更小的预测函数hθ(x)。那么这里说的计算每个样本代价的某种形式可以是预测值直接减去真实值得到的差值,也可以是像之前线性回归那样差值的平方,只要是能正确反映出预测值与真实值存在的差异,并且使得代价函数容易求出最小代价点就可以了。
这里我们使用对数函数的形式来设计逻辑回归的代价函数,并且分为两部分处理,当样本值为1时,每个样本的代价Cost用-log(hθ(x))表示,这很容易理解,当预测值接近真实值1时,代价Cost就会趋近于0,当预测值接近于0时,偏离真实值偏得很远,我们就要用很大的代价值来惩罚这个算法,代价Cost就会激增至无穷大。
当样本值为0时,每个样本的代价Cost用-log(1 - hθ(x))表示,这样当预测值接近真实值0时,代价Cost就会趋近于0,当预测值偏离真实值接近于1时,代价Cost同样激增至无穷大。那么这样定义逻辑回归的代价函数其凸性就会比较好(证明超出目前范围,是由极大似然法得出的),我们就能用梯度下降很好的迭代出它的最低点了。
上述两部分Cost其实可以合并到一个式子中去计算,如下,这也很容易理解
那么二分类逻辑回归的代价函数J(θ)最终的形式就是如下:
3. 梯度下降
再来使用梯度下降的方法最小化上述代价函数,梯度下降的方式还是和之前一样,选择一个起始点θ,在一轮迭代中,对于每一个θj都减去当前位置对其的偏导数,然后得到一个新的θ点,这样不断对θ点进行迭代,直到θ的变化越来越小最后趋近收敛,最后就能得到一个J(θ)的最低点。这里θj的偏导数计算出来就是如下面红色的笔记所示,可以自己尝试计算一下
在上一篇文章中讲的通过画获取的J(θ)最低点随迭代过程变化的曲线图来观察梯度下降是否有正确运行,以及通过特征缩放来提升梯度下降速率,这两种梯度下降使用技巧同样可以在这里使用。
4. 高级优化算法
除了梯度下降,还有一些更高级的优化算法可以用来迭代代价函数J(θ)的最低点,如共轭梯度法 BFGS (变尺度法) 和L-BFGS (限制变尺度法) ,使用这些算法我们就不需要手动去选择学习率α了,它们内部使用了一种线性搜索(line search)算法,可以自动尝试不同的学习速率 ,并自动选择一个好的学习速率 ,并且它们往往最终收敛得远远快于梯度下降。对于大型的机器学习问题,特征数目十分庞大,梯度下降运行速率过慢,就推荐使用这些高级算法。但这些算法理解和实现起来非常复杂,通常不推荐手动去实现其代码,而是直接调现有的库。
二、多分类的逻辑回归
有时候我们可能需要把样本分为很多类而不是简单的二分类,但其实逻辑回归处理多分类问题的思想与二分类是一样的,就是把一类当做一类,剩余的当做另一类,这样就转换为了二分类问题,那么有多少类就执行几次这样的二分类,就能完成多分类的问题了。
版权归原作者 程光CS 所有, 如有侵权,请联系我们删除。