一、引言
在对模型进行评估与选择之前,首先要知道用什么评估方法和性能度量来评估一个模型?其次选择模型时如何比较模型?
先来解答第一个问题。
二、预备知识
了解评估方法,就需要先学习误差、精度、过拟合、欠拟合这四个概念。
1、误差
一般,我们把学习器的实际预测输出与样本的真实输出之间的差异称之为**"误差(error)"**。
误差 = 实际预测输出 --- 样本真实输出
通常,我们把分类错误的样本数 占样本总数 的比例 称之为**"错误率(error rate)"。** 比如,有m 个样本,其中有a 个样本分类错误,那么错误率 E = a/m 。而精度(accuracy) 则是 A = 1 - a/m ,即**"精度 = 1 - 错误率"**。
1.1 经验误差
学习器(模型)在训练集上 产生的误差 称之为"训练误差 (training error)或经验误差(empirical error)"。
1.2 泛化误差
学习器(模型)在新样本上 产生的误差 称之为"泛化误差(generalization error)"。
【说明】:
我们想要的是一个泛化误差很小的学习器(模型) 。但是,大多数情况 下, 我们得到 的是一个经验误差很小 、在训练集上表现很好的学习器(模型) 。我们实际希望 的是,学习器在新样本上也能够表现的很好。那为了达到这个目的,应该从训练样本中尽可能学出适用于所有潜在样本的"普遍规律"。这样才能在遇到新样本时做出正确的判断。
2、欠拟合
2.1 欠拟合产生的原因
【原因】:学习器(模型)并没有把训练样本中一般特征学习到 ,导致学习器(模型)的学习能力低下,机器学习把这种情况称之为 "欠拟合"。
2.2 欠拟合的影响
学习器(模型)欠拟合时,是比较容易克服的,比如在决策树学习中扩展分支,在神经网络学习中增加训练轮数。
3、过拟合
3.1 过拟合产生的原因
【原因】:学习器(模型)把训练样本中学的"太好了",以至于把训练样本本身的一些特点(训练样本不太一般的特性)当作 了所有潜在样本都会具有的一般性质 。导致学习器(模型)的泛化能力降低,这种现象在机器学习中成为**"过拟合"**。
3.2 过拟合的影响
产生过拟合 的因素很多。上述所描述的原因是最常见的情况。 它是学习器(模型)在机器学习中面临的关键障碍 ,处理起来比较麻烦,而且我们是无法彻底避免过拟合,能做的只是缓解它产生的风险。
【说明】:
关于过拟合,大致可以这样理解:
机器学习面临的问题通常是NP(非确定性多项式时间)难****,而有效的学习算法必然是要在多项式时间内运行完成,如果彻底避免过拟合,那通过最小化经验误差就可以得到了最优解,也就构造性证明了 " P = NP "。但是实际上****,P != NP ,过拟合无法彻底避免。
( P问题:可以在多项式时间内找到正确答案的问题)
( NP问题:指一旦给出候选答案,能在多项式时间内验证其正确性的问题)
( NP问题,找答案很难,但是验证答案却是相对容易的)
4、总结
现实中,一个需要完成的任务,往往有很多学习算法可以选择,甚至同一个学习算法使用不同的参数配置,会产生不同的模型。我们:
(1)如何选择学习算法?
(2)使用哪一种参数配置?
这就是机器学习中 "模型选择" 问题。
理想的解决办法:就是对候选模型的泛化误差进行评估,选择泛化误差最小的那个模型。
【面临的问题】:
① 无法直接获得泛化误差;
② 训练误差由于过拟合现象的存在不适合作为标准;
所以现实中如何进行模型的评估和选择?
三、评估方法
1、测试集
1.1 测试集的来由
通常可以通过实验测试 来对学习器的泛化误差进行评估,从而做出选择。
既然做实验测试,那就需要用一个 "测试集(testing set)" 来测试学习器(模型)对新样
本的判别能力,并以测试集上的 "测试误差(testing error)" 作为 "泛化误差" 的近似。
1.2 测试样本的要求
通常测试样本是从样本真实分布中独立同分布采样得来 。同时满足测试集与训练集互
斥。也就是说,测试样本尽量不在训练集中出现、未在训练过程中使用。
1.3 要求测试集与训练集互斥的原因
【举例】 以这个场景理解:
老师出了10道练习题供学生练习,考试老师依然用这10道题作为考试题考试,那学
生最终的考试成绩能反映出学生学的好不好嘛?
当然不能!因为有些学生只能做这10道题也能得高分。
回到测试集与训练集互斥的原因上来。
我们最终希望得到泛化性能强的模型,这就类似于希望同学对课程学习的很好、获
得了对所学知识 " 举一反三" 的能力;训练样本就相当于给同学练习的习题,测试样本
就相当于考试的考题,显然,如果测试样本被拿去训练,最终得到的将是一个过于"乐观"
的结果。
2、训练集和测试集划分方法
2.1 引言
若我们有一个包含m个样例的数据集D={ (x1, y1), (x2, y2), (x3, y3), ..., (xm, ym) },那怎
么对数据集D进行处理,产生训练集S和测试集T分别用在训练与测试过程。下面详细介绍三
种常见的方法。
2.2 留出法 (hold-out)
该方法直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为
测试集T,即D = S T,S
T =
。在S上训练出模型后,在T上评估模型的测试误差,将
测试误差作为泛化误差进行近似。
【举例】:①以二分类任务为例。
假设D 包含1000个样本 ,将其划分为S包含700个样本 ,T包含300个样本。
在S 上训练之后,若模型在T 上有90个样本分类错误。
E (错误率) = (90/300) ×100% = 30%
A (精度) = 1 - 30% = 70%
【注意】:在训练集和测试集划分时要尽可能保持数据分布一致。避免因为数
据划分过程引入额外的偏差对最终结果产生影响。
【补充说明1】: 在分类任务中要尽量保证样本类别比例相似。
从采样角度看待数据集划分过程,则保留类别比例的采样方式通常称为 "
分层采样( stratified sample) "。
【例子】: 对 D 进行分层采样 得到含 70% 样本的训练集 S ,包含30% 样本的
测试集 T ,D 中包含500 个正例、 500个反例 ,分层采样得到的S
应包含 350 个正例 、350个反例 ,而 T 包含 150 个正例 、150个反例。
(若 S 与 T 样本类别比例差别很大,那么误差估计将由于训练集/测试集数据分
布的差异而产生偏差)
【补充说明2】: 给定训练集和测试集的样本比例之后,仍然存在多种划分方式 对数据集
D 进行分割。
【比如】:将 D 中的样本排序,然后将前350个正例放入训练集中,或者
将最后 350 个正例放入训练集中,......。
【影响】: 这些不同的划分将导致不同的训练集和测试集,那么模型评估
的结果也会有差别。因此,单次使用留出法得到的估计结果往
往不够稳定。
【解决办法】:采用若干次随机划分、重复进行实验评估,取所有评估结
果的平均值作为留出法的评估结果。
(如:进行100次随机划分,每次产生的训练/测试集用于实验评估,
100次后得到100个结果,留出法则是取这100个结果的平均)
【留出法的局限】:留出法是在划分训练集和测试集。这就导致一个窘境:
① 若令训练集 S 包含绝大多数样本,那么训练出的模型可能更接
近用D训练出的模型,但是测试集 T 比较少,评估结果可能不
够 稳定准确。
② 若令测试集 T 多包含一些样本,那么训练集 S 与 D 差别更大
了,被评估的模型与用 D 训练出的模型相比可能差别较大,也
就降低了评估结果的保真性。
【总结】:这个局限没有完美的解决方案,所以常见的做法就是将大约2/3~4/5
的样本用于训练,剩下的样本用于测试。
2.3 交叉验证法 (cross validation)
交叉验证法先将数据集 D 划分为k 个大小相似 的互斥子集,即:
D = D1 D2
D3
...
Dk , Di
Dj =
( i
j )
每个子集 Di都尽可能保持数据分布的一致性,即每个子集Di从 D 中通过分层采样得到。接下来,每次用k-1 个子集的并集作为训练集 ,剩下的那个子集作为测试集 ;这样便可以得到k 组训练集和测试集,从而进行 k 次训练和测试,最终返回的是这 k 个测试结果的均值。
【注意】:交叉验证法评估结果的稳定性和保真性在很大程度上取决于 k 的取值!
也正是这个原因,通常把交叉验证法称之为 "k折交叉验证 (k-flod cross validation)"。其常用的 k 值为 5、20等。
为了方便大家理解,可以看这个示意图。

**【补充说明1】:**与留出法相似,将数据集 D 划分为 k 个子集同样存在多种划分方式。为了减
少因为样本划分不同而引入的差异。k 折交叉验证通常要随机使用不同的划
分重复 p 次,最终的评估结果是这 p 次 k 折交叉验证结果的均值。
【举例】:假设数据集 D 中包含m个样本,令 k = m,则得到一个交叉验证的特例:
留一法 (Leave-One-Out, 简称LOO)。留一法不受随机样本划分的影响。
【留一法优势】:因为 m 个样本只有唯一的方式划分为 m 个子集(每个子集包含一
个样本);留一法使用训练集与初始数据集相比只少了一个样本,
这就使得在绝大多数情况下,留一法中被实际评估的模型 与 期望
评估所用的 D 训练出的模型很相似。
(因此,留一法的评估结果往往被认为比较准确)
【留一法的缺陷】:在数据集比较大时,训练 m 个模型的计算开销非常大,而且这还
是在没有考虑算法调参的情况下。
(留一法的估计结果业未必永远比其他评估方法准确!)
2.4 自助法
自助法是一个直接以自助采样法为基础 ,给定包含 m 个样本的数据集 D ,对它进行采样产生数据集 D',然后再将该样本放回初始数据集 D 中 ,使得该样本在下次采样的时候仍然有可能被采样到;这个过程重复执行 m 次之后,我们就得到了包含 m 个样本的数据集 D',这就是自助采样的结果。
【注意】:
① 自助法,D中有一部分样本会在D'中多次出现,而另一部分样本不出现。可以做一个简
单的估计,样本在 m 次采样中始终不被采到的概率是1/e 0.368。也就是通过自助采
样,初始数据集 D 中大约有 36.8% 的样本未出现在现在采样数据集 D' 中。
(可以将 D' 用做训练集,D\D' 做为测试集。这样实际评估的模型与期望评估的模型都
使用了 m 个训练样本,而且仍然有数据总量大约1/3没在训练集中出现,刚好将这些样
本用于测试。这样得到的测试结果,也成为 " 外包估计 (out-if-bag estimate) ")
② 自助法在数据集较小、难以有效划分训练集和测试集的时候很有用!
③ 自助法能从初始的数据集产生很多不同的训练集,这对集成学习等方法有很大的好处。
【缺点】:
自助法产生的数据集改变初始数据集的分布 ,会因此引入估计偏差 。因此,初始数据集足
够的时候,留出法和交叉验证法更常用。
希望能给读者带来一些帮助。
(博客文字较多,知识点较为密集,可以多停留一下,耐心看完)