Logistic Regression
Table of Contents
1. Logistic 回归简介
假设我们想对一些数据进行二分类处理。我们希望有这么一个函数能接受所有的输入,且输出只有二个值:如 0 或者 1。单位阶跃函数(Heaviside step function)就是一个满足这个条件的函数,但单位阶跃函数不是连续的,在跳跃点从 0 突然跳跃到 1,这有时比较难处理。Sigmoid 函数(又称为 Logistic 函数)是另一个具有类似性质的函数,Sigmoid 函数如下:
其对应的曲线图(和单位阶跃函数很像)如图 1 所示。
Figure 1: Sigmoid Function
当自变量为 0 时,Sigmoid 函数值为 0.5,随着自变量的增大,对应的 Sigmoid 值将逼近于 1;随着自变量的减小,对应的 Sigmoid 值将逼近于 0。
参考:机器学习实战,第 5 章 Logistic 回归
1.1. Logistic 回归分类器
Logistic 回归分类器的思路为:我们把每个特征上都乘以一个系数,然后把所有结果值相加(还可能加上一个偏置量),将这个总和代入 Sigmoid 函数中,这将得到一个范围在 0 到 1 之间的数值,如果大于 0.5,则把数据归为 1 类;如果小于 0.5,则把数据归入 0 类。
即 Sigmoid 函数的输入由下式得到:
若把
则 Logistic 回归模型可写为(下式中,
1.2. Logistic 回归可看作概率估计
Sigmoid 函数的输出值在 0 到 1 之间,所以 Logistic 回归可以看作是概率估计: Logistic 回归的输出看作是
对于给定的输入数据
1.2.1. 用 logit 函数表示 Logistic 回归模型
一个事件的几率(odds)是指该事件发生的概率与该事件不发生的概率的比值。例如,如果事件发生概率为
对于 Logistic 回归模型来说,有:
有时,我们用 logit 函数来表示 Logistic 回归模型。
1.3. Logistic 回归模型的参数估计
如何通过训练数据集估计 Logistic 回归分类器的参数向量
对于给定的训练数据集
记
则训练数据集的似然函数为:
其对数似然函数为:
对上式求极大值,取极大值时对应的
对于最优化问题,我们习惯于解决极小化问题,对上式(对数似然函数)的极大化相当于极小化它的相反数,所以我们可以认为 Logistic 回归的损失函数为对数似然函数的相反数 :
对损失函数最小化,取极小值时对应的参数
1.3.1. 用梯度下降法最小化损失函数
可以用梯度下降法求得损失函数最小时对应的参数值。梯度下降法是一种迭代算法,其参数更新公式为:
我们按下面规则迭代更新 Logistic 回归模型参数
上式中的
说明 1:上面的推导过程仅仅用了求导的一些基本知识,如复合函数求导的链式法则(Chain rule),求导公式
说明 2:本文中,
所以,最后可以得到 Logistic 回归模型参数
其中,
1.3.2. 用随机梯度下降法加快速度
前面得到的随机梯度下降法参数迭代公式中有
一种改进办法是采用随机梯度下降法(Stochastic Gradient Descent, SGD), 随机梯度下降法每次仅使用一个训练数据来更新参数。 随机梯度下降法的参数迭代公式为:
其中,
说明 1:随机梯度下降法可以在新训练数据到来时,对 Logistic 回归分类器进行增量式更新,所以 随机梯度下降法是一个“在线”学习算法 ;与“在线”学习相对应,一次处理所有训练数据的方式被称为是“批处理”。
说明 2:应该注意上面的参数迭代公式有一个前提是分类标记
1.3.2.1. 分类标记 时的损失函数
前面推导出来的公式,要求
记
从而,似然函数为:
对数似然函数为:
对应的损失函数即为:
上式中,
参考:
Machine Learning - A Probabilistic Perspective, 8.3.1 MLE
http://beader.me/2014/05/03/logistic-regression/
1.3.3. 选择合适的学习率
梯度下降公式中的学习率(又称步长)
Figure 2: The 'Goldilocks' Step Size
如何选择合适的步长?这个问题没有标准答案,基本上需要通过测试确定。 简单的做法是选择随迭代次数增加而逐渐减小的
参考:
http://www.cs.rpi.edu/~magdon/courses/LFD-Slides/SlidesLect09.pdf
https://www.quora.com/What-is-the-best-way-to-choose-the-step-size-in-stochastic-gradient-descent
1.3.4. 为什么不选择平方损失函数
如果使用平方损失函数,则每个数据产生的损失(误差)为:
其中,
使用平方误差和
而对于非凸函数的优化是非常困难的(注:梯度下降法要求被优化函数是凸函数)。非凸函数由于存在很多个局部最小点,比较难去做最优化(求全局最小点)。所以 Logistic 回归不使用平方损失函数。
参考:
http://beader.me/2014/05/03/logistic-regression/
http://www.holehouse.org/mlclass/06_Logistic_Regression.html
1.3.5. 用牛顿法和拟牛顿法最小化损失函数
前面已经介绍过梯度下降法和随机梯度下降法最小化损失函数。牛顿法(Newton method)和拟牛顿法(Quasi-Newton method)也是求解无约束最优化问题的常用方法,可以用来最小化 Logistic 回归模型的损失函数。这里不详细介绍。
牛顿法和拟牛顿法的优点在其收敛速度一般比梯度下降法更快,而且无需手动选择学习率(即步长)。 不过牛顿法和拟牛顿法的计算相对比梯度下降法复杂。
2. Logistic 回归实例
A researcher is interested in how variables, such as GRE (Graduate Record Exam scores), GPA (grade point average) and prestige of the undergraduate institution, effect admission into graduate school. The response variable, admit/don't admit, is a binary variable.
通过“GRE”,“GPA”,“本科学校的等级”三个指标,建立模型来预测“研究生是否录取”。部分的训练数据如下:
## admit gre gpa rank ## 1 0 380 3.61 3 ## 2 1 660 3.67 3 ## 3 1 800 4.00 1 ## 4 1 640 3.19 4 ## 5 0 520 2.93 4 ## 6 1 760 3.00 2
3. 防止“过拟合”
什么是过拟合(overfitting)? 当模型开始拟合训练数据中的噪声时,就称之为过拟合。
图 3 是用多项式拟合曲线的例子,其最右边的子图就是“过拟合”。
Figure 3: “欠拟合”和“过拟合”
过拟合的模型尽管其训练误差很小,但模型对于它没有见过的数据没有泛化能力,即模型泛化能力太差。
交叉验证和正则化(又称规则化)可以防止过拟合,下文将介绍它们。
3.1. 用交叉验证防止“过拟合”
交叉验证的思想是:模型在拟合过程中不使用全部的历史数据,而是保留一部分数据,用来模拟未来的数据,对模型进行检验。
3.2. 用正则化防止“过拟合”
过拟合一般使模型变得过于复杂。
什么是模型的复杂度呢?如果要给多项式拟合的模型定义复杂度,则可以认为多项式的次数越高模型越复杂,如 5 次多项式模型比 2 次多项式模型要复杂得多。
对于 Logistic 回归,我们可以用特征的权重来表示模型的复杂度。
这样,为了避免过拟合(模型太复杂),我们可以把所有权重之和(为了避免正负抵消,取权重的绝对值)放入到损失函数中。
如,重定义损失函数为:
上式称为 L1 正则化(L1 regularization) 。式中,
还有其它正则化手段,如定义正则化因子为权重平方和,这称为 L2 正则化(L2 regularization) 。
3.2.1. L1 VS L2 Regularization
实际应用时,我们数据的维度可能很高, L1 正则化的一个重要优点是能产生稀疏解(即有很多权重为零),这可以实现“特征选择”。
为了便于可视化,我们考虑两维的情况,如图 4 所示。在
Figure 4: L1 VS L2 Regularization
可以看到,l1-ball 与 l2-ball 的不同在于它和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置为产生稀疏性,例如图中的相交点就有
相比之下,l2-ball 就没有这样的性质,因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么 L1 regularization 能产生稀疏性,而 L2 regularization 不易产生稀疏性的原因了。
参考:
Pattern Recognition and Machine Learning, 3.1.4 Regularized least squares
http://freemind.pluskid.org/machine-learning/sparsity-and-some-basics-of-l1-regularization
http://blog.csdn.net/zouxy09/article/details/24971995
4. 非线性情况
5. 多个分类情况
5.1. one vs. rest
默认 Logistic 回归仅输出两个分类。怎么让它处理多个分类的情况呢?可以采用“one vs. rest”方法(也称为“one vs. all”方法)。
Figure 7: Multi-class 分类
“one vs. rest”方法的描述如下:
对每一个类分别训练出一个唯一的分类器,如图 7 所示的例子中我们一共可得到 3 个分类器,如图 8 所示。 对于输入数据,分别计算每一个分类器下的输出值,取“输出值最大的那个分类器对应的类别”作为预测类别。
Figure 8: 对每一个类分别训练出一个唯一的分类器
参考:
https://en.wikipedia.org/wiki/Multiclass_classification
http://www.holehouse.org/mlclass/06_Logistic_Regression.html
5.2. Softmax 回归
Softmax 回归是 Logistic 回归模型在多分类问题上的推广。
参考:http://deeplearning.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92
6. Logistic 回归 VS 线性回归
线性回归假设各个特征和结果满足线性关系:
其中,
说明:不满足线性关系也没关系,因为我们可以把特征映射到一个函数(如对某个特征求平方),然后再参与线性计算,这样特征与结果之间是非线性关系。
一般地,线性回归模型的输出是一个连续的值,如明天的温度是多少度、下月本市平均房价;而 Logistic 回归虽然是叫“回归”,其实本身是用来“分类”的,它的输出是 Categorical 值,如“true/false”、“明天会下雨/明天不会下雨”等等。
用线性回归也可以解决分类问题,指定一个阈值即可。例如,要测试明天温度是“冷/热”中哪一个,用线性回归预测具体温度后,使用一个阈值,既可划分为“冷/热”中的某一类了。
可以认为 Logistic 回归也包含线性回归过程,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数
7. 再议 Logistic 回归损失函数
7.1. 交叉熵(Cross-Entropy)
在信息论中,设离散随机变量
当熵定义中对数以 2 或以
关于同一组事件
当两个分布完全相同时,交叉熵取最小值
下面是交叉熵的应用实例(例子摘自http://www.cs.rochester.edu/u/james/CSC248/Lec6.pdf)。
假设离散随机变量
0.4 | 0.1 | 0.25 | 0.25 | |
0.25 | 0.25 | 0.25 | 0.25 | |
0.4 | 0.1 | 0.1 | 0.4 |
求
由于
7.2. 交叉熵损失函数(Cross-Entropy Cost Function)
在 Logistic 回归中,
记
我们可以使用交叉熵
我们知道,交叉熵
设有
这和前文利用对数似然得到 Logistic 回归损失函数是一致的。Logistic 回归中, 对数似然损失(Log Likelihood Loss)函数就是交叉熵损失(Cross-Entropy Cost)函数。
参考:
https://en.wikipedia.org/wiki/Cross_entropy#Cross-entropy_error_function_and_logistic_regression