西瓜书《机器学习》学习笔记 二 模型评估与选择(一)

第二章 模型评估与选择

目录

第二章 模型评估与选择

1、经验误差与过拟合

2、评估方法

留出法(hold-out)

交叉验证法(cross validation)(k折交叉验证 k-fold cross validation)

留一法(Leave-One-Out,简称LOO)

自助法(bootstrapping)

调参与最终模型


1、经验误差与过拟合

通常我们把分类错误的样本数占样本总数的比例称为“错误率”(error rate);我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”(error).

学习器在训练集上的误差称为“经验误差”或“训练误差”;在新样本上的误差称为“泛化误差”(generalization error)。

实际应用中,我们希望获取在新样本上表现的很好的学习器,但是我们并不知道新样本是什么样,所以我们实际能做的是努力学习训练集使经验误差最小化。但是经验误差并不是越小越好,训练样本是有限的,我们通常都可以学习得到一个在训练样本中表现很好,甚至经验误差为0的学习器,但这样的学习器往往在新样本中表现不好。因为这样的学习器往往也学习到了训练样本自身一些独特的特征,而不再只是所有潜在样本的“普遍规律”。这种想象在机器学习中被称为“过拟合”(overfitting)。与“过拟合”相对的是“欠拟合”(underfitting)这是指对训练样本的一般性质尚未学好。

“过拟合”——学习能力过强,学习到了训练样本中不太一般的性质;

“欠拟合”——学习能力低下;

西瓜书《机器学习》学习笔记 二 模型评估与选择(一)_第1张图片

欠拟合一般比较容易克服,例如增加神经网络的训练轮数,在决策树学习中扩展分支等;而过拟合则很麻烦,过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施。

注意:过拟合是无法避免的,我们做的只能是“缓解”,或者说减小风险。

2、评估方法

在现实任务场景下,我们往往有多种学习算法可供选择,甚至同一个学习算法,因为参数设置的不同,模型效果也大相径庭,那么我们该选用哪一个学习算法?哪一种参数配置呢?这就是机器学习中的“模型选择”(model selection)问题。理想的解决方案当然是对候选模型的泛化误差进行评估,然后选择泛化误差最小的那个模型,但是现实情况下我们无法直接获取泛化误差,而训练误差又因为过拟合现象的存在而不适合作为评估标准,我们应该如何进行模型评估和选择呢?

通常情况下,我们可以通过实验测试来对学习器的泛化误差进行评估并进而做出选择,因此需要一个“测试集”(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”(testing error)作为泛化误差的近似。

测试集也应该从样本真实分布中独立同分布采样而得,测试集应该与训练集互斥,即不重叠。

显示情况下,我们通常会获得一个m个样本的数据集D ,既要训练,又要测试,我们可以通过对D进行适当的处理,从中产生训练集S和测试集T,下面介绍几种常用的方法。

  • 留出法(hold-out)

直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T。

注意点:

训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响。

因为测试/训练集的生成具有随机性,所以一般单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,一般要采用若干次随机划分、重复进行试验评估后取平均值作为流出法的评估结果。例如进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后得到100个结果,而留出法返回测试这100个结果的平均。

不足:

我们首先应该明白,我们训练集样本数越多,我们得到的模型越准确。

在已知具有m个样本的样本集D的情况下,我们希望评估的是用D训练出的模型的性能,但留出法需要划分训练/测试集。会导致一种窘境:若训练集S包含绝大部分样本,则训练出的模型更接近与用D训练的模型,但由于测试集T比较小,评估结果可能不够稳定准确;若T多包含一些样本,则S比较小,被评估的模型可能和用D训练出的模型相差较大,从而降低了评估结果的保真性。

常见做法是将大约 2/3~4/5 的样本用于训练,剩余样本用于测试。一般情况下,测试集至少包含30个样例。

  • 交叉验证法(cross validation)(k折交叉验证 k-fold cross validation)

“交叉验证法”先将数据集D划分为k个大小相似的互斥子集,每个子集Di都尽可能的保持数据分布的一致性(从D中分层采样得到)。然后每次用k-1个子集的并集作为训练集,余下的那个子集作为测试集;这样就可以获得k组训练/测试集,从而进行k次训练测试,返回这k个测试结果的均值。

注意点:

交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为强调这一点,通常把交叉验证法称为“k折交叉验证”(k-fold cross validation)。k最常用的取值为10,此时称为10折交叉验证,还可以取5,20等值。

与留出法相似,将数据集D划分为k个子集同样存在多种划分方式,为了减小因为划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值。如常见的有“10次10折交叉验证”,与100次留出法都是进行了100次训练/测试。

  • 留一法(Leave-One-Out,简称LOO)

交叉验证法的特例,假设数据集D中有m个样本,令k=m,即每个子集都只是一个样本。

注意点:

留一法不收随机样本划分方式的影响;

留一法使用的训练集和数据集D只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练的模型很相似,因此留一法的评估结果往往被认为比较准确。

不足:

在数据集较大时,训练m个模型的计算开销可能是难以忍受的,(想想100万个模型,1亿个模型,是不是很绝望。。。。),而且这还是在没有调参的情况,一旦调参,,,,可想而知。。。。

留一法的评估结果也未必永远比其他评估方法准备,“没有免费的午餐”定理对实验评估方法同样适用。“没有免费的午餐”(NFT)定理可以参考上一篇-绪论

  • 自助法(bootstrapping)

首先还是之前说过的,我们希望评估的是用D训练出来的模型,但在前三个方法中,都分别划分了训练/测试集,因此实际评估的模型所使用的训练集都比D小,这就必然会引入一些因为训练样本规模不同而导致的估计偏差,留一法受影响较小,但是计算复杂度太高,很难实际应用。“自助法”是一个比较好的解决方案。

“自助法”:给定包含m个样本的数据集D,我们对他进行采样产生数据集D' :每次随机从D中挑选一个样本,将其拷贝放入D',然后放回D,是这个样本在下次采样时仍有可能被采到;这个过程重复执行m次后,就生成了一个包含m个样本的数据集D'。这就是自助采样的结果。很显然,D中有部分的样本可能没有被采集到,还有一部分的样本被多次采集到,可以做一个简单统计,样本在m此采样中始终不被采到的概率是(1 - 1/m)^m,取极限得到

                                                          \lim_{m\rightarrow \infty }(1-1/m)^m \rightarrow 1/e \approx 0.368

即通过自助采样,初始数据集D中约有36.8%的样本未出现在采样数据集D'中,于是我们可将D'用作训练集,D中剩下的样本用于测试集;这样实际评估的模型与期望评估的模型都是用m个训练样本,而我们仍有数据总量约1/3的没在训练集中出现的样本用于测试,这样的测试结果,亦称“包外估计”(out-of-bag estimate).

注意点:

自助法在数据集较小、难以有效划分训练/测试集时很有用;

自助法能从数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处。(集成学习下面的章节会有专门介绍)

不足:

自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差;因此在初始数据量足够时,留出法和交叉验证法更常用一些。

 

调参与最终模型

大多数学习算法都有些参数需要设定,参数配置不同,训练所获得的模型往往有显著的差别,因此,在进行模型评估与选择时,除了要对使用学习算法进行选择,还需要对算法参数进行设定,这就是通常说的“参数调节”或“调参”。

其实,调参和算法选择没有什么本质区别,都是去选择相对泛化误差小的模型。但通常参数的取值范围为实数,所以我们不可能每个参数值都训练出一个模型,这个是用的常用方法是设定一个适当的取值范围和步长,例如在【0,2.0】范围内步长为0.5,则实际要评估的参数只有5个。最终是从这5个候选值产生选定值。显然这个值不一定是最价值,但这是在计算开销和性能估计之间进行折中的结果。

实际情况下,调参往往非常困难,因为参数往往有多,假设有3个参数,每个参数有5个取值,那么就有5^3 = 125个模型需要评估。很多强大的学习算法都有大量参数需设定,这就导致极大的调参工作量,以至于在不少应用任务中,参数调的好不好往往将对最终模型性能有关键性影响。例如在大型的深度学习模型甚至可以有上百亿个参数。

 

以上介绍了几种常用的生成训练/测试集的方法,但这种生成的训练/测试集仅仅是用于评估学习算法的优劣的,当确定要使用的学习算法后,需要使用全部的样本集D生成相应的模型。这才是我们最终需要得到的模型。

另外通常情况下把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常被称为“验证集”(validation set)。例如在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证机基于验证集上的性能来进行模型选择和调参。


未完待续。。。

 

 

你可能感兴趣的:(机器学习)