Andrew Ng机器学习笔记(六)

简介


模型选择、算法诊断、误差分析在机器学习当中十分重要,可以帮助我们改进算法,减少浪费不必要的时间。

主要内容


Deciding what to try next

本节主要讲了在改进一个机器学习系统的时候,接下来该怎么做。怎样选用正确的特征来构造学习算法,或者选择正则化中的参数λλ

Andrew Ng机器学习笔记(六)
之前我们学习到的用线性回归的方法预测房价,代价函数如上图中的JJ函数,但是当我们学习了参数之后,会发现这个预测应用于一个新的训练数据上面时有很大的误差,这个时候,我们可以采用一些方法来解决这个问题,比如:取更多的训练样本;减少特征变量;增加其它的特征量;增加一些多项式特征变量;减小λλ或者增大λλ等来解决误差过大这个问题。接下来要介绍的一种方法是机器学习诊断法。
诊断法就是判断一种学习算法能不能工作,并且改善该算法性能的一种方法。诊断法的执行和实现是需要花费一点时间的,但是这个方法也帮助我们节省了很多时间,比如避免把过多的时间用在收集更多的训练样本上面。


Evaluating a hypothesis:

Andrew Ng机器学习笔记(六)

从上图可以看出,训练误差最小并不一定是好事,有可能会出现过拟合的情况。当训练样本的变量很少的时候,我们可以通过画图的方法来看出是不是发生了过拟合现象。但是当变量很多的时候,画图就不是那么好画了,这个时候,我们可以用评价假设函数的方法来判断是不是发生了过拟合现象。

Andrew Ng机器学习笔记(六)

首先,我们可以把所有数据都分为两个集合,一个训练集,还有一个测试集,将数据分成两部分,根据经验最典型的划分方法是按照7:3的比例来划分,但是如果要评估的一组数据是有顺序的,那么,最好是随机选择70%作为训练集。用训练集得到参数向量,用测试集进行测试。

Andrew Ng机器学习笔记(六)
首先,用训练集对θθ进行更新,得到参数θθ,然后,将之前用训练集得到的θθ带入Jtest(θ)J_{test} (θ)的公式里面计算出测试误差,这是当我们使用线性回归和平方误差标准的时候使用的计算测试误差的公式(和线性回归里面计算代价函数的公式相似)。
Andrew Ng机器学习笔记(六)
当我们使用逻辑回归的时候,也是用训练样本算出θθ向量之后,带入逻辑回归里面求代价函数的公式,得到逻辑回归的测试误差。


Model Selection and Train_Valid_Test Sets

把数据不仅分为训练集和测试集,而是将数据分为训练集,测试集和验证集。

训练集:学习样本数据集,通过匹配一些参数来建立一个分类器。建立一种分类的方式,主要是用来训练模型的。
验证集:对学习出来的模型,调整分类器的参数,如在神经网络中选择隐藏单元数。验证集还用来确定网络结构或者控制模型复杂程度的参数。
测试集:主要是测试训练好的模型的分辨能力(识别率等)

Andrew Ng机器学习笔记(六)

当我们改变θ的值让它能够很好地拟合目前的数据之后,我们并不能确定当我们的假设推广到训练集之外的新的样本上面的时候,这组θ的值带进去也能很好地让数据拟合。但是一个更加普遍的规律是:当我们的一组参数非常拟合某个数据组的时候,那么,我们的假设对于相同数据组的预测误差是不能用来推广到一般情况的,或者说不能作为实际的泛化误差。

Andrew Ng机器学习笔记(六)

dd代表多项式的最高项的次数,然后每取一个dd的值代表一个模型。选择第一个模型,然后求训练误差的最小值,得到一个参数向量θθ,然后再选择第二个模型,求训练误差,得到另外一个参数θθ以此类推。之后,将每组θθ分别带入多组测试误差。然后选择一组测试误差最小的参数θθ,然后看看能不能应用于其他的训练样本集。

Andrew Ng机器学习笔记(六)

这里引入一类数据集叫做cross validation set即交叉验证数据集,将所有的数据按照6:2:2分为训练集,交叉验证数据集,测试集。

Andrew Ng机器学习笔记(六)

上图是三种不同类型数据集的误差的计算公式,都差不多,只是带入的数据不一样而已。

Andrew Ng机器学习笔记(六)

上图的方法和之前选择测试集向量的方法相似。一般来说cross validation的误差大于等于训练集的误差。因为测试集数据没有和假设拟合过,我们可以用这一组数据来评测模型的泛化能力。
现在很少有人使用测试集来做模型,然后再使用相同的测试集来报告误差。通过使用测试集来选择多项式的次数,然后求测试集的预测误差,尽管这样做能得到一个很理想的泛化误差,但是用测试集来选择模型实在不是一个好主意,如果你有一个很大很大的测试集,也许情况会好一点,但是经验总结下来还是最好不要这样做。最好还是分成训练集,验证集和测试集。实际使用时,我们通过训练集学习到参数,再计算交叉验证集上的error,再选择一个在验证集上error最小的模型,最后再在测试集上估计模型的泛化误差。

1.training sets是用作训练时调整神经网络的weights;
2.validation sets并不是用作调整weights,而是用作防止overfitting(过拟合)的。如果由training sets得到的精度随着训练的进行在增加,而这个模型经过validation sets计算后,发现精度与之前保持不变,或者精度反而下降了。这说明,已经产生overfitting了,需要停止训练。也就是让这个model在training sets与validation sets之间trade-off,更balance。
3.testing sets只用来测试模型,来看这个模型究竟有多好,就是评价这个模型的泛化能力(generalization)。 这时候,这个model在testing sets上得到的accuracy就是一个很有代表性(representative)的accuracy,以后再在新的数据集上测试时,也跑不离这个精度的范围。
4.validation sets的作用不仅仅是在训练中防止训练模型过拟合,平衡training accuracy与validation accuracy,而且有“compare their performances and decide which one to take”。


Diagonosing Bias vs.Varience

本小节主要学习判断算法出现的问题是high bias(偏差)的欠拟合,还是high variance(方差)的过拟合,还是两者均存在的过拟合问题

Bias:
衡量模型拟合训练数据的能力(训练数据不一定是整个 training dataset,而是只用于训练它的那一部分数据,例如:mini-batch)。bias 越小,拟合能力越高(可能产生overfitting);反之,拟合能力越低(可能产生underfitting)。注意,bias是针对一个模型来说的,这一点与variance不同。这点还是比较好理解的,bias 翻译成偏差,从字面意思也可以看出是和某个值的偏离程度,而这个某个值在机器学习算法中就是整个数据的期望值。
Variance:
衡量模型的 generalization 的能力。variance 越小,模型的 generalization 的能力越高;反之,模型的 generalization 的能力越低。它是针对多个模型来说的,针对多个模型来说是什么意思?看下面的分析。在训练模型的时候不是一下子在整个 training dataset 上进行训练,而是采用从 training dataset 中 sample 数据点的方式来进行训练(例如:mini-batch)。

Andrew Ng机器学习笔记(六)

Andrew Ng机器学习笔记(六)

上图左边的为欠拟合,中间拟合的刚好,右边的就过拟合了,之前正则化的课程中也有讲到。

Andrew Ng机器学习笔记(六)

偏离:训练误差大,交叉验证误差大,训练误差≈交叉验证误差。bias产生于dd小,欠拟合。
偏差:训练误差小,交叉验证误差大,训练误差<<交叉验证误差,variance产生于dd大,过拟合。

Andrew Ng机器学习笔记(六)

线性回归中,次方代表的是参数的个数,次方越低,表示参数越少,次方越高,表示参数越多。上图是一个参数个数-error的曲线图。
当为bias的时候Jcv(θ)Jtrain(θ)J_{cv} (θ)≈J_{train} (θ)并且它们都很大;当为variance的时候Jcv(θ)&gt;&gt;Jtrain(θ)J_{cv} (θ)&gt;&gt; J_{train} (θ).


Regularization and Bias_Variance:

Andrew Ng机器学习笔记(六)

之前学过线性回归的正则化,就是加入一个λλ然后使函数能够很好地拟合,λλ过大会导致欠拟合,如上图最左边的图,λλ过小会导致过拟合,如上图最右边的图。

Andrew Ng机器学习笔记(六)

不进行正则化的时候上面的训练误差、交叉验证误差、测试误差公式如上。

Andrew Ng机器学习笔记(六)

对误差函数进行正则化的时候,将λ从0,0.01,一直往上每次乘以2,那么到10.24总共可以试12次λλ,这12个λλ会得到12个模型的代价函数,每个对应有J(θ)J(θ)Jcv(θ)J_{cv }(θ)。和之前的模型选择的方法一项,首先选出每个代价函数下J(θ)最小的θ,然后取出令J(θ)J(θ)最小的一组作为最终的λ。

Andrew Ng机器学习笔记(六)

λλ太小导致拟合,产生偏差,J(train)&lt;&lt;J(cv)J(train)&lt;&lt;J(cv)λλ太大导致欠拟合,产生偏离,J(train)J(cv)J(train)≈J(cv)


##Learning Curves:
学习曲线对于我们检查学习算法的运行是否一切正常和改进算法的表现或效果非常重要。

Andrew Ng机器学习笔记(六)

我们通常在画学习曲线之前先画出训练数据集的平均误差平方和。要把交叉验证集数据的平均误差平方和绘制出来就是要将它绘制成一个关于mm的函数,也就是关于训练集样本总体的函数,所以mm一般是一个常数。从上图右侧的图片可以看出来,当mm很小的时候,因为训练集很少,训练误差非常小,我们可以完全拟合这些少量的数据,但是随着mm的增大,拟合效果开始下降,也就是训练误差开始增大,交叉验证集的误差开始减小,训练误差和交叉验证集的误差逐渐接近,所以这个时候训练模型的泛化能力增大。综上,当训练集很小的时候,训练模型的泛化能力很差,不能很好地适应新的样本,当m’逐渐增大时,训练模型的泛化能力逐渐增加。

Andrew Ng机器学习笔记(六)

在高偏离(欠拟合)的情况下,增大m的作用很小,因为模型本身就拟合地很差。

Andrew Ng机器学习笔记(六)

在高偏差的情况下,增大m可以让训练误差和交叉验证误差的差距缩小,有助于加强泛化能力。


Deciding What to Do Next Revisited

Andrew Ng机器学习笔记(六)

上图在what to try next 当中讲到过,这里就不再说了。根据上一节的学习曲线图可以很快地找到很好的解决方法。(高偏差可以采用1、2、6,高偏离可以采用3、4、5)。

Andrew Ng机器学习笔记(六)

一个比较简单的神经网络,学习参数比较少,所以比较容易出现欠拟合,但是这样的神经网络计算量比较小。比较复杂的神经网络,如上图右边的两种,一种是隐藏单元比较多,一种是隐藏层比较多,这种神经网络容易出现过拟合,但是这种神经网络计算出的结果性能会比较好,但是计算量会比较大,一般一个复杂的神经网络通过正则化修正过拟合后的结果要明显好于一个简单的神经网络的效果。但是隐藏层的选择通常也是一个困难的问题,经验是选择一个隐藏层比较合理。比如我们可以把数据分割成训练、验证、测试三个部分,然后分别计算不同隐藏层数的神经网络结构在验证集上的表现,从而来确定神经网络层数。对于以上的简单的和复杂的神经网络,我们都可以采用之前降到的方法解决。


Prioritizing What to Work On:

Andrew Ng机器学习笔记(六)

比如我们要判断一封邮件是不是垃圾邮件,我们可以收集大量的训练样本,然后选出一些词(一般我们选取训练集中出现频率最高的nn个词(10000~50000),把这些词作为评判垃圾邮件的标准。然后遍历整封邮件,统计出指定词出现与否,如果这个写出来的向量非0元比较多(规定1为出现垃圾邮件判断词,0为不出现),那么可以初步判定这封邮件就是一封垃圾邮件。

Andrew Ng机器学习笔记(六)

建立好了垃圾邮件分类模型之后,我们要做的就是降低我们判断垃圾邮件的错误率了。我们可以做的有四个方面,如上图:收集大量的数据;用更加复杂的特征变量;从邮件的正文出发,找到一些更加复杂的特征;构造更加复杂的算法来检测、纠正那些故意的拼写错误。一般很多研究垃圾邮件分类的研究小组会随机选择一个方法去研究,但是这种方法并不一定是最好的方法,所以还是要不断尝试,不断思考,找出解决问题比较好的方法来。


Error Analysis:

在机器学习中有很多的优化方向,而且任何的优化方向都会花费我们很多的时间,误差分析可以帮助我们更加系统地做出决定。我们可以根据以下步骤来进行优化。
给出一个可以运行的简单算法的模型,用这个模型测试你的交叉验证集,不要一开始就追求复杂的算法,这样可能往往会浪费很多时间。
绘制出学习曲线,然后判断是否需要更多的数据、更多的变量等等。
误差分析:人工检查在验证集中被我们算法错误分类的数据,从这些分离出来的数据集中,我们可以探究是否存在某种趋势或者某种特征导致分类失误,然后去提高这个算法。

Andrew Ng机器学习笔记(六)

通过上图,我们发现有一半的错误分类邮件都是关于盗取密码的,这关于盗取密码的53封错误分类邮件中,又有32封邮件有着胡乱使用标点符号的特征。那么我们就可以有针对性的对这类邮件进行处理并添加标点符号这一特征。这是一种手动检测算法错误的方法,这种方法往往能帮助我们找到最有效解决问题的办法。

Andrew Ng机器学习笔记(六)

当我们完成了改进,很重要的一点,我们需要一个单一的数值结果来表示我们的误差,否则我们很难去描述我们的模型算法的效果。通过这个单一数值,我们就能知道,当我们使用了新的特征,新的数据处理算法,模型是否变好了。用交叉验证集来做误差分析,而不是用测试集做误差分析。


Error Metrics for Skewed Classes:

单一数值的误差度量是很重要的,我们需要通过这个数值来评判我们模型的好坏和泛化能力。对于分类问题,如果我们一般采用classification accuracy(classification error),即正确分类的样本数除以总样本数。但是这样的误差度量对于带有skewed class(倾斜类)的样本来说不是很准确。

Andrew Ng机器学习笔记(六)

如果我们的模型在测试集上的误差仅有1%,你可能会觉得这个模型还不错,但是如果我们的样本中仅有0.5%的病人有癌症,这个时候1%的误差就显得不是那么好了。skewed class(偏斜类)就是样本中,一类样本特别少,另一类样本特别多的情况。比如上面的例子。

Andrew Ng机器学习笔记(六)

令y=1代表我们想要探查样本中少的那一方
Precision:对于所有我们判定y=1的类,实际上有多少比例是真正的y=1(用我们判定的数目除以预测的数目)
Recall:对于所有的真正y=1的类,实际上我们判定了多少比例的y=1(用我们判定的数目除以真实有的数目)
对于刚刚的情况(只有0.5%的人患有癌症,如果我们全部判定没有癌症),准确率为99.5%,recall为0,那么显然这个算法就有问题,不能使用。


Trading Off Precision and Recall:

Andrew Ng机器学习笔记(六)

有了Precision和Recall,我们就能解决带有偏斜类的样本问题。在实际问题中,很多时候我们需要对Precision和Recall进行一定的权衡。我们依然以判定是否病人有癌症为例。
运用逻辑回归,一般我们将阈值设置为0.5,即当hθ(x)0.5h_θ(x)≥0.5预测y=1hθ(x)&lt;0.5y=1,h_θ(x)&lt;0.5预测y=0y=0。我们可以调整阈值来达到不同的效果

  1. 阈值高
    我们希望我们判断的准确度高,即要么我们不下判断,一旦下了判断y=1y=1,那么这个样本实际上就属于y=1y=1(即判断一个病人有癌症,那么他就有癌症),但是这种情况容易漏掉很多y=1的样本(即他有癌症,但是我们判定他没有癌症),召回率低
  2. 阈值低
    我们希望我们需要判断出样本中所有的y=1y=1,为了避免错将有癌症的人判定为没有癌症,耽误他们的治疗。这样做的话,召回率就高,当然准确率就会比较低了。
    如果是只有单一数值度量,那么我们就可以直接运用这个度量来进行评判。但是对于带有偏斜类的样本有了两个测量值(准确度和召回率),就需要把它们结合起来转化为一个数值度量,因此我们引入 F1ScoreF_1 Score

Andrew Ng机器学习笔记(六)

F1ScoreF_1Score不具备什么实际意义,只是很好的把准确度和召回率结合了起来。那么实际运用当中,设置阈值等价于模型选择时对次方的设置,以及正则系数的选择,我们需要设置一系列的阈值,然后通过验证集来找到一个对于这个任务的最佳的阈值。


Data for Machine Learning:

对于机器学习任务来说,很多时候不是谁的算法好谁就能取得很高的accuracy,而是取决于谁的训练数据大,如果训练数据大小差上好几个量级,再好的算法也是无济于事的。

Andrew Ng机器学习笔记(六)

因为训练集大正确率就高是有前提条件的,所以并不是所有的情况下,只要增大数据集就有效,,只要我们选取的变量带有足够的信息以至于能够很好的预测 yy就行。判断我们所选取的变量带有足够大信息只需要知道在人类相应领域的专家能否通过这些特征很好的预测出$ y$就行了,如果可以说明这些特征足够了,如果不行,说明这些特征不够或者特征选取有误。一味增加数据集对欠拟合的模型是没有帮助的。

Andrew Ng机器学习笔记(六)

上面这张图就是讲述了大数据集能够取得很好的误差的道理。


参考链接

http://blog.****.net/u010167269/article/details/51340070
http://blog.****.net/losteng/article/details/50766252
https://www.zhihu.com/question/27068705/answer/149460709