第十一章 应用机器学习的建议
该系列文章为,观看“吴恩达机器学习”系列视频的学习笔记。虽然每个视频都很简单,但不得不说每一句都非常的简洁扼要,浅显易懂。非常适合我这样的小白入门。
本章含盖
- 11.1 决定下一步做什么
- 11.2 评估假设
- 11.3 模型选择和训练、验证、测试集
- 11.4 诊断偏差与方差
- 11.5 正则化和偏差、方差
- 11.6 学习曲线
- 11.7 决定接下来做什么
决定下一步做什么
当你发现,你的假设函数在新的数据集上有很大的偏差时,你可以尝试做些什么了?- 获取更多的训练样本
- 尝试使用更少的特征集(👈,防止过拟合)
- 尝试使用更多的特征
- 尝试增加多项式特征
- 尝试减小 λ(正则化参数)
- 尝试增大 λ(正则化参数)
👆的方法,一般都是需要花费比较长的时间(如,6个月)才能看到改正后的效果到底是好的,还是坏的。也就是,你选择的方法是对,的还是错的。
通过“机器学习性能评估”和“机器学习诊断”能快速过滤掉至少一半(上面)的无用选项
机器学习诊断
诊断:这是一种测试法。你通过执行这种测试,能够了解算法在哪里出了问题。这通常也能够告诉你,要想改进一种算法的效果,什么样的尝试才是有意义的。
这些诊断的执行和实现是需要花些时间的。确实需要花很多时间来理解和实现。但这样做的确是把时间用在了刀刃上。因为诊断法能让你节省几个月的时间,提早发现某些方式是无效的。
11.2 评估假设
过拟合:
怎么样判断一个“假设函数”是否过拟合了?
1,如果特性参数很少的话,可以通过将假设函数画出来,来判断是否过拟合。
2,当特征参数很多时,就无法通过画图(因为很难或者根本无法画出这样的图)来判断假设函数是否过拟合。那么,我们就需要使用其他方法了。
评估“假设函数”的标准方法:
为了确保我们可以评估我们的假设函数,我们要做的是,将我们的训练样本分成两份。第一部分成为我们的训练集;第二部分成为我们的测试集。
将所有的数据分成:训练集和测试集。其中一种典型的分割方法是,按照 7 :3 的比例。70% 为训练集;30% 为测试集。
注意,因为👆我们选择了前70%的数据为训练集,后30%的数据为测试集。因此如果这组数据有某种规则或顺序的话,那么最好是随机选择70%和30%的数据。(即,保证“训练集”和“测试集”的随机性和一致性)
-
👇展示了一种典型的方法,来训练和测试你的学习算法。比如,线性回归算法
首先,你需要对训练集进行学习得到参数 θ 。具体来讲,就是最小化训练误差J(θ)。
接下来,计算测试误差。我们将从训练集中学习得到的参数 θ,放在J_test(θ),来计算你的测试误差。
当然,👆这个是我们使用线性回归和平方误差标准时,测试误差的定义。
训练和测试逻辑回归的步骤与前面(线性回归)所说的非常类似。
首先,我们要从训练数据,也就是70%的数据中,学习得到参数 θ。
除了 J_test(θ),还有另一种形式的测试度量,可能更易于理解,叫做“错误分类”,也被称为“0/1分类错误(0:分类正确;1:分类错误)”
err(h_(θ), y) 👈关于假设函数(即,h_(θ))和标签y的误差。
然后我们就能应用“错误分类”误差来定义“测试误差”,即:
👆,这实际上就是我的假设函数误标记的部分在测试集中的比率(误分类的比率)。
👆,这也就是使用“0/1错误分类度量”来定义的测试误差。
11.3 模型选择和训练、验证、测试集
如果你想要确定对于一个数据集,最合适的多项式次数,怎样选用正确的特征,来构造学习算法。或者你需要选择学习算法中的正则化参数 λ ,我们应该怎么做。
👆这类问题被叫做“模型选择问题”。
我们不再是将数据分为“训练集”和“测试集”。而是将数据分为三个数据组:训练集、测试集、验证集。
该视频会介绍如何将数据分为这三个数据组,以及这三个数据组的含义,同时告诉我们如何使用这些数据组进行模型选择。
👆过拟合。一个假设函数在训练集的误差很小,并不能说明在新数据上的泛化能力好。
下面我们来考虑模型选择问题。
假如,你现在要选择能最好拟合数据的多项式次数。
所以,除了参数 θ,还有参数 d 需要你要数据集来确定。
第一步:使用“训练集”拟合参数 θ
首先,选择第一个模型,然后最小化训练误差。这样你会得到一个参数向量 θ^(1)。
然后,你再选择第二个模型,用它拟合你的训练集,这样就得到另一个参数向量 θ^(2)。
以此类推。。。
第二步:使用“测试集”/“验证集”拟合参数 d
然后,对所有这些模型求出“测试集误差”。即,J^ (θ^(i))_test
接下来,为了从这些模型中选出最好的一个。我们应该看哪个模型有最小的“测试误差”。选择那个有最小误差的模型。
比如,此处选择了’第五个模型’,即,5次多项式函数拟合的模型。
第三步:
验证所选出模型的泛化能力。即,使用“验证集误差”来进行泛化能力评估。J^ (θ^(i))_cv
第二步和第三步的集合可互换使用,因为,典型分配模式下,它们的样本个数是一样的。
参数向量 θ^(i) :表示,用 i 次多项式函数拟合数据得到的参数向量。
交叉验证(验证集),简称“cv”(cross validation set)。
“训练集” :“交叉验证” :“测试集” 典型的分配比例为:60% :20% :20%。这个比例值可以稍微调整,但这种分法是最典型的比例。
👇“训练误差”、“交叉验证误差”、“测试误差” 串起来:注意:对于你有一个很大很大的训练集时,你使用相同的训练集进行参数的拟合,以及泛化能力的评估,可能没有多大的问题。但如果你没有很大很大的数据集,就应该使用👆说的方法,将数据集分为“训练集”、“交叉验证”、“测试集”来分别进行参数的拟合,和泛化能力的评估。
11.4 诊断偏差与方差
当你运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:
① 要么是偏差比较大
② 要么就是方差比较大
换句话说,要么就是欠拟合问题,要么是过拟合问题。
这种情况下,搞清楚是‘偏差问题’还是’方差问题’,或者两者都有关,这一点很重要。
“偏差”和“方差”的概念
假设你正在构建一个猫咪识别器。目前,你的训练集错误率为15%,并且你的开发集错误率为16%。
那么,算法在训练集上的错误率。在本例中,它是15%。我们非正式的认为这是算法的偏差(bias)。
其次,算法在开发(或测试)集上比训练集差多少。在本例中,开发集比训练集差1%。我们非正式的认为这是算法的方差(Variance)。即,方差 = 开发集/训练集的错误率 - 测试集的错误率
因为搞清楚是哪一点的问题,就能很快找到有效的方法和途径来改进算法。
横坐标:多项式次数,即,参数 d
随着多项式次数的增大,训练误差越来越小。
交叉验证误差 和 测试集误差 类似
具体来说,假设你得到了一个学习算法。而这个并没有表现的像你期望的那样好。如果你的 交叉验证误差 或者 测试集误差 都很大,我们怎么判断,此时的学习算法出现了高偏差的问题,还是高方差的问题?
交叉验证误差很大的情况出现在’凹行曲线’的两端。左边一端对应的是“高偏差问题(即,欠拟合问题)”,表示使用了一个过于小的多项式次数,而实际上,我们需要一个较高的多项式次数来拟合数据。
相反地,右边一端对应的是“高方差问题(即,过拟合问题)”。
具体来说,
相对于’高偏差(欠拟合)的情况’:我们发现,“交叉验证误差”和“训练集误差”都会很大
反过来,如果你的算法有“高方差(过拟合)问题”:你会发现,“训练集误差”很小,但是“交叉验证误差”远远大与“训练集误差”。
11.5 正则化和偏差、方差
当我们对高阶多项式进行拟合的时候,为了防止过拟合,我们会在代价函数中加入正则化项,来让参数的值尽可能小
那么如何自动的选择一个最合适的正则化参数 λ 的值呢?(类似于“多项式”的选择)👇这就是我们自动选择正则化参数 λ 的方法。 通常我的做法是,选取一系列我想要尝试的 λ 值。因此,首先我可能考虑不是用正则化,以及一些列我可能会试的值。
通常,我一般将 步长 设置为 2倍速度增长,直到一个比较大的值。
👆我们用交叉验证集来拟合参数,使用测试集来评估 h(θ) 的泛化能力。
11.6 学习曲线
使用学习曲线来判断一个学习算法是否处于偏差、方差问题,或者二者都有
为了绘制学习曲线,我们通常先绘制 J_train 或 J_vc训练集的样本是个常数,一般很大。我们使用小部分训练样本来绘制图即可。如,如果有100个训练样本,我们使用30、40个样本来绘制图即可。
当 m 很小时,训练误差很小。反过来,当 m 值逐渐增大,训练误差就会越来越大。
当我们的假设函数 h(θ) 出现高偏差问题时的学习曲线:当 m 足够大时,你就会找到条最有可能拟合数据的那条直线。并且,此时,即便你继续增大训练集的样本容量,还是会得到一条差不多的直线。因此交叉验证集误差将会变为水平而不再变化,只要达到或超过一定数量的训练样本。
而训练集误差的情况是,一开始样本极少的时候,可以很好的拟合数据,但是随着样本的增加,你会发现训练集误差会逐渐增大,最后接近交叉验证误差。
最后补充一点,高偏差的学习曲线,可能有很高的交叉验证误差和训练集误差(即,纵轴值很大),也就是说,最终你会得到一个值比较大的 J_cv 和 J_train。
如果一个学习算法有高偏差,选用更多的训练样集数据对于改善算法表现并无帮助。
👆这个特征,对于我们判断我们的学习算法是否处于‘高偏差’情况,很重要。
当算法处于’高方差’时的学习曲线:
算法处于’高方差’的一个很明显的特征:训练集误差和交叉验证误差之间有一段很大的距离。如果我们增大训练集的样本数,‘训练集误差’ 和 ‘交叉验证误差’ 这两条学习曲线则会互相靠近。也就是,随着训练集样本数的增大,’训练集误差’会不断增大,而‘交叉验证误差’会不断减小(这同‘高偏差’的情况是不一样的,‘高偏差’情况,随着训练样本数的增加,’训练集误差’和‘交叉验证误差’会变为水平而不再变化)。
因此,在’高方差’情况下,使用更多的训练样本对改进算法表现是有帮助的。
11.7 决定接下来做什么
-
获取更多的训练样本
解决“高方差”问题 -
尝试使用更少的特征集(👈,防止过拟合)
解决“高方差”问题 -
尝试使用更多的特征
并非一定,通常使用来解决“高偏差”问题的一个方法 -
尝试增加多项式特征
这是另一种修正“高偏差”问题的方式
-
尝试减小 λ(正则化参数)
可以修正“高偏差”问题 -
尝试增大 λ(正则化参数)
修改“高方差”问题。
当你在进行神经网络拟合的时候,你可以选择一种相对比较简单的神经网络模型:隐藏层单元较少,甚至只有一个隐藏层,并且只有少量的隐藏单元。像这样的一个简单神经网络,参数就不会很多,容易出现欠拟合。
这种比较小型的神经网络的最大优势,在于计算量较小。
与之相对的另一种情况是,拟合较大型的神经网络结构。比如,每一层中有很多的隐藏单元,或者有很多隐藏层。这种比较复杂的神经网络,参数一般较多,更容易出现过拟合。这种结构的一大劣势,也许不是主要的劣势,但还是需要考虑的,那就是当网络有大量神经元时,这种结构会有很大的计算量。
虽然有这个情况,但通常来讲这不是问题。这种大型的网络结构,最主要的潜在问题,还是它更容易出现过拟合现象。
事实上,如果你经常应用神经网络,特别是大型神经网络的话,你就会发现越大型的网络性能越好,但如果发生了过拟合,你可以使用正则化的方法来修正。
一般来说,使用一个大型的网络神经,并使用正则化来修正过拟合问题,通常比使用一个小型的网络效果更好,但主要可能出现的一个问题,就是计算量相对较大。
最后,你还需要选择,所需的隐藏层的层数。通常来说,使用一个隐藏层是比较合理的默认选项。但如果你想要选择一个最合适的隐藏层层数,你也可以试试,把数据分割成训练集、验证集和测试集。然后训练一个隐藏层的神经网络,然后试试两个、三个隐藏层,然后看看哪个神经网络在交叉验证集上表现得最理想。