训练时数据划分及参数选择
应用机器学习的建议
决定下一步做什么
当要设计机器学习系统时,如何选择一条最适合最高效的道路?
假设你已经实现了正则化的线性回归来预测房屋价格,然而,当在一组新的测试集上使用该假设时,在预测上出现了不能接受的错误,接下来会做什么呢?也就是说当调试学习算法时,当面对测试集算法效果不佳时,会怎么做呢?
(1)采集更多的训练样本;(有时候并没有效果)
(2)尝试选用更少的特征;
(3)尝试获取更多的特征;
(4)尝试增加特征多项式;
(5)尝试减小或增大正则化参数的值。
由此引出机器学习诊断法:这是一种测试法,通过执行这种测试能够了解算法在哪里出了问题,也能告诉你要想改进一种算法的效果,什么样的尝试才是有意义的,这些诊断法的执行与实现需要花很多时间来理解和实现。
评估假设
在这一节中将介绍怎么评价算法学习得到的假设。
为了确保可以评价假设函数,需要将训练集分成两部分,第一部分成为训练集,第二部分成为测试集。
典型按照7:3比例,如下:
1)训练和测试线性回归的步骤:
1. 对训练集进行学习得到参数θ(具体来说就是最小化训练误差)。
2. 计算出测试误差:
这是线性回归时测试误差的定义。
2)训练和测试线性回归的步骤:
1. 从训练数据中学习得到参数θ。
2. 计算出测试误差:
3. 错误分类(0/1分类错误)
模型选择、训练、验证、测试集
对于过拟合问题,在过拟合中的学习算法即便对训练集拟合的很好,也并不代表它是一个很好的假设。通常来说,这就是为什么训练集误差不能用来判断该假设对新样本的拟合好坏;具体来讲,如果用这些参数来拟合训练集,就算假设在训练集上表现地很好,也并不意味着该假设对训练集中没有的新样本有多好的泛化能力。更为普遍的规律,如果参数对某个数据集拟合的很好(比如训练集或者其他数据集),那么用同一数据集计算得到的误差(比如训练误差)并不能很好地估计出实际的泛化误差,即该假设对新样本的泛化能力。
(1)模型选择问题
在多项式回归时,该如何选择次数作为假设模型呢?
如何从这些模型中选出最好的一个,应该看哪个模型有最小的测试误差。
假设对这个例子,选择五次多项式模型,看一看这个模型的泛化能力怎么样,可以观察这个五项式对测试集的拟合情况,但问题是这样仍然不能公平地评估出这个假设的泛化能力。原因:拟合了一个额外的参数d,也就是多项式的次数,用测试集拟合了参数d,选择了一个能最好地拟合测试集的参数d的值,因此,参数向量θ5在测试集上的性能很可能是对泛化误差过于乐观的估计。
所以为了解决模型选择出现的问题,通常会采用下面的方法来评估假设:
给定一个数据集,把它分成三个部分:训练集、交叉验证集、测试集,它们的比例为3:1:1,用交叉验证集来作为评判选择的标准,选择合适的模型,而测试集则是作为算法性能的评判。
定义训练误差:
定义交叉验证误差:
定义测试误差:
所以对于上述的模型选择,要用交叉验证集来进行选择而不是原来的测试集:
在如今的机器学习应用中,的确有很多人用测试集来选择模型,通过测试集来选择多项式的次数,然后仍在测试集上计算误差,把它当作理想的泛化误差,这并不是一个好的方法。将数据集分成训练集、验证集、测试集是更好的选择。
诊断偏差与方差
当运行一个学习算法时,如果这个算法表现不理想,往往是出现两种情况:
(1)偏差比较大(欠拟合问题)
(2)方差比较大(过拟合问题)
这一节中将更深入探讨偏差和方差问题,弄清楚它们对改进学习算法的效果是非常重要的。
上图中分别表示了高偏差、刚好、高方差的情况。
根据训练误差和验证误差函数:
从图中可以看出,随着多项式次数的增大,训练集上的偏差逐渐变小,而交叉验证集上的偏差在减小到一定程度后开始升高。
诊断偏差和方差:
假设得出一个学习算法,而这个算法并没有表现地像你期望的那么好,如果交叉验证误差或者测试集误差都很大,如何判断此时学习算法出现了高偏差问题还是高方差问题?
如果有高偏差(欠拟合问题),发现交叉验证误差和训练误差都会很大,所以如果算法有偏差问题,它的训练误差将会比较大,交叉验证误差也会比较大且接近训练误差;如果有高方差(过拟合问题),发现训练误差会很小,代表训练集合拟合得非常好,而交叉验证误差会远远大于训练误差。
正则化和偏差、方差
正则化可以有效地防止过拟合,但正则化跟算法的偏差和方差有什么关系呢?
这一节中将深入探讨偏差和方差与算法正则化之间的关系,以及正则化是如何影响偏差和方差。
在加入正则化项后根据的λ不同所得图如下:
同样可以通过在交叉验证集上的测试选择较好的值λ。
如何自动地选择出一个最适合的正则化参数的λ值呢?
模型:
通常的做法,选取一系列想要尝试的λ值,首先可能考虑不使用正则化以及一系列可能会试的值,如下:
得到这12组模型之后,接下来要做的是选用第一个模型,然后最小化代价函数,得到某个参数向量
。
继续上述步骤,会得到参数:。然后用交叉验证集来评价它们,即测出每一个参数在交叉验证集上的平均误差平方和,
然后选择12模型中平均误差平方最小的那个模型作为最终选择。
所以这就是模型选择在选取正则化参数时λ的应用。
接下来探讨当正则化参数变化时,交叉验证误差和训练误差怎么变化,如图:
这里的图显得有些简单和理想化,对于真实的数据,得到的曲线可能比这更复杂,但是通过这样的图可以更好地理解各种情况,也有助于确认选择的正则化参数值λ是否合适。
学习曲线
学习曲线是一种很好的工具来判断某一个学习算法是否处于偏差、方差问题,或者二者都有。
根据样本的大小与误差的关系我们可以画出一般的学习曲线模样:
从图中可以看出随着m的增大,平均训练误差越来越大,相反地,交叉验证误差越来越小。
假设学习算法出现高偏差的问题:
交叉验证误差减小将会很快变为水平而不再变化,只要达到一定数量的训练样本,这样能得到最拟合数据的直线;训练误差会逐渐增大,最后接近交叉验证误差,这就是学习算法处于高偏差情形时的学习曲线的大致走向。
结论:如果一个学习算法有高偏差,随着增加训练样本,发现交叉验证误差不会明显下降了,基本变成水平,所以如果学习算法正处于高偏差的情形,选用更多的训练集数据对于改善算法表现并不能起到一定作用。
假设学习算法出现高方差的问题:
结论:如果考虑增大训练集的样本数,交叉验证误差将会一直下降,所以在高方差的情形中,使用更多的训练集数据对改进算法是有帮助的。
决定接下来做什么
哪些方法有助于改进学习算法的效果,可以看一下之前提到过的问题,看看它们适合什么的模型:
本章回顾:
当在进行神经网络拟合的时候,可以选择任何一种。
(1)一个相对比较简单的神经网络模型(只有一个隐藏层且隐藏单元数较少),这样的模型参数就不会很多,容易出现欠拟合,这种小型的神经网络最大的优势在于计算量较小;
(2)一个拟合较大型的神经网络模型(有多个隐藏层且隐藏单元数较多),这样的模型参数一般很多,更容易出现过拟合,这种结构的一大劣势在于当有大量神经元时这种结构会有很大的计算量,最主要的潜在问题还是它容易出现过拟合现象。