Machine Learning-逻辑回归(Logistic Regression)

点击量:1165

本文覆盖Coursera Machine Learning Week 3的内容。

二元分类问题(Binary Classification Problem)
所谓的二元分类问题,指的是他的预测输出结果只有两个值 y = {0,1},比如“预测某封邮件是否为垃圾邮件”就是一个二元分类问题。之所以称之为二元分类是相对于多分类问题(Multi Classfication Problem)而言的,比如识别10个数字就是一个多分类问题(一共有10个类别,分别是0-9)。而二元分类问题的求解是解决多分类问题的基础,具体方法下文会介绍。
现在如果要你使用一个函数来模拟分类问题,你最先想到的肯定是一个分段函数(或者叫阶跃函数:unit-step function),简单的如下:
seg_function
这个函数是非常契合我们对这个问题的直觉的,模型非常简单,大于某个值输出1,否则输出0。看上去很理想,但是这个模型却存在很多问题,比如它不够光滑,不连续,在数学上不容易被处理。那么有没有替代的模型呢?

逻辑回归(Logistic Regression)
为了达到和分段函数一样的效果,并且是连续,光滑的,我们可以使用以下函数来代替分段函数:
$$g(z)=\frac{1}{1+e^{-z}}$$
这个函数被称为Sigmoid Function或者Logistic Function,他的函数图像是一个漂亮的“S型”:
sigmoid_function_image
这个函数模型非常有特点:他的所有的输出均分布在(0,1)之间,并且有如下特征:
$$x=0\Rightarrow y=0.5;\\x\rightarrow +\infty \Rightarrow y=1;\\x\rightarrow -\infty \Rightarrow y=0;$$
当应用在分类问题上时,我们可以把输出结果看成一个概率,当概率大于0.5时把它分类到\(y=1\),否则分类到\(y=0\)。
OK,到这里我们可以总结一下逻辑回归的假设函数了(Hypothesis Function):
$$h_{\theta}(x)=g(\Theta^{T}x)\\z=\Theta^{T}x\\g(z)=\frac{1}{1+e^{-z}}$$

决策边界(Decision Boundary)
当Sigmoid Function应用在分类问题上时,我们可以使用以下公式把输出结果转化成0或者1:
$$h_{\theta}(x)\geq 0.5\Rightarrow y=1\\h_{\theta}(x)< 0.5\Rightarrow y=0$$ 结合我们的假设函数,进一步推导可以得出: $$\Theta^{T}x\geq 0\Rightarrow y=1\\\Theta^{T}x< =\Rightarrow y=0$$ 这个公式看似简单,但它在坐标图像里是有几何意义的,它就像是一个边界一样把不同类别的数据分隔开,因此被称为决策边界。我们来看一个简单的线性模型的决策边界: decision_boundary_linear
这条线的数学表达形式就是:\(x_{1}+x_{2}-3\geq 0\Rightarrow y=1\)。即在这条线右侧的数据为正例,其余为反例。再来看一个非线性的决策边界的图像:
decision_boundary_non_linear
同理,这个圆形的决策边界的数学表达形式就是:\(x_{1}^{2} + x_{2}^{2} -1 \geq 0\Rightarrow y=1 \)。即在这个圆以外的数据为正例,其余为反例。

Cost Function
很自然地,我们可以像线性回归一样使用平方差的和来作为逻辑回归的cost function。简单表示为:\(cost(h_{\theta}(x),y) = (h_{\theta}(x)-y)^{2}\)。我们知道当\(h_{\theta}(x)\)是线性方程时,\(cost(h_{\theta}(x),y)\)则是一个一元二次函数,它是有一个全局最小值的(函数图像为碗型,碗底为最小值)。但是对于逻辑回归而言h(x)并不是线性方程,而是一个很复杂的sigmoid function,那么组合起来的cost function就不是碗型的,它可能有很多个局部最小值,从而无法收敛到全局最小。两者的差异可以简单用如下图像表示:
cost_function_logistic_image
因此这里我们采用对数形式的变体来作为逻辑回归的cost function,具体公式如下:
$$Cost(h_{\theta}(x),y)=\left\{\begin{matrix}-\log(h_{\theta(x)})\ if \ y=1\\ -\log(1-h_{\theta(x)})\ \ if \ y=0 \end{matrix}\right.$$
更直接地,他可以被整合为一个公式:
$$J(\theta) = \frac{1}{m}\sum_{i=1}^{n}Cost(h_{\theta}(x_{i},y_{i}))=-\frac{1}{m}\left [ \sum_{i=1}^{n}y_{i}\log h_{\theta}(x_{i}) + (1-y_{i})\log(1-h_{\theta}(x_{i})) \right ]$$
实际上这个公式是根据“极大似然法(maximum likelihood method)”推导出来的,具体推导原理和过程这里就不写了,有兴趣可以参考这篇文章
那么怎么来理解这个cost function呢?下图的b和c分别是\(y=0\)和\(y=1\)时的函数图像:
logarithmic_transformation
当\(y=0\)时:
$$h_{\theta}(x)\rightarrow 1\Rightarrow Cost=+\infty \\h_{\theta}(x)\rightarrow 0\Rightarrow Cost=0 $$
它所表达的意思是,当样本结果为0,也就是反例时,如果预测结果h(x)很大趋近于1,则cost function是正无穷,这意味着这个预测是不对的;相反地,如果预测结果h(x)趋近于0,则cost function趋近于最小,这意味着这个预测是靠谱的。
逻辑回归的梯度下降跟线性回归的梯度下降是一样的,只不过假设函数变了,这里就不再赘述了。

多分类问题(Multiclass Classification)
这里主要介绍一种被称为“One-vs-all”的处理方法(也有人称之为:One-vs-Rest,个人感觉这个说法更准确),每次将一个类的样例作为正例,所有其他类的样例作为反例来训练N个分类器,如果仅有一个分类器的预测为正例,则对应的分类即为最终分类结果。假设我们要对数字0-9进行识别,也就是说有10个分类。那么具体地,使用向量形式表示y不再是\(y=3\),而是\(y=[0 0 1 0 0 0 0 0 0 0]\)。

过拟合(Overfitting Problem)
所谓过拟合,指的是学习器把训练样本学得“太好”了,对样本数据的预测准确率接近于100%,代价函数接近于0,这样会导致学习器的泛化能力变差。看下两个例子,分别是线性回归和逻辑回归。左边是欠拟合,中间是合适的拟合,右边是过拟合。
linear-regression_overfitting
线性回归

logistics_regression_overfitting
逻辑回归

产生过拟合的主要原因是:选取的特征数量太多了。一般的解决方案有两个:

  • 减少特征的数量,可以手动减少或者使用模型选择算法
  • 正则化(Regularization),保留所有特征,但减少参数\(\theta\)的大小


  • 正则化(Regularization)
    假设我们有一个这样的假设函数:\(\theta_{0}+\theta_{1}x+\theta_{2}x^{2}+\theta_{3}x^{3}+\theta_{4}x^{4}\)。存在某一组参数\(\theta\),使得它过拟合了。过拟合后的函数曲线如下图所示(蓝色那条):
    overfitting_image
    根据示例数据,我们实际需要的是一个光滑的二次函数,而不是像现在这样弯弯曲曲的三次,四次函数。那怎么解决呢?如上面所说我们可以直接把\(x^{3}\)和\(x^{4}\)这两个特征去掉,又或者我们不去掉他们,但可以使这两个特征的权重特别小,也就是\(\theta_{3}\)和\(\theta_{4}\)的值非常小,使得这两个特征值近似于\(\theta\),这样就能解决过拟合的问题了。具体地,我们可以在cost function后面额外加上这两个参数\(\theta_{3}\)和\(\theta_{4}\),比如:
    $$\min_{\theta}\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2}+1000\cdot \theta_{3}^{2}+ 1000\cdot \theta_{4}^{2}$$
    这样一来,要使得这个cost function取得接近于0的最小值,就必须使得\(\theta_{3}\)和\(\theta_{4}\)足够小,因为1000比较大。一般地,我们可以正则化所有参数\(\theta\),并通过一个变量\(\lambda\)来控制他们的大小,这个变量被称为正则化参数(regularization parameter)。详细的公式如下:
    $$\min_{\theta}\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^{2}+\lambda\sum_{j=1}^{n}\theta_{j}^{2}$$
    相应地,线性回归的梯度下降公式就变成:
    \(Repeat{\)
    $$\theta_{0}:= \theta_{0} – \alpha \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{0}^{i}\\
    \theta_{j}:= \theta_{j} – \alpha\left [ \left ( \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)} \right ) + \frac{\lambda}{m}\theta_{j}\right ] \ j\in \left \{ 1,2…n \right \}
    $$

    \(}\)
    同理,逻辑回归的cost function就变成:
    $$J(\theta)=-\frac{1}{m}\left [ \sum_{i=1}^{m}y^{(i)}\log h_{\theta}(x^{(i)}) + (1-y^{(i)})\log(1-h_{\theta}(x^{(i)})) \right ]+\frac{\lambda}{2m}\sum_{j=1}^{n}\theta_{j}^{2}$$
    这里指的注意的是,在计算\(\theta\)的平方和的时候要去除掉第一个参数\(\theta_{0}\)(bias term),为什么呢?因为我们做正则化是为了改变特征值的权重,但是第一个参数\(\theta_{0}\)(bias term)是个独立的调节参数,跟特征值没有关系,所以不需要计算。
    好了,逻辑回归的总结到此结束,下一章我会总结神经网络学习算法。



    课后编程作业已经上传至本人GitHub,如有需要可以参考,但请遵守课堂准则,不要抄袭。

    参考
    coursera machine learning week3
    Why the cost function of logistic regression has a logarithmic expression?
    logistic回归详解一:为什么要使用logistic函数
    http://blog.csdn.net/pakko/article/details/37878837
    逻辑回归损失函数(cost function)

    Machine Learning-逻辑回归(Logistic Regression)》上有1条评论

    1. Pingback引用通告: 深度学习-调参和优化(一) | Eric Fan

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注