本文内容资源来自 Andrew Ng 在 Coursera上的 Machine Learning 课程,在此向 Andrew Ng 致敬。
斯坦福大学机器学习第六课”逻辑回归“学习笔记,本次课程主要包括7部分:
1) Classification(分类)
2) Hypothesis Representation(建模)
3) Decision boundary(决策边界)
4) Cost function(代价函数,成本函数)
5) Simplified cost function and gradient descent(简化版代价函数及梯度下降算法)
6) Advanced optimization(其他优化算法)
7) Multi-class classification: One-vs-all(多类分类问题)
1) Classification(分类)
分类问题举例:
邮件:垃圾邮件/非垃圾邮件?
在线交易:是否欺诈(是/否)?
肿瘤:恶性/良性?
以上问题可以称之为二分类问题,可以用如下形式定义:
其中0称之为负向类,1称之为正向类。
2)分类问题建模
如果分类器用的是回归模型,并且已经训练好了一个模型,可以设置一个阈值:
如果hθ(x)≥0.5,则预测y=1,既y属于正例;
如果hθ(x)<0.5,则预测y=0,既y属于负例;
如果是线性回归模型,对于肿瘤这个二分类问题,图形表示如下:
可以看到,线性回归对预测肿瘤类别处理的并不好。且对于二分类问题来说,线性回归模型的Hypothesis输出值hθ(x)可以大于1也可以小于0。
我们引入一个新的模型,逻辑回归,该模型的输出变量方位始终在0和1之间。
逻辑回归模型的假设是: hθ(x)=g(θTX)
其中:
X代表特征向量
g代表逻辑函数(logistic function),是一个常用的逻辑函数,也称为S形函数(Sigmoid function),公式为:
例如,如果对于给定的x,通过已经确定的参数计算得出hθ(x)=0.7,则表示有百分之70的几率y为正向类,相应地y为负向类的几率为1-0.7=0.3。
3) Decision boundary(决策边界)
如上节所述,逻辑回归模型可以如下表示:
假设给定的阈值是0.5,当hθ(x)≥0.5时, y = 1;
当hθ(x)<0.5时,y = 0;
再次回顾sigmoid function的图形,也就是g(z)的图形:
当g(z)≥0.5时, z≥0;
对于hθ(x)=g(θTx)≥0.5, 则θTx≥0, 此时意味着预估y=1;
反之,当预测y = 0时,θTx<0;
我们可以认为θTx = 0是一个决策边界,当它大于0或小于0时,逻辑回归模型分别预测不同的分类结果。例如,
hθ(x)=g(θ0+θ1x1+θ2x2)
θ0,θ1,θ2 分别取-3, 1, 1,
则当-3+x1+x2大于等于0,即x1+x2大于等于3时,模型将预测y=1。
我们可以绘制直线x1+x2=3,这条线便是我们模型的分界线,将预测为1的区域和预测为0的区域分隔开。
假使我们的数据呈现这样的分布情况,怎样的模型才能适合呢?
因为需要用曲线才能分隔y=0的区域和y=1的区域,我们需要二次方特征:
hθ(x)=g(θ0+θ1x1+θ2x2+θ3x21+θ4x22)
假设参数是[-1 0 0 1 1],则我们得到的判定边界恰好是圆点在原点且半径为1的圆形。
我们可以用非常复杂的模型来适应非常复杂形状的判定边界。
4) Cost function(代价函数,成本函数)
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将 hθ(x)=11+e−θTX 带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convex function)
我们知道,线性回归的Cost Function是凸函数,具有碗状的形状,而凸函数具有良好的性质:对于凸函数来说局部最小值点即为全局最小值点,因此只要能求得这类函数的一个最小值点,该点一定为全局最小值点。
因此,上述的Cost Function对于逻辑回归是不可行的,我们需要其他形式的Cost Function来保证逻辑回归的成本函数是凸函数。
因此我们重新定义逻辑回归的代价函数为:
直观的来解释这个Cost Function,首先看当y=1的情况:
直观来看, 如果y = 1, hθ(x)=1,则Cost = 0,也就是预测的值和真实的值完全相等的时候Cost =0;
但是,当hθ(x)→0时, Cost→∞
直观来看,由于预测的结果南辕北辙:
如果hθ(x)=0, 也就是预测P(y=1|x;θ)=0,也就是y=1的概率是0,但是实际上y = 1
因此对于这个学习算法给予一个很大的Cost的惩罚。
同理对于y=0的情况也适用:
总结:这样构建的Cost(hθ(x),y)函数的特点是:当实际的y=1且hθ也为1时误差为0,当y=1但hθ不为1时误差随着hθ的变小而变大;当实际的y=0且hθ也为0时代价为0,当y=0但hθ不为0时误差随着hθ的变大而变大。
5) Simplified cost function and gradient descent(简化版代价函数及梯度下降算法)
将构建的Cost(hθ(x),y)简化如下:
带入代价函数得到:
对于这个公式,这里稍微补充一点,注意中括号中的公式正是对逻辑回归进行最大似然估计中的最大似然函数,对于最大似然函数求最大值,从而得到参数(\theta)的估计值。反过来,这里为了求一个合适的参数,需要最小化Cost function,也就是:
6) Advanced optimization(其他优化算法)
除了梯度下降算法以外还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS)
minunc是matlab和octave中都带的一个最小值优化函数,使用时我们需要提供代价函数和每个参数的求导,下面是octave中使用fminunc函数的代码示例:
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end;
options = optimset('GradObj', 'on', 'MaxIter', '100'); initialTheta = zeros(2,1); [optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
7) Multi-class classification: One-vs-all(多类分类问题)
多类分类问题中,我们的训练集中有多个类(>2),我们无法仅仅用一个二元变量(0或1)来做判断依据。例如我们要预测天气情况分四种类型:晴天、多云、下雨或下雪。
下面是一个多类分类问题可能的情况:
一种解决这类问题的途径是采用一对多(One-vs-All)方法。在一对多方法中,我们将多类分类问题转化成二元分类问题。为了能实现这样的转变,我们将多个类中的一个类标记为正向类(y=1),然后将其他所有类都标记为负向类,这个模型记作 h(1)θ(x) 。接着,类似地第我们选择另一个类标记为正向类(y=2),再将其它类都标记为负向类,将这个模型记作 h(2)θ(x) ,依此类推。
最后我们得到一系列的模型简记为:
h(i)θ=P(y=i|x;θ)
最后,在我们需要做预测时,我们将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量。