当我们的机器学习算法表现不佳,也就是说处于欠拟合或过拟合时,通常我们有以下三种武器来提升算法表现
1、增加/减少复杂度
2、扩大/缩小Regularization Paremeter的值
3、更多的训练样例
如何评估我们的算法,以及正确使用这三种工具,向哪个方向调节参数,是本文的重点内容。
分割训练样例:
由于要评估算法准确度,所以我们需要将一部分训练集拿出来作为交叉验证集(Cross Validation Set)。一般情况下,我们可以设置70%训练集+30%CV集;如果需要,也可以设置60%训练集+20%CV集+20%测试集。
选择算法的复杂度(阶数):
由于我们在初始状态下,无法知晓最佳算法的复杂度,所以,我们从最简单最快速的算法开始。比如,我们就做一元线性回归(设为d=1),然后不断的提高复杂度(d=2,3,4,...n),针对每一个算法,我们计算两个cost function:训练集的cost function和CV集的cost function。理由是,阶数越高,我们对于训练集的拟合程度越好,同时就会越来越偏向于过拟合,导致的结果是对CV集的预测偏差。所以我们需要寻找一个d,能够在训练集使CV集达到最佳配合。如下图所示的曲线,在d=2时,达到最佳组合。
在这个例子中,当d=1时,为什么J_train和J_cv都居高不下呢?如果我们单独绘出d=1时的cost function曲线,就可以看出,在如下图中,算法经过学习,其训练集的cost function大约在25左右,cv集的cost function在30左右。差错偏大,属于欠拟合(underfit)。分析原因,其实是因为使用直线来拟合散乱的训练样例,确是很难达到完美拟合。
而当我把算法提升到二次函数的话,在训练后的差错就会明显变小为cost_train=2.1,cost_cv=6.5,其数据拟合程度也确是更加出色,如下图:
接下来,如果我们将d提升为3、4,J_train会微微下降,都是J_cv又会明显上升。
选择正规化参数lambda:
Regularization Paremeter的选择同样可以从曲线中直观看出,如下图。我们知道,如果lambda过小,对于cost function的作用就会微乎其微,如果算法存在过拟合,那么我们就无法纠正,如果lambda过大,cost function本身的变化就会被“惩罚”,使得cost function变得像一条直线,对训练集和cv集的拟合程度都会差,这是一种欠拟合。
是否总是需要更多的训练样例:
我们谈到机器学习,很多时候希望能够用海量的数据用来做训练,但当我们的算法表现不佳时,是否真的获得更多训练样例就可以有所改进呢?其实不是。在第一部分讲述关于阶数选择的问题时,曾经说过,使用直线很难来拟合复杂数据,其含义就是,如果算法严重欠拟合,更多的数据也于是无补,形象地说,这只会让算法更加左右为难。请将自己想象为下图中的那根直线,再增加100个训练样例,又能如何?
而如果算法是过拟合,则可以用更多的训练样例去降低差错,提升表现。因为过拟合的本质就是过于考虑训练样例的细节,其曲线过于弯弯绕。但如果训练样例足够多,其曲线有可能会覆盖到cv集的区域,则可以将J_cv的值优化。