《吴恩达机器学习》学习笔记003_逻辑回归、正则化

http://www.ai-start.com/ml2014/html/week3.html

逻辑回归(Logistic Regression)

分类问题

如果我们要用线性回归算法来解决一个分类问题,对于分类, $y$ 取值为 0 或者1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于0,即使所有训练样本的标签 $y$ 都等于 0 或 1。尽管我们知道标签应该取值0 或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在0到 1 之间。

顺便说一下,逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签 $y$ 取值离散的情况,如:1 0 0 1。

假说表示

在这段视频中,我要给你展示假设函数的表达式,也就是说,在分类问题中,要用什么样的函数来表示我们的假设。此前我们说过,希望我们的分类器的输出值在0和1之间,因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在0和1之间。

回顾在一开始提到的乳腺癌分类问题,我们可以用线性回归的方法求出适合数据的一条直线:
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
根据线性回归模型我们只能预测连续的值,然而对于分类问题,我们需要输出0或1,我们可以预测:

当${h_\theta}\left( x \right)>=0.5$时,预测 $y=1$。

当${h_\theta}\left( x \right)<0.5$时,预测 $y=0$ 。

对于上图所示的数据,这样的一个线性模型似乎能很好地完成分类任务。假使我们又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入到我们的训练集中来,这将使得我们获得一条新的直线。
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
这时,再使用0.5作为阀值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越[0,1]的范围,并不适合解决这样的问题。

我们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。 逻辑回归模型的假设是: $h_\theta \left( x \right)=g\left(\theta^{T}X \right)$ 其中: $X$ 代表特征向量 $g$ 代表逻辑函数(logistic function)是一个常用的逻辑函数为S形函数(Sigmoid function),公式为: $g\left( z \right)=\frac{1}{1+{{e}^{-z}}}$。

python代码实现:

import numpy as np
    
def sigmoid(z):
    
   return 1 / (1 + np.exp(-z))

该函数的图像为:

《吴恩达机器学习》学习笔记003_逻辑回归、正则化
合起来,我们得到逻辑回归模型的假设:

对模型的理解: $g\left( z \right)=\frac{1}{1+{{e}^{-z}}}$。

$h_\theta \left( x \right)$的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性(estimated probablity)即$h_\theta \left( x \right)=P\left( y=1|x;\theta \right)$ 例如,如果对于给定的$x$,通过已经确定的参数计算得出$h_\theta \left( x \right)=0.7$,则表示有70%的几率$y$为正向类,相应地$y$为负向类的几率为1-0.7=0.3。

判断边界

现在讲下决策边界(decision boundary)的概念。这个概念能更好地帮助我们理解逻辑回归的假设函数在计算什么。
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
在逻辑回归中,我们预测:

当${h_\theta}\left( x \right)>=0.5$时,预测 $y=1$。

当${h_\theta}\left( x \right)<0.5$时,预测 $y=0$ 。

根据上面绘制出的 S 形函数图像,我们知道当

$z=0$ 时 $g(z)=0.5$

$z>0$ 时 $g(z)>0.5$

$z<0$ 时 $g(z)<0.5$

又 $z={\theta^{T}}x$ ,即: ${\theta^{T}}x>=0$ 时,预测 $y=1$ ${\theta^{T}}x<0$ 时,预测 $y=0$

现在假设我们有一个模型:
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
并且参数$\theta$ 是向量[-3 1 1]。 则当$-3+{x_1}+{x_2} \geq 0$,即${x_1}+{x_2} \geq 3$时,模型将预测 $y=1$。 我们可以绘制直线${x_1}+{x_2} = 3$,这条线便是我们模型的分界线,将预测为1的区域和预测为 0的区域分隔开。
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
假使我们的数据呈现这样的分布情况,怎样的模型才能适合呢?
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
因为需要用曲线才能分隔 $y=0$ 的区域和 $y=1$ 的区域,我们需要二次方特征:${h_\theta}\left( x \right)=g\left( {\theta_0}+{\theta_1}{x_1}+{\theta_{2}}{x_{2}}+{\theta_{3}}x_{1}{2}+{\theta_{4}}x_{2}{2} \right)$是[-1 0 0 1 1],则我们得到的判定边界恰好是圆点在原点且半径为1的圆形。

我们可以用非常复杂的模型来适应非常复杂形状的判定边界。

代价函数

在这段视频中,我们要介绍如何拟合逻辑回归模型的参数$\theta$。具体来说,我要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题。
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将${h_\theta}\left( x \right)=\frac{1}{1+{e{-\theta{T}x}}}$带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)。
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。

线性回归的代价函数为:$J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{\frac{1}{2}{{\left( {h_\theta}\left({x}^{\left( i \right)} \right)-{y}^{\left( i \right)} \right)}^{2}}}$ 。 我们重新定义逻辑回归的代价函数为:$J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{{Cost}\left( {h_\theta}\left( {x}^{\left( i \right)} \right),{y}^{\left( i \right)} \right)}$,其中
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
${h_\theta}\left( x \right)$与 $Cost\left( {h_\theta}\left( x \right),y \right)$之间的关系如下图所示:
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
这样构建的$Cost\left( {h_\theta}\left( x \right),y \right)$函数的特点是:当实际的 $y=1$ 且${h_\theta}\left( x \right)$也为 1 时误差为 0,当 $y=1$ 但${h_\theta}\left( x \right)$不为1时误差随着${h_\theta}\left( x \right)$变小而变大;当实际的 $y=0$ 且${h_\theta}\left( x \right)$也为 0 时代价为 0,当$y=0$ 但${h_\theta}\left( x \right)$不为 0时误差随着 ${h_\theta}\left( x \right)$的变大而变大。 将构建的 $Cost\left( {h_\theta}\left( x \right),y \right)$简化如下: $Cost\left( {h_\theta}\left( x \right),y \right)=-y\times log\left( {h_\theta}\left( x \right) \right)-(1-y)\times log\left( 1-{h_\theta}\left( x \right) \right)$ 带入代价函数得到: $J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}{m}{[-{{y}{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}$ 即:$J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}{m}{[{{y}{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}$

Python代码实现:

import numpy as np
    
def cost(theta, X, y):
    
  theta = np.matrix(theta)
  X = np.matrix(X)
  y = np.matrix(y)
  first = np.multiply(-y, np.log(sigmoid(X* theta.T)))
  second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T)))
  return np.sum(first - second) / (len(X))

在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:

Repeat { $\theta_j := \theta_j - \alpha \frac{\partial}{\partial\theta_j} J(\theta)$ (simultaneously update all ) }

求导后得到:

Repeat { $\theta_j := \theta_j - \alpha \frac{1}{m}\sum\limits_{i=1}^{m}{{\left( {h_\theta}\left( \mathop{x}^{\left( i \right)} \right)-\mathop{y}^{\left( i \right)} \right)}}\mathop{x}_{j}^{(i)}$ (simultaneously update all ) }

在这个视频中,我们定义了单训练样本的代价函数,凸性分析的内容是超出这门课的范围的,但是可以证明我们所选的代价值函数会给我们一个凸优化问题。代价函数$J(\theta)$会是一个凸函数,并且没有局部最优值。

推导过程:

$J\left( \theta \right)=-\frac{1}{m}\sum\limits_{i=1}{m}{[{{y}{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}$ 考虑: ${h_\theta}\left( {{x}^{(i)}} \right)=\frac{1}{1+{{e}{-{\thetaT}{{x}^{(i)}}}}}$ 则: ${{y}^{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)$ $={{y}^{(i)}}\log \left( \frac{1}{1+{{e}{-{\thetaT}{{x}^{(i)}}}}} \right)+\left( 1-{{y}^{(i)}} \right)\log \left( 1-\frac{1}{1+{{e}{-{\thetaT}{{x}^{(i)}}}}} \right)$ $=-{{y}^{(i)}}\log \left( 1+{{e}{-{\thetaT}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}{{\thetaT}{{x}^{(i)}}}} \right)$

所以: $\frac{\partial }{\partial {\theta_{j}}}J\left( \theta \right)=\frac{\partial }{\partial {\theta_{j}}}[-\frac{1}{m}\sum\limits_{i=1}{m}{[-{{y}{(i)}}\log \left( 1+{{e}{-{\theta{T}}{{x}^{(i)}}}} \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1+{{e}{{\theta{T}}{{x}^{(i)}}}} \right)]}]$ $=-\frac{1}{m}\sum\limits_{i=1}{m}{[-{{y}{(i)}}\frac{-x_{j}{(i)}{{e}{-{\theta{T}}{{x}{(i)}}}}}{1+{{e}{-{\theta{T}}{{x}^{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j{(i)}{{e}{{\thetaT}{{x}{(i)}}}}}{1+{{e}{{\thetaT}{{x}^{(i)}}}}}}]$ $=-\frac{1}{m}\sum\limits_{i=1}{m}{{y}{(i)}}\frac{x_j{(i)}}{1+{{e}{{\thetaT}{{x}{(i)}}}}}-\left( 1-{{y}^{(i)}} \right)\frac{x_j{(i)}{{e}{{\thetaT}{{x}{(i)}}}}}{1+{{e}{{\thetaT}{{x}^{(i)}}}}}]$ $=-\frac{1}{m}\sum\limits_{i=1}{m}{\frac{{{y}{(i)}}x_j{(i)}-x_j{(i)}{{e}{{\thetaT}{{x}{(i)}}}}+{{y}{(i)}}x_j{(i)}{{e}{{\thetaT}{{x}{(i)}}}}}{1+{{e}{{\thetaT}{{x}^{(i)}}}}}}$ $=-\frac{1}{m}\sum\limits_{i=1}{m}{\frac{{{y}{(i)}}\left( 1\text{+}{{e}{{\thetaT}{{x}^{(i)}}}} \right)-{{e}{{\thetaT}{{x}{(i)}}}}}{1+{{e}{{\thetaT}{{x}{(i)}}}}}x_j^{(i)}}$ $=-\frac{1}{m}\sum\limits_{i=1}{m}{({{y}{(i)}}-\frac{{{e}{{\thetaT}{{x}{(i)}}}}}{1+{{e}{{\thetaT}{{x}{(i)}}}}})x_j^{(i)}}$ $=-\frac{1}{m}\sum\limits_{i=1}{m}{({{y}{(i)}}-\frac{1}{1+{{e}{-{\thetaT}{{x}{(i)}}}}})x_j{(i)}}$ $=-\frac{1}{m}\sum\limits_{i=1}{m}{[{{y}{(i)}}-{h_\theta}\left( {{x}^{(i)}} \right)]x_j^{(i)}}$ $=\frac{1}{m}\sum\limits_{i=1}^{m}{[{h_\theta}\left( {{x}^{(i)}} \right)-{{y}{(i)}}]x_j{(i)}}$

注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的${h_\theta}\left( x \right)=g\left( {\theta^T}X \right)$与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。

多类别分类:一对多

使用二分类,一对多

正则化(Regularization)

过拟合的问题

代价函数

上面的回归问题中如果我们的模型是: ${h_\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}2}+{\theta_{3}}{x_{3}3}+{\theta_{4}}{x_{4}^4}$ 我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于0的话,我们就能很好的拟合了。 所以我们要做的就是在一定程度上减小这些参数$\theta $ 的值,这就是正则化的基本方法。我们决定要减少${\theta_{3}}$和${\theta_{4}}$的大小,我们要做的便是修改代价函数,在其中${\theta_{3}}$和${\theta_{4}}$ 设置一点惩罚。这样做的话,我们在尝试最小化代价时也需要将这个惩罚纳入考虑中,并最终导致选择较小一些的${\theta_{3}}$和${\theta_{4}}$。 修改后的代价函数如下:$\underset{\theta }{\mathop{\min }},\frac{1}{2m}[\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}}+1000\theta _{3}^{2}+10000\theta _{4}^{2}]}$

通过这样的代价函数选择出的${\theta_{3}}$和${\theta_{4}}$ 对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件来选择这些惩罚的程度。这样的结果是得到了一个较为简单的能防止过拟合问题的假设:$J\left( \theta \right)=\frac{1}{2m}[\sum\limits_{i=1}{m}{{{({h_\theta}({{x}{(i)}})-{{y}{(i)}})}{2}}+\lambda \sum\limits_{j=1}{n}{\theta_{j}{2}}]}$

其中$\lambda $又称为正则化参数(Regularization Parameter)。 注:根据惯例,我们不对${\theta_{0}}$ 进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:

《吴恩达机器学习》学习笔记003_逻辑回归、正则化
如果选择的正则化参数$\lambda$ 过大,则会把所有的参数都最小化了,导致模型变成 ${h_\theta}\left( x \right)={\theta_{0}}$,也就是上图中红色直线所示的情况,造成欠拟合。 那为什么增加的一项$\lambda =\sum\limits_{j=1}{n}{\theta_j{2}}$ 可以使$\theta $的值减小呢? 因为如果我们令 $\lambda$ 的值很大的话,为了使Cost Function 尽可能的小,所有的 $\theta $ 的值(不包括${\theta_{0}}$)都会在一定程度上减小。 但若$\lambda$ 的值太大了,那么$\theta $(不包括${\theta_{0}}$)都会趋近于0,这样我们所得到的只能是一条平行于$x$轴的直线。 所以对于正则化,我们要取一个合理的 $\lambda$ 的值,这样才能更好的应用正则化。 回顾一下代价函数,为了使用正则化,让我们把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。

正则化线性回归

对于线性回归的求解,我们之前推导了两种学习算法:一种基于梯度下降,一种基于正规方程。

正则化线性回归的代价函数为:

$J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}{m}{[({{({h_\theta}({{x}{(i)}})-{{y}{(i)}})}{2}}+\lambda \sum\limits_{j=1}^{n}{\theta _{j}^{2}})]}$

如果我们要使用梯度下降法令这个代价函数最小化,因为我们未对$\theta_0​$进行正则化,所以梯度下降算法将分两种情形:

$Repeat$ $until$ $convergence${

​ ${\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}{m}{(({h_\theta}({{x}{(i)}})-{{y}{(i)}})x_{0}{(i)}})$

​ ${\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}{m}{(({h_\theta}({{x}{(i)}})-{{y}{(i)}})x_{j}{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}]$

​ $for$ $j=1,2,...n$

​ }

对上面的算法中$ j=1,2,...,n$ 时的更新式子进行调整可得:

${\theta_j}:={\theta_j}(1-a\frac{\lambda }{m})-a\frac{1}{m}\sum\limits_{i=1}{m}{({h_\theta}({{x}{(i)}})-{{y}{(i)}})x_{j}{\left( i \right)}}​$ 可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令$\theta $值减少了一个额外的值。

我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示:
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
图中的矩阵尺寸为 $(n+1)*(n+1)$。

正则化的逻辑回归模型

针对逻辑回归问题,我们在之前的课程已经学习过两种优化算法:我们首先学习了使用梯度下降法来优化代价函数$J\left( \theta \right)$,接下来学习了更高级的优化算法,这些高级优化算法需要你自己设计代价函数$J\left( \theta \right)$。
《吴恩达机器学习》学习笔记003_逻辑回归、正则化
自己计算导数同样对于逻辑回归,我们也给代价函数增加一个正则化的表达式,得到代价函数:

$J\left( \theta \right)=\frac{1}{m}\sum\limits_{i=1}{m}{[-{{y}{(i)}}\log \left( {h_\theta}\left( {{x}^{(i)}} \right) \right)-\left( 1-{{y}^{(i)}} \right)\log \left( 1-{h_\theta}\left( {{x}^{(i)}} \right) \right)]}+\frac{\lambda }{2m}\sum\limits_{j=1}^{n}{\theta _{j}^{2}}$

上一篇:[python学习手册-笔记]003.数值类型


下一篇:003. Linux基础三 P2(cp、mv、rename、rm)