Machine learning (3)

逻辑回归

分类问题

  • 在分类问题中,你要预测的变量y是离散的值,我们将学习一种叫做逻辑回归的算法,这是目前最流行使用最广泛的一种学习算法。
  • 在分类问题中,我们尝试预测的是结果是否属于某个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融是否是欺诈,之前我们也谈到了肿瘤分类问题的例子,区别一个肿瘤是恶性还是良性。
  • 我们从二元的分类问题开始讨论。
  • 我们将因变量可能属于的两个类分别称为负向类和正向类,则因变量y0,1,其中0表示负向类,1表示正向类。
    Machine learning (3)
    Machine learning (3)
  • 如果我们要用线性回归算法来解决一个分类问题,对于分类,y取值为0或1,但如果你使用的是线性回归,那么假设函数的输出可能远大于1,或者远小于0,即使所有训练样本的标签y都等于0或1,尽管我们知道标签应该取值0或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是,它的输出值永远在0到1之间.
  • 顺便说一下,逻辑回归算法是分类算法,我们将它作为分类算法使用。有时候可能因为这个算法的名字中出现了“回归”使你感到困惑,但逻辑回归算法实际上是一种分类算法,它适用于标签y取值离散的情况,如:1001

假说表示

  • 回顾在一开始提到的乳腺分类问题,我们可以用线性回归的方法求出适合数据的一条直线:
    Machine learning (3)

  • 根据线性回归模型我们只能预测连续的值,然而对于分类问题,我们需要输出0或1,我们可以预测:

    • hΘ(x)>=0.5y=1.
    • hΘ(x)<0.5y=0.
  • 对于上图所示的数据,这样的一个线性模型似乎能完成分类任务,加入我们又观测到一个非常大尺寸的恶性肿瘤,将其作为实例加入我们的训练集中来,这将使得我们获得一条 新的直线。
    Machine learning (3)
  • 这时,再用0.5作为阈值来预测肿瘤是良性还是恶性便不合适了。可以看出,线性回归模型,因为其预测的值可以超越(0,1)的范围,并不合适解决这样的问题。
  • 我们引入一个新的模型,逻辑货柜,该模型的输出变量范围始终在0和1之间。逻辑回归模型的假设是:hΘ(x)=g(ΘTX),其中:X 代表特征向量,g代表伙计函数是一个常用的逻辑函数为s型函数,公式为:g(z)=11+ez
  • 该函数的图像为:
    Machine learning (3)

  • 和起来,我们得到逻辑回归模型的假设:

  • 对模型的理解:g(z)=11+ez.
  • hΘ(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性即hΘ(x)=P(y=1|x;Θ)
  • 例如,如果对于给定的x,通过已经确定的参数计算得出hΘ(x)=0.7,则表示有70的几率为正向类,相应的y为负向类的几率为1-0.7 = 0.3。

判定边界

  • 现在讲一下决策边界的概念。这个概念能更好的帮助我们理解逻辑回归的假设函数在计算什么。
    Machine learning (3)

  • 在逻辑回归中,我们预测:

    • hΘ(x)>=0.5,y=1
    • hΘ(x)<0.5y=0
  • 根据上去绘制出的S型函数图像,我们知道当
    • z=0g(z)=0.5
    • z>0g(z)>0.5
    • z<0g(z)<0.5
  • z=ΘT
    • ΘT>=0y=1
    • ΘT<0y=0
  • 现在假设我们有一个模型:
    Machine learning (3)

  • 并且参数Θ[311].则当x1+x2>=3,模型预测y=1,我们可以绘制直线x1+x2=3,这条线便是我们模型的分界线,将预测为1的区域和预测为0的区域分割开。
    Machine learning (3)

  • 假使我们的数据呈现这样的分布情况,怎么样的模型才能适合呢?

Machine learning (3)

  • 因为需要用曲线才能分割y=0的区域,和y=1的区域,我们需要二次方特征:hΘ(x)=g(Θ0+Θ1x1+Θ2x2+Θ3x12+Θ4x22),则我们得到的判定边界恰好是在原点且半径为1的圆形。
  • 我们可以用非常复杂的模型来适应非常复杂形状的判定边界。

代价函数

  • 我们要介绍如何拟合逻辑回归模型的参数Θ.具体来说,我要定义用来拟合参数的优化目标或者代价函数,这便是监督学习问题中逻辑回归模型的拟合问题。
    Machine learning (3)
  • 对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义。但问题在于,当我们将hΘ(x)=11+eΘTx带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数。
    Machine learning (3)
  • 这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
  • 线性回归的代价函数为:J(Θ)=1mi=1m12(hΘ(x(i))y(i))2.
  • 我们重新定义逻辑回归的代价函数为:J(Θ)=1mi=1mCost(hΘ(x(i)),y(i)),其中。
    Cost(hΘ(x),y)={log(hΘ(x))ify=1log(1hΘ(x))ify=0
  • hΘ(x)CosthΘ(x),y:
    Machine learning (3)
  • Cost(hΘ(x),y)y=1hΘ(x)10y=1,hΘ(x)1hΘ(x)y=0hΘ(x)00y=0y=0hΘ(x)0hΘ(x)
  • 将构建的Cost(h_\Theta(x),y)简化如下:
  • 带入代价函数得到:
    J(Θ)=1mi=1m[y(i)log(hΘ(x(i)))(1y(i))log(1hΘ(x(i)))]
  • 即:
    J(Θ)=1mi=1m[y(i)log(hΘ(x(i)))+(1y(i))log(1hΘ(x(i)))]
  • 在得到这样一个代价函数后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:
    Machine learning (3)

简化的成本函数和梯度下降

  • 我们将会找出一种稍微简单一点的方法来写代价函数,来替换我们现在用的方法。同时我们还要弄清楚如何运用下降法,来拟合出逻辑回归的参数。
  • 这是逻辑回归的代价函数: J(Θ)=1mi=1mCost(hΘ(x(i)),y(i)),其中。
    Cost(hΘ(x),y)={log(hΘ(x))ify=1log(1hΘ(x))ify=0
  • 这个式子可以合成:
    Cost(hΘ(x),y)=y×log(hΘ(x))(1y)×log(1hΘ(x))
  • 即,逻辑回归的代价函数:
    Cost(hΘ(x),y)=y×log(hΘ(x))(1y)×log(1hΘ(x))=1mi=1m[y(i)log(hΘ(x(i)))+(1y(i))log(1hΘ(xi))]
  • 根据这个代价函数,为了拟合出参数,该怎么做呢》我们要试图找尽量让J(Θ)取得最小值的参数Θ.
    minΘJ(Θ)
  • 所以我们想要尽量减小这一项,这将我们将得到某个参数Θ.
  • 如果我们给出一个新的样本,加入某个特征x,我们可以用拟合训练样本的参数Θ,来输出对假设的预测。
  • 另外,我们假设的输出,实际上就是这个概率值:p(y=1|x;Θ),就是关于x以\Theta为参数,y=1的概率,你可以认为我们的假设就是估计y=1的概率,所以,接下来就是弄清楚如何最大限度的最小化代价函数J(Θ),作为一个关于Θ的函数,这样我们才能为训练集拟合参数Θ
  • 最小化代价函数的办法,是使用梯度下降法,这是我们的代价函数:
    J(Θ)=y×log(hΘ(x))(1y)×log(1hΘ(x))=1mi=1m[y(i)log(hΘ(x(i)))+(1y(i))log(1hΘ(xi))]
  • 如果我们要最小化这个关于Θ的函数值,这就是我们通常用的梯度下降法的模板。
    Machine learning (3)

  • 我们要反复更新每个参数,用这个式子来更新,就是用它自己减去学习率α乘以后面的 微分项,求导后得到的:
    Machine learning (3)

  • 如果你计算一下的话,你会得到这个等式:

    Θj:=Θjα1mi=1m(hΘ(x(i))y(i))xj(i)

  • 我把它写在这里,这将后面这个式子,在i=1m上求和,其实就是预测误差乘以xj(i),所以你把这个偏导数项ΘjJ(Θ)放回原来式子这里,我们就可以将梯度下降算法写作如下形式:

    Θj:=Θjα1mi=1m(hΘ(x(i))y(i))xj(i)

  • 所以,如果你有n个特征,也就是说:
    Θ=[Θ0Θ1Θ2...Θ0]
  • 参数向量Θ包含Θ0,Θ1,Θ2Θn,那么你就需要用这个式子:
    Θj:=Θjα1mi=1m(hΘ(x(i))y(i))xj(i)
    来同时更新所有Θ
  • 现在,如果你把这个更新规则和我们之前用在线性胡桂上的进行比较的话,你会惊讶的发现,这个式子正是我们用来做线性回归梯度下降的。
  • 那么,线性回归和逻辑回归是同一个算法吗?要回答这个问题,我们要观察逻辑回归看看发生了哪些变化,实际上,假设的定义发生了变化。
  • 对于线性回归假设函数:
    hΘ(x)=ΘTX=Θ0x0+Θ1x1+Θ2x2+Θ3x3+Θ4x4+....+Θnxn
  • 而现在逻辑函数假设函数:hΘ(x)=11+eΘTx
  • 因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
  • 在先前的视频中,当我们在谈论线性回归的梯度下降法时,我们谈到了如何监控梯度下降法以确保其收敛,我通常也把同样的方法用在逻辑回归中,来检测梯度下降,以确保它正常收敛。
  • 当时用梯度下降法来实现逻辑回归时,我们有这些不同的参数Θ,就是Θ0,Θ1,Θ2一直到Θn,我们需要用这个表达式来更新这些参数。我们还可以使用for循环来更新这些参数值,用fori=1ton或者fori=1ton+1。当然,不用for循环也是可以的,理想情况下,我们更提倡使用向量化的实现,可以把所有这些n个参数同时更新。
  • 最后还有一点,我们之前在谈线性回归时,讲到的特征缩放,我们看到了特征缩放是如何提高梯度下降的收敛速度的,这个特征缩放的方法,也适用于逻辑回归中,梯度下降收敛更快。
  • 就是这样,现在你知道如何实现逻辑回归,这是一种非常强大,甚至可能世界上使用最广泛的一种分类算法。
    Machine learning (3)
  • 假设我们已经完成了可以实现这两件事的代码,那么梯度下降所做的就是反复执行这些更新。
  • 另一种考虑下降梯度的思路是,我们需要写出代码来计算J(Θ)和这些偏导数,然后把这些插入到梯度下降中,然后他就可以为我们最小化这个函数。对于梯度下降来说,我认为从技术上讲,你实际并不需要编写代码计算代价函数J(Θ)。你只需编写代码来计算导数项,但是,如果你希望代码还要监控这些J(Θ)的收敛性。那么我们就需要自己编写代码来计算代价函数J(Θ)和偏导项ΘjJ(Θ)。所以,在写完能够计算这两者的代码之后,我们就可以使用梯度下降。
  • 然而梯度下降并不是我们可以使用的唯一算法,还有其他一些算法,更高级、更复杂。如果我们能用这些方法来计算代价函数J(Θ)和偏导数项ΘjJ(Θ)两个项的话,那么这些算法就是我们优化代价函数的不同方法,共轭梯度法BFGS(变尺度法)和L-BFGS(限制变尺度法)就是其中一些更高级的优化的算法,他们需要有一种方法来计算J(Θ),以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。这三种算法的具体细节超出了本门课程的范畴,实际上你最后通常会花费很多天,或几周时间研究这些算法,你可以专门学一门课来提高数值计算能力,不过让我来告诉你他们的一些特性。
  • 这三种算法的优点:
  • 一个是使用这其中任何一个算法,你通常不需要手动选择学习率α,所以对于这些算法的一种思路是,给出计算导数项和代价函数的方法,你可以认为算法有一个智能的内部循环,而且,事实上,他们确实有一个智能的内部循环称为线性搜索算法,它可以自动尝试不同的学习速率α,因此它甚至可以为每次迭代选择不同的学习速率α,那么你就不需要自己选择,这些算法实际上在做更复杂的事情,而不仅仅是选择一个好的学习率,所以他们往往最终收敛得远远快于梯度下降,不过关于他们到底做什么的详细讨论,已经超过本课程的范围。
  • 实际上,我过去使用这些算法已经很长一段时间了,也许超过十年了,使用的相当频繁,而直到几年前我才真正搞清楚共轭梯度法和L-BFGS的细节。
  • 我们实际上完全有可能使用这些算法,并应用于许多不同的学习问题,而不需要真正理解这些算法内环间在做什么,如果说这些算法有缺点的话,那么我想说主要缺点是它们比梯度下降法复杂多了,特别是你最好不要使用L-BGFS、BFGS这些算法,除非你使计算方面的专家,实际上,我不会建议你们编写自己的代码来计算数据的平方根,或者计算逆矩阵,因为对于这些算法,我还是会建议你直接使用一个软件库,比如说,要求一个平方根,我们所能做的就是调用一些别人已经写好用来计算数字平方根的函数,幸运 的是现在我们可以使用Matlab或Python的库来做计算。

多类别分类:一对多

  • 第一个例子,假如说你现在需要一个学习算法能自动将邮件归类到不同的文件夹里,或者说可以自动的加上标签,那么,你也需要一些不同的文件夹,或者不同的标签来完成这件事,来区分开来自工作的邮件、来自朋友的邮件、来自家人的邮件或者是有关兴趣爱好的邮件,那么我们就有了这样的一个分类问题,其类别有四个,分别用y=1y=2y=3y=4来代表。
  • 第二个例子是有关药物诊断的,如果一个病人因为鼻塞来到你的诊所,他可能并没有病,用y=1这个类别来代表;或者患了感冒,用y=2来代表;或者的了流感用y=3来代表。
  • 第三个例子,如果你正在做有关天气的机器学习分类问题,那么你可能想要区分哪些天是晴天、多云、雨天、或者下雪天,对上述所有的例子,y可以取一个很小的数值,一个相对“谨慎”的数值,比如1到3、1到4或者其他数值,以上说的都是多分类问题,顺便一提的是,对于下标是01234都不重要,我更喜欢将分类从1开始标而不是0其实怎样标注都不会影响最后的结果。
  • 然而对于之前的一个,二元分类问题,我们的数据看起来可能是这样的。
    Machine learning (3)
  • 对于一个多类分类问题,我们的 数据集或许看起来像这样:
    Machine learning (3)
  • 我用3种不同的符号来代表3个类别,问题就是给处3个类型的数据集,我们如何得到一个学习算法来进行分类的呢?
  • 我们现在已经知道如何进行二元分类。可以使用逻辑回归,对于直线或许你也知道,可以将数据集一分为二为正类和负类。用一对多的分类思想,我们可以将其用在多类分类问题上。
  • 下面将介绍如何进行一对多的分类工作,有时这个方法也被称为“一对余”方法。
    Machine learning (3)
  • 现在我们有一个训练集,好比上图表示的有3个类别,我们用三角形表示y=1,方框表示y=2,叉叉表示y = 3,我们下面要做的就是使用一个训练集,将其分成3个二元分类问题。
  • 我们先从用三角形代表的类别1开始,实际上我们可以创建一个,新的”伪”训练集,类型2和类型3定为负类,类型1设定为正类,我们创建一个新的训练集,如下图所示的那样,我们要拟合出一个合适的分类器。
    Machine learning (3)
  • 这里的三角形是正样本,而圆形代表负样本。可以这样想,设置三角形的值为1,圆形的值为0,下面我们来训练一个标准的逻辑回归分类器,这样我们就得到一个正边界。
  • 为了能是现这样的转变,我们将多个类中的一个类标记为正向类(y=1),然后将其他所有类都标记为负向类,这个模型记作hΘ(i)(x).接着,类似的我们选择另一个类标记为正向类(y=2),再将其它都标记为负向类,将这个模型记作hΘ(2)(x)依次类推。
  • 最后我们得到一系列的模型简记为:hΘ(i)(x)=p(y=i|x;Θ)i=(1,2,3,...k)
    Machine learning (3)
  • 最后,在我们需要做预测时,我们将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量。
  • 总之,我们已经把要做的做完了。现在要做到 就是训练这个逻辑回归分类器:hΘ(i)(x).其中i对应每一个可能的y=i,最后,为了做出预测,我们给出输入一个新的hΘ(i)(x)最大的i,即maxih(i)(x)
  • 你现在知道了基本的挑选分类器的方法,选择出哪一个分类器是可信度最高效果最好的。那么就可以认为得到一个正确的分类,无论i值是多少,我们都有最高的概率值,我们预测y就是那个值,这就是多类别分类问题,以及一对多的方法,通过这个小方法,你现在也可以将逻辑回归分类器用在多类分类的问题上。

正则化

过拟合的问题

  • 到现在为止,我们已经学习了集中不同的学习算法啊,包括线性回归和逻辑回归,他们能够有效的解决许多问题,但是当将它们应用到某些特定的机器学习应用时,会遇到过拟合的问题,可能会导致他们效果很差。
  • 我将伪逆解释什么是过度拟合问题,并且在此之后接下来的几个视频中,我们将谈论一种称为正则化的技术,他可以改善或者减少过度拟合问题。
  • 如果我们有非常多的特征,我们通过学习得到的假设可能能够非常好的适应训练集(代价函数几乎为0),但是可能不能推广到新的数据。
  • 下图是一个回归问题的例子:
    Machine learning (3)
  • 第一个模型是线性模型,欠拟合,不能很好的适应我们的训练集,第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的 本质,预测新数据。我们可以看出,若给出一个新的值使之预测,他将表现的很差,是过拟合,虽然能非常好的适应我们的训练集,但在新输入变量进行预测时可能会效果不好,而中间的模型似乎最合适。
  • 分类问题中 也存在这样的问题:
    Machine learning (3)
  • 就以多项式理解,x的次数越高,拟合的越好,但相应的预测的能力就可能变差。
  • 问题是,如果我们发现了过拟合的问题,应该如何处理?
  • 丢弃一些不能帮助我们正确预测的特征,可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙
  • 正则化,保留所有的特征,但是减少参数的大小。

代价函数

  • 上面的回归问题中如果我们的模型是:

    hΘ(x)=Θ0+Θ1x1+Θ2x22+Θ3x33+Θ4x44

  • 我们可以从之前的实例中看出,正式哪些告辞项导致了过拟合的产生,所以如果我们能让这些告辞项的系数接近0的话,我们就能很好的拟合了。

  • 所以我们要做的就是在一定程度上减小这些参数Θ的值,这就是正则化的基本方法。我们决定要减少Θ3Θ4的大小,我们要做的就是修改代价函数,在其中Θ3Θ4设置一点惩罚,这样做的话,我们在尝试最小化代价时也需将这个惩罚纳入考虑中,并最终导致选择较小 的一些Θ3Θ4.
  • 修改后的代价函数如下:minΘ12m[i=1m(hΘ(x(i))y(i))2+1000Θ32+10000Θ42]
  • 通过这样的代价函数选择出的Θ3Θ4对预测结果的影响就比之前要小许多。假如我们有非常多的特征,我们并不知道其中哪些特征我们要惩罚,我们将对所有的特征进行惩罚,并且让代价函数最优化的软件 来选择这些城噶的程度。这样的结果是得到了一个较为简单的能防止过拟合的问题的假设:J(Θ)=12m[i=1m(hΘ(x(i))y(i))2+λj=1nΘj2]
  • 其中λ又称为正则化参数。注:根据管理,我们不对Θ0进行惩罚。经过正则化处理的模型与原模型的可能对比如下图所示:
    Machine learning (3)
  • 如果选择的正则化参数λ过大,则会把所有的参数都最小化了,导致模型变成hΘ(x)=Θ0线
  • 那为什么增加的一项λ=j=1nΘj2可以使Θ的值减小呢?
  • 因为如果我们令λ的值很大的话,为了使CostFunction尽可能的小,所有的Θ的值(不包括\Theta_0)都会在一定程度上减小。
  • 但若λ的值太大了,那么Θ(不包括\Theta_0)都会趋近于0,这样我们所得到的只能是一条平行x轴的直线。
  • 所以对于正则化,我们要取一个 合理的λ的值,这样才能更好的应用正则化。
  • 回顾一下代价函数,为了使用正则化,让我们把这些概念应用到线性回归和逻辑回归中去,那我们就可以让他们避免过度拟合了。

正则化线性回归

  • 对于线性回归的求解,我们之前推导了两种学习算法:一种基于梯度下降,一种基于正规方程。
  • 正则化线性回归的代价函数为:
    J(Θ)=12mi=1m[((hΘ(x(i))y(i))2+λj=1nΘj2)]
  • 如果我们要使用梯度下降法令这个代价函数最小化,因为我们来进行正则化,所以梯度下降算法将分两种情形:
    Machine learning (3)
  • 对于上面的算法中j=1,2….n时的更新式子进行调整可得。
    Θj:=Θj(1αλm)α1mi=11(hΘ(x(i))y(i))xj(i)
  • 可以看出,正则化线性回归的梯度下降算法的变化在于,每次都在原有的算法更新规则的基础上令Θ值减少了一个额外的值。
  • 我们同样也可以利用正规方程来求解正则化线性回归模型,方法如下所示
    Θ=(XTX+λ[011...1])1XTy
  • 图中的矩阵尺寸为(n+1)(n+1)

正则化的逻辑回归模型

  • 针对逻辑回归问题,我们在之前的课程已经学习过两种优化算法,我们首先学习了使用梯度下降法来优化代价函数J(Θ),接下来学习了跟高级的优化算法,这些高级优化算法需要你自己设计代价函数J(Θ)
    Machine learning (3)
  • 自己计算导数同样对于逻辑回归,我们也给代价函数增加一个正则化的表达式,得到代价函数.
    J(Θ)=1mi=1m[y(i)log(hΘ(x(i)))(1y(i))log(1hΘ(x(i)))]+λ2mj=1nΘj2
  • 要最小化该代价函数,通过求导,得出梯度下降算法为:
    Machine learning (3)