【MindSpore:跟着小Mi一起机器学习吧!】逻辑回归(二)

小Mi学习,向上积极!逻辑回归的函数表示还有判决边界还记得不,是不是觉得上一节还不得劲儿?!这不,小Mi又来更新啦~

  1. 代价函数
    现在我们就要开始讨论如何拟合logistic回归模型的参数,具体来说,我们要定义用来拟合参数的优化目标或者代价函数,以下便是监督学习问题中的logistic回归模型的拟合问题:
假使我们有一个训练集,里面有m个训练样本,依旧和以前一样,每个样本是用n+1维的特征向量表示的,其中第一个特征为1。同时,由于这是一个分类问题,所以训练集中所有的标签y不是0就是1,。而假设函数,参数就是公式中的,我们要解决的问题就是,对于这个给定的训练集,我们如何选择。以前我们建立线性回归模型时,使用的代价函数为:,现在在此基础上稍作修改,将1/2放到求和符号里面:,然后后面的部分直接替换成,也就是说代价函数是1/m乘以这个cost项在训练集范围上的求和: ,为了更加简洁一点,可以直接去掉上标,,代价值就是1/2乘以预测值h和实际观测的y值的差的平方,这部分在线性回归中发挥了很大的作用,但是如果用于logistic回归,就会出现一个问题,会变成参关于参数的非凸函数。由于,这是一个很复杂的非线性函数,如果把这个Sigmoid函数带入,再把这个Cost项带入进原公式,可以画出图像,最后可以发现有很多局部最优解,这样的就可以称之为非凸函数:
这时我们就可以发现,如果在这样的函数上使用梯度下降法,并不能够保证它会收敛到全局最小值,相反地,如果代价函数是一个凸函数,对其使用梯度下降法,会最终收敛到全局最小值,既然这样的话,我们可以换个思路,寻找另一个是凸函数的代价函数不就好了呗。是不是!从而梯度下降法也能运用了,继而全局最小值的问题也会迎刃而解。
因此,我们定义:
当y=1时,代价值将等于-log(h(x));而y=0时,则是-log(1-h(x))。这看起来是个非常复杂的函数,但是如果画出这个函数的图像,就很好理解啦,从y=1这个情况开始,代价函数的图像如下图:
我们来具体理解下这个函数为什么是这样的,首先画出对数函数log(z)的图像:
-log(z)就是沿着z轴翻译一下,然后再选中0~1的部分:
因此,全新的代价函数有一些有趣并且很好的性质:首先,我们可以注意到,如果假设函数预测值h(x)=1,并且y刚好等于h(x)时,那么这个代价就为0,这也是我们希望看到的,因为我们正确预测了输出值;同时,当y=1但h(x)不为1时,误差随着h(x)变小而增大。
另一种情况,y=0时,代价值函数是什么样子的呢?
这个曲线的特点是,当实际的y=0且h(x)也为0时的代价为0,当y=0但h(x)不为0时误差随着h(x)的变大而变大。
Python代码实现:
xxxxxxxxxx
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))
在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:
求导后得到:
注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。
当然 除了梯度下降算法以外,还有一些常被用来求代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常也比梯度下降算法要更加快速,比如:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) 等。
5 简化的成本函数和梯度下降
在这段视频中,我们将会找出一种稍微简单一点的方法来写代价函数,来替换我们现在用的方法。同时我们还要弄清楚如何运用梯度下降法,来拟合出逻辑回归的参数。因此,后续的话我们就应该知道如何实现一个完整的逻辑回归算法了。逻辑回归的代价函数:
我们的整体代价函数是1/m乘以对应不同标签y的各个训练样本,在预测时付出的代价之和,这是我们约定单个样本的代价,另外,我们还需要注意一下,对于分类的问题,在我们的训练集中,甚至不在训练集中的样本,y的值总是等于0或1的,这是由y的数学定义决定的,由于y是0或1,我们就可以一个超简单的方式来写这个代价函数,将两个式子合并成一个等式:
【【MindSpore:跟着小Mi一起机器学习吧!】逻辑回归(二)】与之前的公式其实是等效的,大家可以动动手简单证明一下!
从而就可以推导出logistic回归的代价函数:
不过这里运用了统计学中的极大似然法,可以快速寻找参数,同时还能满足凸函数的性质(更深一层的原理后续会统统介绍给大家)。根据这个代价函数,为了拟合出参数,该怎么做呢?我们要试图找尽量让取得最小值的参数。如果给我们一个新的样本,具有某些特征x,我们可以用拟合训练样本的参数来输出这样的预测。同时,我们假设的输出,实际上就是y=1的概率,就是输入为x以为参数时y=1的概率,就可以想成,我们的假设就是估计y=1的概率:。因此,接下来需要做的就是弄清楚如何最小化,这样我们才能为训练集拟合出参数。
不用猜都能知道,现在提到最小化,肯定是使用梯度下降法,代价函数为:
如果我们要最小化这个关于的函数值,可以选用常见的梯度下降法模板:
需要不断反复更新每个参数,就是用它自己减去学习率乘以后面的导数项,也可以自己动手试一下,直接算出这个导数项,最终得到的式子为:
该式子在i=1 到m上求和,其实就是预测误差乘以 ,将偏导数项放回到原来式子这里,梯度下降算法写作就会变成:
所以,如果有n个特征,也就是说:,那么就需要用这个式子来同时更新所有的值。
现在,如果把这个更新规则和我们之前用在线性回归上的进行比较的话,最后可能会惊讶地发现,这个式子正是我们之前用来做线性回归梯度下降的式子!
那么,这时候小Mi就有疑问了,线性回归和逻辑回归是同一个算法吗?回答这个问题,我们先观察一下逻辑回归发生了哪些变化。实际上,假设的定义发生了变化。
对于线性回归假设函数:
而现在逻辑函数假设函数:
因此,即使更新参数的规则看起来基本相同,但由于假设的定义发生了变化,所以逻辑函数的梯度下降,跟线性回归的梯度下降实际上是两个完全不同的东西。
在先前的视频中,当我们在谈论线性回归的梯度下降法时,我们谈到了如何监控梯度下降法以确保其收敛,同理,通常也把同样的方法用在逻辑回归中,来监测梯度下降,以确保它正常收敛。
最后还有一点,我们之前在谈线性回归时讲到的特征缩放,特征缩放可以帮助提高梯度下降的收敛速度,同时也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。
6 高级优化
这一章节我们会涉及一些高级优化算法和一些高级的优化概念,利用这些方法,我们就能够使其速度大大提高,而这也将使算法更加适合解决大型的机器学习问题,比如,我们有数目庞大的特征量。 现在我们换个角度来看什么是梯度下降,我们有个代价函数,而我们想要使其最小化,那么我们需要做的是编写代码,当输入参数时,它们会计算出两样东西:以及J等于0、1直到n 时的偏导数项。
假设我们已经完成了可以实现这两件事的代码,那么梯度下降所做的就是反复执行这些更新。 另一种考虑梯度下降的思路是:我们需要写出代码来计算和这些偏导数,然后把这些插入到梯度下降中,然后它就可以为我们最小化这个函数。 对于梯度下降来说,实际上并不需要编写代码来计算代价函数,只需要编写代码来计算导数项,但是,如果希望代码还要能够监控这些的收敛性,那么我们就需要自己编写代码来计算代价函数和偏导数项。所以,在写完能够计算这两者的代码之后,我们就可以使用梯度下降。 然而梯度下降并不是我们可以使用的唯一算法,还有其他一些算法,更高级、更复杂。如果我们能用这些方法来计算代价函数和偏导数项两个项的话,那么这些算法就是为我们优化代价函数的不同方法,共轭梯度法 BFGS (变尺度法) 和L-BFGS (限制变尺度法) 就是其中一些更高级的优化算法,它们需要有一种方法来计算 ,以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。这三种算法有许多优点:
一个是使用这其中任何一个算法,通常不需要手动选择学习率 ,所以对于这些算法的一种思路是,给出计算导数项和代价函数的方法,可以认为算法有一个智能的内部循环,而且,事实上,他们确实有一个智能的内部循环,称为线性搜索(line search)算法,它可以自动尝试不同的学习速率 ,并自动选择一个好的学习速率 ,因此它甚至可以为每次迭代选择不同的学习速率,那么就不需要自己选择。这些算法实际上在做更复杂的事情,不仅仅是选择一个好的学习速率,所以它们往往最终比梯度下降收敛得快多了,不过关于它们到底做什么的详细讨论,我们后续再详细讨论啦。
我们实际上完全有可能成功使用这些算法,并应用于许多不同的学习问题,而不需要真正理解这些算法的内环间在做什么,如果说这些算法有缺点的话,那么小Mi真的很想吐槽一下它们比梯度下降法复杂多了!特别是 L-BGFS、BFGS这些算法,除非你是数值计算方面的专家。不过值得高兴的是,我们现在很多编程软件都有强大的库可以调用!它们会让算法使用起来更模糊一点,也许稍微有点难调试,不过由于这些算法的运行速度通常远远超过梯度下降。所以当有一个很大的机器学习问题时,小Mi会选择这些高级算法,而不是梯度下降。
7 多类别分类:一对多
首先上例子:
Example one:假如说现在需要一个学习算法能自动地将邮件归类到不同的文件夹里,或者说可以自动地加上标签,那么,也许需要一些不同的文件夹,或者不同的标签来完成这件事,来区分开来自工作的邮件、来自朋友的邮件、来自家人的邮件或者是有关兴趣爱好的邮件,那么,我们就有了这样一个分类问题:其类别有四个,分别用y=1、y=2、y=3、y=4 来代表。
Example two:如果一个病人因为鼻塞来到诊所,他可能并没有生病,用y=1这个类别来代表;如果患了感冒,用 y=2来代表;如果得了流感用来y=3代表。
Example three:如果我们正在做有关天气的机器学习分类问题,可能想要区分哪些天是晴天、多云、雨天、或者下雪天。
上述所有的例子中,y可以取一个很小的数值,一个相对"谨慎"的数值,比如1 到3、1到4或者其它数值,以上说的都是多类分类问题,然而对于之前的二元分类问题,我们的数据图像是这样的:
对于一个多类分类问题,我们的数据集或许看起来像这样:
用3种不同的符号来代表3个类别,而给出3个类型的数据集,我们又如何得到一个学习算法来进行分类呢?
我们现在已经知道如何进行二元分类,可以使用逻辑回归,对于直线或许你也知道,可以将数据集一分为二为正类和负类。用一对多的分类思想,我们可以将其用在多类分类问题上。
下面将介绍如何进行一对多的分类工作,有时这个方法也被称为"一对余"方法。
有一个训练集,好比上图表示的有3个类别,我们用三角形表示y=1 ,方框表示y=2,叉叉表示 y=3。我们下面要做的就是使用一个训练集,将其分成3个二元分类问题。
先从用三角形代表的类别1开始,实际上我们可以创建一个,新的"伪"训练集,类型2和类型3定为负类,类型1设定为正类,创建一个新的训练集,如下图所示的那样,拟合出一个合适的分类器。
这里的三角形是正样本,而圆形代表负样本。可以这样想,设置三角形的值为1,圆形的值为0,然后训练一个标准的逻辑回归分类器,这样我们就得到一个正边界。
为了能实现这样的转变,我们将多个类中的一个类标记为正向类(y=1),然后将其他所有类都标记为负向类,这个模型记作。接着,类似地第我们选择另一个类标记为正向类(y=2),再将其它类都标记为负向类,将这个模型记作 ,依此类推。 最后我们得到一系列的模型简记为: 其中:。
最后,在我们需要做预测时,再将所有的分类机都运行一遍,然后对每一个输入变量,都选择最高可能性的输出变量。
总之,我们已经把要做的做完了,现在要做的就是训练这个逻辑回归分类器:, 其中i对应每一个可能的y=i,最后,为了做出预测,我们给出输入一个新的x值,用这个做预测。我们要做的就是在我们三个分类器里面输入x,然后我们选择一个让最大的i,即。
现在我们知道了基本挑选分类器的方法,选择出哪一个分类器是可信度最高效果最好的,那么就可认为得到一个正确的分类,无论值是多少,我们都有最高的概率值,我们预测y就是那个值。这就是多类别分类问题,以及一对多的方法,通过这个小方法,也可以将逻辑回归分类器用在多类分类的问题上啦~
终于,逻辑回归也带着大家一起学习完啦!这里小Mi不由地要感慨一下,历史总是相似的,经典也是亘古不变的,适用于线性回归的方法说不定也适用于逻辑回归,只是细节有所不同而已。下期我们还将学习新一轮的学习算法,大家做好准备了吗?我们,下期见呦~

    推荐阅读