干货|模型评估方法基础总结


(Edisonfang) #1

模型评估是机器学习理论和实践中重要的一部分,下面我们来简单地总结几个用于评估模型的方法:

一、留出法

留出法 (hold-out)直接将数据集D划分为两个互斥的集合,其中一个作训练集S,另一个作测试集T,在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。

需要注意的是,训练/测试集的划分要尽可能的保持数据分布的一致性,以免因数据划分过程引入额外的偏差而对最终结果产生影响。像是在分类任务中,就要注意保证样本的类别比例相似。若是从 采样 (sampling)的角度来看待数据的划分过程,则保留类别比例的采样方式通常称为 分层采样 (stratified samplinbg)。

举个例子,若对D进行分层采样,获得70%样本的训练集S和30%的测试集T,若D包含500个正例、500个反例,则分层采样得到的S应包含150个正例、150个反例。

如果S、T中样本类别差别比例很大,则误差估计也将由于训练/测试数据分布的差异而产生偏差。

另一个需要注意的问题是,即使是确定了训练/测试集的样本比例,仍然有多种对数据集D进行分割的划分方式。像上例,可以将D中的样本排序,然后把前350个正例放到训练集中,也可以将最后350个正例放到训练集中……这些不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。正因此,单次使用留出法的评估结果并不稳定可靠。一般来说,在使用留出法时,要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。例如进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后得到100个结果,然后返回这100个结果的平均(同时还可以得到估计结果的标准差)。

但由于留出法对数据集划分的操作,这导致:如果训练集S包含大多数样本,那么由于测试集T包含的样本不多,训练出的模型可能不够稳定准确;若令测试集T多包含一些样本,又会使得训练集S和数据集D的差别加大,被评估的模型与用D训练出的模型相比可能有较大差别,从而降低了评估结果的 保真性 (fidelity)(可以从偏差-方差角度来看,测试集小则评估结果方差较大;训练集小,则评估结果偏差较大)。这个问题并没有太好的解决方案,因此常见做法是将大约23~45的样本用于训练,剩余用于测试(一般而言,测试集最少应包含30个样例)。

二、交叉验证

如果给定的数据集充足,我们选择模型时常常随机地将数据集切分成两部分,训练集(training set)、验证集(validation set)。训练集用来训练模型,验证集用于模型的选择,就像我们上面所介绍的留出法一样。

但是,在实际应用中我们往往会遇到数据不够充足的情况,这种时候,就可以用到交叉验证了。交叉验证的基本思想是先将给定的数据集进行切分,将切分的数据组合为训练集与测试集,然后对模型进行训练并测试,在此基础上反复进行训练、测试以及模型选择。

这里介绍一下交叉验证的三个方法:

1. 简单交叉验证

简单交叉验证 的方法是:首先随机地将已给的数据集分为两部分,一部分作为训练集,一部分作为测试集;然后,用训练集在各种条件下(如不同的参数个数)训练模型,从而得到不同的模型;然后再在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

2. S折交叉验证

应用最多的交叉验证方法是 S折交叉验证 (S-fold cross validation),方法如下:首先随机地将已给的数据集切分为S个互不相交大小相同的子集;然后,利用S-1个子集的数据来训练模型,而余下的子集就用于测试模型;将这一过程对可能的S种选择重复进行;最后,选出S次评测中平均测试误差最小的模型。

3. 留一交叉验证

我们将S折交叉验证中的S = N,就是 留一交叉验证 (leave-one-out cross validation)。这里,N是给定数据集的容量。这种方法常常在数据相当缺乏的情况下使用。

三、自助法

自助法和留出法与交叉验证法不同,后两者评估的模型所使用的训练集总是会比数据集D小,这就使得一些因训练样本规模不同而导致的估计偏差被引入。k折交叉验证法中的特例留一法尽管受到的训练集的规模变化影响较小,但又因为其计算复杂度过高,使得开销过大。

由此, 自助法 (bootstrapping)便是被提出的一个比较好的解决方案,它是以 自助采样法 (bootstrap sampling)为基础的方法,自助采样又称“可重复采样”,“有放回采样”。

假设有m个样本的数据集D,我们对它进行采样产生数据集D’:每次随机从D中挑选一个样本拷贝入D’,然后将样本放回。重复m次后,我们就得到一个规模与D相同,即包含m个样本的数据集D’了。

D中有一部分样本会在D’中重复出现,一部分样本不出现,不出现的样本约占D的36.8%,我们可以简单的计算一下,这个结果是如何得到的:

假设样本在m次采样中始终不被采到的概率为(1−1m)m,取极限得到:

image

(这个证明很简单,高等数学中的常用极限)

这样子,我们就可以将D’用作训练集,DD’用作测试集,使得司机评估的模型和期望评估的模型都使用了m个训练样本,而我们仍有约1/3的样本没有在训练集中出现并可用于测试。这样的测试结果,称为 包外估计 (out-of-bag estimate)

自助法特别适用于数据集小、难以有效划分训练/测试集的状况;此外,由于其能从初始训练集中产生多个不同的训练集,这对集成学习等方法也有很大的好处。但有利必有弊,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差,因此,若初始数据量足够,还是留出法和交叉验证法比较常用。

不过,即使是交叉验证的留一法,也未必永远比其它估计方法准确,根据情况采取评估方法——“没有免费的午餐定理”对于实验评估方法也同样适用。

四、调参与最终模型

我们在算法学习中,还经常会遇到有 参数 (parameter)需要设定(像是梯度上升的步长),参数配置的不同,往往也会影响到模型的性能。这中对算法参数的设定,就是我们通常所说的“参数调节”,简称 调参 (parameter tuning)。

而机器学习涉及的参数有两种:

  1. 第一种是我们需要人为设置的参数,这种参数称为 超参数 ,数目通常在10个以内
  2. 另一类是模型参数,数目可能很多,在大型深度学习模型中甚至会有上百亿个参数。

两者调参的方式相似,一般都是在产生多个模型之后基于某种评估方法来进行选择;不同点在于,超参数通常是有人工设定多个参数候选值后产生模型,而后者这是通过学习来产生多个模型。

调参和算法选择本质上其实没有什么区别:对每种参数配置都训练出模型,然后把对应最好模型的参数作为结果。

但需要注意的是,这些参数往往都是在实数范围内取值,换句话说,是连续的。因此,我们常用的做法是对每个参数设定一个范围和变化步长,例如[0,0.2]范围内以0.05为步长,这样子这个参数的候选值在实际评估中就仅有5个,最终结果将从这5个候选值中选定。我们知道,这种做法选出来的参数往往并不是最佳的,但这是在计算开销和性能估计之间进行折中的唯一方法,而且事实上,哪怕是用这种方法,调参也相当不容易。我们可以假设一下,如果一个算法有3个参数,每个参数5个候选值,那么排列组合一下,对于一组训练/测试集就有53=125个模型需要考察;在很多强大的学习算法中,有不少参数需要设定,这也就导致了极大的调参工程量,以至于在不少应用任务中,参数调的好与不好对最终模型的性能会有关键性的影响。

另外,若给定m个样本的数据集,我们在模型评估与选择中因为需要留出一部分数据进行评估测试,往往只会用到数据集的一部分来训练模型。因此,在确定好学习算法和参数配置后,我们还要用原有的数据集D重新训练一个模型,这个模型才是我们需要最终提交给用户的模型。

还有一点,就是我们实际上只会把模型在实际使用中遇到的数据称为测试集,而在模型评估与选择中,用于评估测试的数据集我们称为 验证集 (validation set)。


选自《AI遇见机器学习》