博客是我个人学习的心得记录——以及挑战,不见得对,欢迎指正。如果有疑问,欢迎留言探讨,我基本都会回复。
逻辑回归系列如下:
序号 | 内容 | 完成时间 |
---|---|---|
1 | 殊途同归的推导——极大似然概率和最小损失函数,以及正则化简介 | 2018.12.04 |
2 | 不要只是掉包侠——手把手实现logistics算法 | |
3 | 善用现有轮子——sklearn中的logistics如何调参 | |
4 | 连续特征离散化——改善模型的非线性表达能力 | |
5 | WOE转化——变量筛选以及变量转化的其他思路 |
1. 算法推导
介绍算法比较无聊(敲公式也比较累),但是为了完整性,我们快速过下核心推导过程。
逻辑回归试图找到一个分离间隔来区分0类和1类(一般定义我们关心的类别为1类),分离间隔的表达式如下:
一般用向量表示,即:
判别时将其作为sigmoid函数的输入,得到1类的概率 :
求解逻辑回归的过程,就是求解和 的过程。我们通过最小化损失函数或极大似然概率来求解,先说第一种。
1.1 最小化损失函数
损失函数用来衡量预测值和真实值之间的差异,差异越大,损失函数越大。我们关注损失函数的这种特性,反而不关注具体损失是多少。
逻辑回归输出类别的概率,真实的概率是1,则对该类的预测概率越低,损失函数越大。可用 表示,的曲线如下:(注意此时与 不是同个概念,指1类的概率,代表任何一类)
可见:
- 越小,预测得越不准,损失越大。当趋于0,损失趋于无穷大
- 越大,预测得越准,损失越小。当趋于1,损失趋于0
具体对逻辑回归来说
- 当样本属于1类,即 时,预测结果,损失函数为;
- 当样本属于0类,即 时,预测结果,损失函数为
统一起来,单样本的损失函数可表示为:
分别把 和 代进去,会发现这个公式的巧妙之处。
这个损失函数被成为交叉熵损失函数。(关于信息熵,交叉熵,联合熵,条件熵等等各种熵,关系千丝万缕,我们会另外开贴聊)
插句题外话,你如果见过其他资料,可能觉得我说得有点复杂,怎么又是又是的。这样的好处是,当以后你遇到多分类,即sofmax回归的损失函数时,会发现其损失也是通过真实类别的预测概率 来表示的,那时候你就会发现这样理解更统一了。
现在我们的目的是最小化损失函数,采用的方法是梯度下降。简单来说就是:我们要求得一组合适的向量和,使得损失函数 最小。但是没办法直接求得答案,我们通过以下方法求解:(取 向量中一个 为例)
- 随机初始化 和 ,比如说0
- 计算 和 的梯度 、
- 设定一个学习率 ,更新 和 的值: ,
- 迭代执行2-3步骤
- 当满足两个条件之一停止迭代:1)前后两次的值变化小于某个很小的阈值 2)迭代轮次达到某个指定次数。
是一个超参数,需要多次尝试取得最佳值。现在的问题是梯度 、 怎么计算。推导过程如下。
整理一下,现在有如下算式
根据高中学过的复合函数的求导方式(深度学习DNN里称作链式法则——换了个名字我差点认不出你赵二蛋了)
两个等式中都有 、, 先求导得:
则两个相乘,计算得:
求导到这里,算式又变简单了,舒服了。。。接着来,对于一组向量来说,当对某个具体的求偏导,其余可以看做常量,则求导结果为所求对应的。对来说,系数固定为1,则求导结果为1。如下:
综上,最终梯度计算结果如下:
这样, 和 就可以求解了。
最后总结一下逻辑回归的运行过程——用深度神经网络来说,分为前向过程和后向过程。
- 随机初始化 和 ,代入式子计算出得到 (前向过程)
- 根据 计算出 和 的梯度,利用 梯度跟新 b$ 的值(后向过程)
- 根据新的 和 ,继续计算 ,如此重复迭代前向和后向过程,直到满足停止迭代的条件。
多样本的情况
为了便于阐述,上述假设只有单样本。多样本的情况是类似的,假设针对 样本,则平均损失函数为:
求和项的导数,等于各项加数分别求导后再相加。所以基于 个样本的损失函数求得的平均梯度,实际等于分别基于各个样本求得梯度再求平均。即:
- 当 全部样本时,这种方法叫梯度下降,每次迭代采用全部样本,收敛速度较快,但运算速度慢。
- 当 1 时,这种方法叫随机梯度下降,每次迭代随机抽取一条样本,收敛速度较慢,但运算速度快。
- 当 全部样本时,这种方法叫batch梯度下降,一个batch取若干个样本,是上述两种方式的折衷。
1.2 用最大似然估计推导
如上所述,逻辑回归可以输出各个类别的概率,即对于当前给定的样本来说(其实就是给你一堆已知的 ),代入不同 和 ,可以计算得到同一样本的不同概率,把所有样本的概率连乘起来,就是整体样本的概率。那么哪一组 、 是最逼近真实值的最佳估计值呢?最大似然估计内涵在于:以使当前整体样本出现的概率为最大值的那一组 和 作为最佳估计值。
极大似然估计的求解一般分为三个步骤:
- 写出似然函数,一般为一个概率连乘的表达形式。
- 将概率相乘转化为 相加(增减趋势一致)
- 求 相加的最大值
首先假设 和 已知,计算每个样本出现的概率:
- 对于正样本,
- 对于负样本,由于是二分类,所以
则不论是正样本( ),还是负样本( ),一个样本的概率可以统一表示为:
整个样本出现的概率,即似然函数,可以表达为:
求解 的最大值等于求解 的最大值,注意这里 底数必须大于1。当 底数大于1时, 函数是严格单调递增的, 随着 的增大, 也跟着增加。也就是说,我们并不在乎最大具体是多少,我们只在乎在哪个点取得最大值。
所以转化如下:
进一步的,求 的最大值,等于求 的最小值,所以求解目标转化为最小化下式:
有没有惊奇的发现,这个式子不就是上面的损失函数么。于是最终,两种方法,殊途同归。接下来用梯度下降进行求解,剩下的步骤就和上述一致了。
1.3 正则项——修正过拟合
啥叫过拟合:模型过于复杂,以至于把数据噪声也记下来了。
怎么判断过拟合:来自同一数据分布的训练集和测试集效果差异很大,如训练集准确率很高,但测试集没那么高,有显著差异。训练集准确率高,是因为把数据噪声也学习进去了。
怎么解决过拟合:主要有:从算法层面有逻辑回归增加正则处理、决策树减枝、神经网络dropout等,都是为了降低模型的复杂度;从数据层面有增加数据量,使训练数据尽量接近真实数据。
过拟合作为机器学习共有的知识点,并不是逻辑回归专属,所以不过多介绍了,主要简单说说逻辑回归怎么解决。
逻辑回归通过增加或正则项,来降低模型的复杂度,进而减少过拟合。
增加 正则项损失函数如下:
增加 正则项损失函数如下:
也就是说,在计算损失的时候,不仅关注预测值和真实值之间的差距,也关注系数项 的大小。通过控制系数来降低模型复杂度,从而减少过拟合,增加泛华能力。
众所周知,关于 、 正则话的区别如下:
- 正则项能够使相关系较低的特征,对应的系数等于0,得到稀疏的 向量
- 而 正则项倾向将特征的系数缩小趋于0
关于个中原理,我见过很多解释,比较出名的从”损失函数等高线“几何图进行解释的。我自己的理解比较简单,如果有错烦请不吝指出。
不管那种正则项,用梯度下降计算梯度时,前面那部分求导是一致,差别在于后半部分。 的 求导出来是 ,意味着在多次迭代中,不管系数 大小如何, 会比较恒定的加减某个值——即便是 已经很小了,因此比较容易减小为0。而 的 求导出来是 , 当 比较小的时候, 也比较小,所以会减去一个较小的值,不断区域0但不会等于0。
逻辑回归(1)到此结束,本来打算理论只写1500,结果现在3000+了,我还是太啰嗦了……
下一篇是不掉包,手动实现逻辑回归。(终于不用敲公式了 ……)