我们知道,模型是由算法基于训练集学习得到的,然而,机器学习算法有很多,不同的算法会学到不同的模型,即使是同一种算法,根据设置的参数不同也会学到不同的模型。本文要讲的内容就是如何对这些模型评估,以选择一个性能最好的。
训练误差和泛化误差
以分类问题为例,通常,我们把模型分错类的样本数占训练集总样本数的比例称为错误率(error rate),比如训练集大小为N,分错类的样本数为m,则错误率为
更一般地,我们将模型的预测值与样本的真实值之间的差异称为误差(error),训练集上的误差称为训练误差(training error),新样本上的误差称为泛化误差(generalization error)或测试误差(test error)。
训练误差和泛化误差分别反映了模型在训练集和新样本上的预测能力,理想模型的是既有较低的训练误差,同时也有较低的泛化误差。但是,我们现在手里只有训练集,并不知道新样本长什么样子,所以实际能做的就是让训练误差最小化。
那么,是不是说训练误差越小,甚至训练误差为0的模型,就是最好的模型呢?答案是否定的。
过拟合与欠拟合
每种事物都有自身的普遍性质和特殊性质。
拿猫来打个比方,一条尾巴,四条腿,发出“喵喵”叫,这属于猫的普遍性,但每只猫的毛色是不尽一样,有的是纯色,有的是渐层,有的是三花等等,这属于猫的特殊性。
我们希望能从训练集中学到出所有样本(包括未知的样本)的普遍性质,这样才能对未知样本做出好的预测。然而,如果一个模型学习能力太强的话,可能会把训练样本中的一些特殊性质当成所有样本的普遍性质,这样会造成模型对训练集预测得很好,但对未知样本预测得很差的现象,这种现象称为过拟合(over-fitting)。与此相对的是,模型的学习能力太弱,对训练样本的普遍性质都学不到,就会造成欠拟合(under-fitting)。
我们通过上图来直观的理解过拟合和欠拟合。假设,我们通过左边两只毛色为纯色的猫作为训练样本得到了一个模型,用这个模型来预测新样本是否是猫。当这个模型过拟合时,可能会认为猫的毛色必须纯色的,所以当有一只毛色不纯的猫作为新样本时,模型会错误地预测它不是猫。当这个模型欠拟合时,可能会认为凡有四条腿的动物就是猫,所以模型会错误地把狗也预测成猫。
可以看到,当模型很简单时,即复杂度小时,训练误差和测试误差都很高,这时对应的是欠拟合,随着复杂度的增加,训练误差会越来越小并趋向于0,而测试误差会先减小达到一个最小值,然后又继续增大,这时对应的是过拟合。我们的最终目标是要选择一个复杂度适当的模型,避免发送过拟合,使得其测试误差最小。那么该如何选择模型并评估其的好坏呢?
模型选择
我们根据模型的泛化能力来评估模型的好坏,但由于没有新样本,无法知道模型的泛化能力,为此,可以从训练集中划分一部分出来作为测试集,然后以模型在测试集上的测试误差作为泛化误差的近似。下面是几种常用的划分方法。
-
留出法(hold-out)
留出法将数据集D划分为训练集S和测试集T,并且S与T互斥,即
需要注意的是,训练集和测试集的划分要尽可能保持数据分布的一致性。例如,将数据集中70%的样本划分为训练集,剩下的30%划分为测试集,若原数据集中正样本与负样本的比例为1:1,那么在训练集和测试集中的正负样本也应该保持这样的比例。因为若训练集和测试集中样本类别的比例差别很大,则会引入额外的偏差从而对最终结果产生影响
另外,单次使用留出法得到的估计结果往往不够可靠,一般需要采用多次随机划分,针对每一次不同的划分都进行训练和预测,然后取平均值作为最后的评估结果。 -
交叉验证法(cross validation)
交叉验证法又叫做k折交叉验证(k-fold corss validatoin),它将数据集D划分为k个大小相同的互斥子集,即引用自周志华教授的西瓜书 自助法(bootstrapping)
我们希望评估的是用整个数据集D训练出的模型,但留出法和交叉验证法都会保留一部分样本用来测试,使得实际用来训练的样本数量比D要小,这必然会对结果造成一些偏差。如何减小这种偏差呢?自助法就是一个比较好的解决方案。
自助法的思想是对原数据集D进行有放回采样,即每次随机从D中采集一个样本,然后再将其放回,重复N(N为数据集样本总数)次后将得到一个与原数据集大小一样的新数据集D'。显然,D中有部分样本会在D'中重复出现,而有部分一次也不出现,我们可以用D'作为训练集,D-D'作为测试集。由于此时训练集与原数据集大小一样,所以可以减小规模不同带来的偏差。
一般来说,在数据量较小时用自助法,而数据充足时用留出法或交叉验证法。
正则化(regularization)
模型选择除了上面提到的几种方法,还有一种方法是正则化。
假设在一个回归问题中,给定数据集:
另外
需要注意的是,我们通常把模型在实际中遇到的新样本称为测试数据,为了加以区分,一般把模型选择时使用的测试集称为验证集(validation set)。这样,机器学习中使用的数据主要分为以下三种:
- 训练集:用于训练模型
- 验证集:用于模型选择
- 测试集:评估最终模型在实际使用中的泛化能力
参考
- [1]《机器学习》周志华
- [2]《统计学习方法》李航