机器学习之逻辑回归

来源:互联网 发布:中国网络经纪人客户端 编辑:程序博客网 时间:2024/05/03 21:36
  我们知道,线性回归预测的是一个连续值或者任意实数,接下来,我们要解决的是一种0-1问题,也就是一种二分类问题。

逻辑回归在本质上和线性回归是一样的,只是它在特征到结果的映射加入了一层非线性映射,如下所示:
假设函数
其中g(z)函数被称之为sigmoid函数,也可以叫做logistic函数,它的图形如下:sigmoid函数
我们可以看到,sigmoid函数的范围是0~1,这是不是很像我们学习过的概率呢?
而且在0处,输出值为0.5,而逻辑回归就是当映射输出>0.5时,将它分为一类(1),当映射输出<0.5时,将它分为另一类(0)。
接下来我们要考虑的问题是,为什么我们要加入非线性函数呢,为什么我们不能用线性回归呢?
我们看下图:
figure 1
figure 2
我们看第一张图,当点的分布是那样的话,我们在纵轴为0.5处,画一条平行线,然后通过与那条绿色的线的交点作一条垂线,就可以把点分开,但是当再加入偏离比较远的点之后(也叫作噪声),如果我们再那么分类的话,就会出现错误,也就是说,这些噪声点对分类结果的好坏有很大的影响,所以对于这种分类问题,我们是无法用线性回归的。
接下来,就要讨论损失函数的问题,事实上,逻辑回归的损失函数定义也和线性回归不一样。
线性回归损失函数定义:
损失函数
逻辑回归损失函数的定义:
损失函数
这种损失函数是通过交叉熵来定义的。
为什么损失函数要这样定义呢?还记得损失函数的意义是什么吗?我们也叫他惩罚函数啊,也就是说当模型在做判断的时候,如果判断失误的话,我们就要给他很大的惩罚吗,而当判断准确的话,我们就不用给出惩罚啊,这样模型才知道如何调整参数才能使结果更加准确啊。两种损失函数
我们来看这张图,这张图是依据对“1”的结果的预测,对损失函数作比较,
上面的是交叉熵损失函数,下面的是平方误差损失函数,我们从图中看到,当我们预测把它分到0的那类(本来是1的那类,也就是分错了),交叉熵给出的惩罚要远大于平方误差函数的,这也符合我们的原则,因此,用交叉熵定义损失函数更为准确。
接下来,我们用另一种思路来解释。还记得我们是如何计算参数的吗?我们采用的是梯度下降算法,事实上,可以用数学方法证明交叉熵损失函数是凸函数,但是平方误差函数却不是,注意,在本文情况下,因为y只能取0或1,所以不是,接下来,我用台湾大学李宏毅教授的PPT的一部分讲述原因。
figure 1
figure 2
figure 3
从李宏毅教授的PPT可以看出,当我们把损失函数定义为平方误差函数时,当实际分类为1时,而预测为0时,梯度却为0,这显然是不对的,因为没有梯度,那么我们就无法通过迭代而达到我们的目标点,反之也一样,无论是什么结果,梯度都为0,而且我们可以从第三张图看出,平方误差损失函数是一个很平坦的曲面,所以我们永远都不能或者在很长的时间内都无法达到最优解的位置。
逻辑回归和线性回归一样,任然采用梯度下降算法。梯度下降
逻辑回归算法编程不能和线性回归一样,使用简单的梯度下降无法保证收敛,要加入非线性优化。
scipy中的optimize子包中提供了常用的最优化算法函数实现。我们可以直接调用这些函数完成我们的优化问题。optimize中函数最典型的特点就是能够从函数名称上看出是使用了什么算法。下面optimize包中函数的概览:
1.非线性最优化
fmin – 简单Nelder-Mead算法
fmin_powell – 改进型Powell法
fmin_bfgs – 拟Newton法
fmin_cg – 非线性共轭梯度法
fmin_ncg – 线性搜索Newton共轭梯度法
leastsq – 最小二乘
好的,我先写到这里,其实还有很多知识点没讲到,比如过拟合问题,正则化,我有时间的话,以后会写到。大家可以参考吴恩达教授,李宏毅教授的资料学习,这两个人都讲的非常好。
李宏毅教授主页,这个主页上有很多学习资料,如有错误还请见谅

原创粉丝点击