吴恩达机器学习——应用机器学习的建议
本章核心思想:
在设计机器学习的系统时,怎样选择一条最合适、最正确的道路,来高效地应用我们之前学过的算法,进而在改进学习算法的表现时,来判断哪些途径可能是有帮助的,而哪些方法可能是无意义的。
本章内容简介:
· 10.1决定下一步做什么
· 10.2评估假设
· 10.3模型选择和训练、验证、测试集
· 10.4诊断偏差与方差
· 10.5正则化和偏差、方差
· 10.6学习曲线
· 10.7决定接下来做什么
10.1决定下一步做什么
假如我们在开发一个机器学习系统,或者想试着改进一个机器学习系统的性能,我们应如何决定接下来应该选择哪条道路?
为了解释这个问题,我们不妨继续引用预测房价的例子——假如我们已经完成了正则化线性回归,也就是最小化代价函数𝐽的值,并且得到了我们的学习参数,现在要将原来的假设函数放到一组新的房屋样本上进行测试,但是却发现在预测房价时产生了巨大的误差,于是乎我们要改进原来的算法,那接下来应该怎么办?
一般来说我们都会先想到获得更多的训练实例——这通常是有效的,但代价较大:往往会花费较多的时间,而且有时候更多的训练数据实际上并没有什么作用。
下面的方法也可能有效,可以优先考虑采用下面的方法:
1.尝试减少特征的数量:【可以防止过拟合】
2.尝试获得更多的特征
3.尝试增加多项式特征:【这种方法对于线性模型有很大的提升,但对于更复杂的模型,如核SVM,随机森林,则意义不大】
4.尝试减少正则化程度𝜆:【正则化参数】
5.尝试增加正则化程度𝜆:【正则化参数】
但要注意的是:我们不应该随机选择上面的某种方法来改进我们的算法,而是运用一些机器学习诊断法来帮助我们知道上面哪些方法对我们的算法是有效的——不然可能会出现我们花费了不少时间却得不到好的效果。
机器学习诊断:
这是一种测试法,通过执行这种测试,我们能够深入了解某种算法到底是否有用。这通常也能够告诉我们,要想改进一种算法的效果,什么样的尝试,才是有意义的。不过要提前说明一点的是,这些诊断法的执行和实现,是需要花些时间的,有时候确实需要花很多时间来理解和实现,但这样做的确是把时间用在了刀刃上,因为这些方法让我们在开发学习算法时,会节省几个月的时间,
10.2评估假设
当我们确定学习算法的参数的时候,我们考虑的是选择参量来使训练误差最小化,但是,仅因为这个假设具有很小的训练误差,并不能说明它就一定是一个好的假设函数——过拟合假设函数是很难推广到新的训练集上的!
一般来说我们去判断一个假设函数是否过拟合时:
1,如果特性参数很少的话,可以通过将假设函数画出来,来判断是否过拟合;
2,当特征参数很多时,就无法通过画图(因为很难或者根本无法画出这样的图)来判断假设函数是否过拟合。那么,我们就需要使用其他方法了。
评估假设函数的标准方法:
为了检验算法是否过拟合,我们将数据分成训练集和测试集,通常用 70%的数据作为训练集,用剩下 30%的数据作为测试集。很重要的一点是训练集和测试集均要含有各种类型的数据,通常我们要对数据进行“洗牌”,然后再分成训练集和测试集。
测试集评估在通过训练集让我们的模型学习得出其参数后,对测试集运用该模型,我们有两种方式计算误差:
1.对于线性回归模型,我们利用测试集数据计算代价函数J;
2.对于逻辑回归模型,我们除了可以利用测试数据集来计算代价函数外:
除了 J_test(θ),还有另一种形式的测试度量,可能更易于理解,叫做“错误分类”,也被称为“0/1分类错误”。
err(h_(θ), y) 是关于假设函数h_(θ)和标签y的误差。
然后我们就能应用“错误分类”误差来定义“测试误差”,即:
对于每一个测试集(m_test)实例,计算:
然后对计算结果求平均:
10.3模型选择和训练、验证、测试集
如果我们想要确定对于一个数据集,选择合适的多项式次数,正确的特征,来构造学习算法,或者需要选择学习算法中的正则化参数 λ的问题 ——这类问题被叫做“模型选择问题”。
假设我们要在 10 个不同次数的二项式模型之间进行选择:
通过简单推导我么得知:显然越高次数的多项式模型越能够适应我们的训练数据集;但是适应训练数据集并不代表着能推广至一般情况(过拟合),我们应该选择一个更能适应一般情况的模型。我们需要使用交叉验证集来帮助选择模型。
即:使用 60%的数据作为训练集,使用 20%的数据作为交叉验证集,使用 20%的数据作为测试集。(训练集 :交叉验证 :测试集”典型的分配比例为:60% :20% :20%。这个比例值可以稍微调整,但这种分法是最典型的比例。)
模型选择的步骤:
一、使用“训练集”拟合参数 θ:
首先,选择第一个模型,然后最小化训练误差。这样会得到一个参数向量 θ^(1)。
然后,再选择第二个模型,用它拟合训练集,这样就得到另一个参数向量 θ^(2)。
以此类推……
二、使用“测试集”/“验证集”拟合参数 d(d:多项式的次数,如上图):
对所有这些模型求出“测试集误差”。即,J^ (θ^(i))_test
接下来,为了从这些模型中选出最好的一个。我们应该看哪个模型有最小的“测试误差”。选择那个有最小误差的模型。
三、验证所选出模型的泛化能力:
使用“验证集误差”来进行泛化能力评估。J^ (θ^(i))_cv
第二步和第三步的集合可互换使用,因为,典型分配模式下,它们的样本个数是一样的。
参数向量 θ^(i) :用 i 次多项式函数拟合数据得到的参数向量。
交叉验证(验证集),简称“cv”(cross validation set)。
训练误差、交叉验证误差、测试误差:
注意:对于你有一个很大很大的训练集时,你使用相同的训练集进行参数的拟合,以及泛化能力的评估,可能没有多大的问题。但如果你没有很大很大的数据集,就应该使用以上说的方法,将数据集分为“训练集”、“交叉验证”、“测试集”来分别进行参数的拟合,和泛化能力的评估。
10.4诊断偏差与方差
当运行一个学习算法时,如果这个算法的表现不理想,那么多半是出现两种情况:
① 要么是偏差比较大(欠拟合)
② 要么就是方差比较大(过拟合)
这种情况下,搞清楚是‘偏差问题’还是’方差问题’,或者两者都有关,这一点很重要。
假设模型是一个射击学习者,D1,D2直到DN就是N个独立的训练计划。
如果一个学习者是正常人,另外一个人丢失了视力,则可以想见,后者无论参加多少训练计划,都不会打中靶心,问题不在训练计划够不够好,而在他的先天缺陷。这就是模型偏差产生的原因,学习能力不够。正常人参加N个训练计划后,虽然也不能保证打中靶心,但随着N的增大,会越来越接近靶心。
假设还有一个超级学习者,他的学习能力特别强,参加训练计划D1时,他不仅学会了瞄准靶心,还敏感地捕捉到了训练时的风速,光线,并据此调整了瞄准的方向,此时,他的训练成绩会很好。
但是,当参加测试时的光线,风速与他训练时不一样,他却仍按照训练时学来的瞄准方法去打靶,肯定是打不好。这样产生的误差就是方差。
简单的说:学习能力不行造成的误差是偏差,学习能力太强造成的误差是方差。
我们通常会通过将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张
图表上来帮助分析:
此处横坐标:多项式次数,即,参数 d
根据上图可知:
对于训练集,当 𝑑 较小时,模型拟合程度更低,误差较大;随着 𝑑 的增长,拟合程
度提高,误差减小。
对于交叉验证集,当 𝑑 较小时,模型拟合程度低,误差较大;但是随着 𝑑 的增长,
误差呈现先减小后增大的趋势,转折点是我们的模型开始过拟合训练数据集的时候。
如果我们的交叉验证集误差较大,我们如何判断是方差还是偏差呢?根据上面的图表,
我们知道:
训练集误差和交叉验证集误差近似时:偏差(欠拟合)
交叉验证集误差远大于训练集误差时:方差(过拟合)
10.5正则化和偏差、方差
当我们对高阶多项式进行拟合的时候,为了防止过拟合,我们会在代价函数中加入正则化项,来让参数的值尽可能小:
那么如何自动的选择一个最合适的正则化参数 λ 的值呢?(这类似于“多项式”的选择)
以上便是我们选择一系列的想要测试的 𝜆 值,通常是 0-10 之间的呈现 2 倍关系的值(如:0, 0.01, 0.02, 0.04, 0.08, 0.15, 0.32, 0.64, 1.28, 2.56, 5.12, 10共 12 个)。
注:我们同样把数据分为训练集、交叉验证集和测试集。
选择𝜆的方法为:
1.使用训练集训练出 12 个不同程度正则化的模型
2.用 12 个模型分别对交叉验证集计算的出交叉验证误差
3.选择得出交叉验证误差最小的模型
4.运用步骤 3 中选出模型对测试集计算得出推广误差,我们也可以同时将训练集和交叉验证集模型的代价函数误差与 λ 的值绘制在一张图表上:
• 当 λ 较小时,训练集误差较小(过拟合)而交叉验证集误差较大
• 随着 λ 的增加,训练集误差不断增加(欠拟合),而交叉验证集误差则是先减小后增加
10.6学习曲线
学习曲线就是一种很好的工具,我经常使用学习曲线来判断某一个学习算法是否处于偏
差、方差问题。学习曲线是学习算法的一个很好的合理检验(sanity check)。学习曲线是将训练集误差和交叉验证集误差作为训练集实例数量(𝑚)的函数绘制的图表。
为了绘制学习曲线,我们通常先绘制 J_train 或 J_vc:
训练集的样本是个常数,一般很大。我们使用小部分训练样本来绘制图即可。如,如果有100个训练样本,我们使用30、40个样本来绘制图即可。
当 m 很小时,训练误差很小。反过来,当 m 值逐渐增大,训练误差就会越来越大。
问题一:
如何利用学习曲线识别高偏差/欠拟合:作为例子,我们尝试用一条直线来适应下面的数据,可以看出,无论训练集有多么大误差都不会有太大改观:
也就是说在高偏差/欠拟合的情况下,增加数据到训练集不一定能有帮助。
问题二:
如何利用学习曲线识别高方差/过拟合:假设我们使用一个非常高次的多项式模型,并且正则化非常小,可以看出,当交叉验证集误差远大于训练集误差时,往训练集增加更多数据可以提高模型的效果。
也就是说在高方差/过拟合的情况下,增加更多数据到训练集可能可以提高算法效果。
10.7决定接下来做什么
我们已经介绍了怎样评价一个学习算法,我们讨论了模型选择问题,偏差和方差的问题。
那么这些诊断法则怎样帮助我们判断,哪些方法可能有助于改进学习算法的效果,而哪些可能是徒劳的呢?
让我们回到预测房价的例子中,看看在什么情况下应该怎么选择:
- 获得更多的训练实例——解决高方差
- 尝试减少特征的数量——解决高方差
- 尝试获得更多的特征——解决高偏差
- 尝试增加多项式特征——解决高偏差
- 尝试减少正则化程度 λ——解决高偏差
- 尝试增加正则化程度 λ——解决高方差
如何为神经网络选择结构,或连接形式:
使用较小的神经网络,类似于参数较少的情况,容易导致高偏差和欠拟合,但计算代
价较小使用较大的神经网络,类似于参数较多的情况,容易导致高方差和过拟合,虽然计算
代价比较大,但是可以通过正则化手段来调整而更加适应数据。
通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。
对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地
作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训
练神经网络, 然后选择交叉验证集代价最小的神经网络。