经验误差与过拟合
通常我们把分类错误的样本数占样本总数的比例称为“错误率”,“精度”为1-错误率
更一般地,我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”,学习器在训练集上的误差成为“训练误差”或“经验误差”,在新样本上的误差称为“泛化误差”。
显然,我们希望得到泛化误差小的学习器。
为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的“普遍规律”,这样才能在遇到新样本时做出正确的判别。然而,当学习器把训练样本学得“太好”了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降。这种现象在机器学习中称为“过拟合”(学习能力过于强大,以至于把训练样本所包含的不太一般的特性都学到了),与“过拟合”相对的是“欠拟合”,这是指对训练样本的一般性质尚未学好,是由于学习能力低下造成的。欠拟合比较容易克服,如在决策树学习中扩展分支、在神经网络学习中增加训练轮次数等;过拟合则很麻烦,是机器学习面临的关键障碍,无法彻底避免。
现实任务中,我们往往有多重学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型,那么我们该选择哪一个学习算法、使用哪一种参数配置呢?这就是机器学习中的“模型选择”问题,理想的解决方案当然是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个模型。但是,我们无法直接获得泛化误差,而训练误差又由于过拟合现象的存在而不适合作为标准,那么,在现实中如何进行模型评估与选择呢?
通常,我们可通过实验测试来对学习器的泛化误差进行评估并进而做出选择。为此,需使用一个“测试集”来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”作为泛化误差的近似。通常,我们假设测试样本也是从样本真实分布中独立同分布采样而得。但需注意的是,测试集应该尽可能与训练集互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过。
留出法
“留出法”(hold-out)直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。
需要注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似。如果从采样(sampling)的角度看待数据集的划分过程,则保留类别比例的采样方式通常称为“分层采样”(stratified sampling)。
另一个需要注意的问题是,即便在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集D进行分割。不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差异。因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
留出法会导致一个窘境:若令训练集S包含绝大多数样本,则训练处的模型可能更接近于用D训练处的模型,但由于T比较小,评估结果可能不够稳定准确;若令测试集T多包含一些样本,则训练集S与D差别更大了,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity)。这个问题没有完美的解决方案,常见做法是将2/3~4/5的样本用于训练,剩余样本用于测试。
交叉验证法
“交叉验证法”(cross validation)先将数据集D划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性,每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值。显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值。为强调这点,通常把交叉验证法称为“k折交叉验证”,k最常用的取值是10.
留一法(leave-one-out,简称LOO)是交叉验证法的特例,不受随机样本划分方式的影响,使用的训练集与初始数据集相比只少一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。因此,留一法的评估结果往往被认为比较准确,然而,其缺陷在于当数据集比较大时,训练m个模型的计算开销可能是难以忍受的,而这还是在未考虑算法调参的情况下。另外。留一法的估计结果也未必永远比其他评估方法准确(没有免费的午餐)
自助法
“自助法”(bootstrapping)可以减少训练样本规模不同造成的影响,同时还能比较高效地进行实验估计,它直接以自助采样法(bootstrap sampling)为基础,给定包含m个样本数据集D,我们对它进行采样产生数据集D’:每次随机从D中挑选一个样本,将其拷贝放入D’,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行m次后,我们就得到包含m个样本的数据集D',这就是自助采样的结果。显然,D中有一部分样本会在D'中多次出现,而另一部分样本不出现,可以做一个简单的估计,样本m次采样中始终不被采到的概率取极限可知:通过自助采样,初始数据集D中约有36.8%的样本未出现在采样数据集D’中,于是我们可以将D’用作训练集,D\D’用作测试集。这样,实际评估的模型与期望评估的模型都使用m个训练样本,而我们仍有数据总量约1/3的、没在训练集中出现的样本用于测试,这样的测试结果,亦称“包外估计”(out-of-bag estimate)
自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大好处。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够时,留出法和交叉验证法更常用一些。
调参
在进行模型评估与选择时,除了要对使用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的“参数调节”或简称“调参”
机器学习常涉及两类参数:一类是算法的参数,亦称“超参数”,数目常在10以内;另一类是模型的参数,数目可能有很多,例如大型“深度学习”模型甚至有上百亿个参数。两者调参方式相似,均是产生多个模型之后基于某种评估方法来进行选择;不同之处在于前者通常是由人工设定多个参数侯选值后产生模型,后者则是通过学习来产生多个候选模型(如神经网络在不同轮数停止训练)
调参和算法选择没什么本质区别:对每种参数配置都训练出模型,然后把对应最好模型的参数作为结果。有一点需要注意:学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的。现实中常用的做法,是对每个参数选定一个范围和变化步长,例如在[0,0.2]范围以0.05位步长,则实际要评估的候选参数值有5个,最终是从这5个候选值中产生选定值。显然,这样选定的参数值往往不是“最佳”值,但这是在计算开销和性能估计之间进行折中的结果,通过这个折中,学习过程才变得可行。即便如此,调参往往仍很困难,在不少应用任务中,参数调得好不好往往对最终模型性能有关键影响。
需要注意的是,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为加以区分,模型评估与选择中用于评估测试的数据集常称为“验证集”(validation set)。例如,在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。