机器学习入坑姿势之模型评估与选择(阶段一)

it2022-05-07  29

模型评估与选择——功能讲解、如何适用

 

作为一个菜鸟,我觉得在没有足够多的工程经验和知识深度与厚度的情况下,不太适合谈模型评估与选择方面的心得。因此此篇文章,我主要会介绍些基础概念、常用的评估方法、性能度量的指标等相关内容。

1、模型(也可叫做学习器)的实际预测输出与样本的真实输出之间的差异叫“误差”(error),在训练集上的误差就是“训练误差”(training error)或“经验误差”(empirical error),在新样本上的误差称为“泛化误差”(generalization error)。我们希望得到泛化误差小的模型,以这个为核心参考标准来判断模型的好坏。然后,我们事先并不知道新样本是什么样,我们实际能做的是使经验误差最小化。但是不是经验误差最小,甚至小到0,就是我们想要的呢?显然不是。如果经验误差很小、但泛化误差很大,通常是出现了“过拟合”的状况;相应的,有过拟合就有“欠拟合”。通俗地说,过拟合就是训练得太狠,一味追求模型在训练集上的效果,却使得泛化能力很弱;欠拟合就是训练得不够。

2、通常,我们常用的评估方法有三种:留出法、交叉验证法和自助法。

2.1 留出法(hold-out):

它将数据集D划分为两个互斥的集合,其中一个作为训练集S,另一个作为测试集T。在S上训练出模型后,用T来评估其测试误差,作为对泛化误差的估计。需要注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,比如有500个男人,350个专一、150个花心,那在采样(sampling)的时候,我们在“专一、花心”的采样比例应该是7:3;这叫“分层采样(stratified sampling)”。还有,即便在给定训练/测试集样本比例后,仍存在多种划分方式对初始数据集D进行分割。这些不同的划分将导致不同的训练/测试集,相应的,模型评估结果也会有差别。因此,单次使用留出法得到的估计结果往往不够稳定可靠,在使用留出法时,在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。例如进行100次随机划分,每次产生一个训练/测试集用于实验评估,100次后就得到100个结果,而留出法返回的则是这100个结果的平均。常见的划分方法是大约2/3~4/5的样本用于训练,剩余样本用于测试。一般而言,测试集至少应含30个样例。

2.2 交叉验证法(cross validation):

它将数据集D划分为k个大小相似的互斥子集。每个子集Di都尽可能保持数据分布的一致性,即从D中通过分层采样得到。然后,每次用k-1个子集的并集作为训练集,余下的子集作为测试集;这样就可以获得k组训练/测试集,从而可进行k次训练和测试,最终返回的是这k个测试结果的均值。交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,所以也称该方法为“k折交叉验证”(k-fold cross validation)。K常用的取值有10、5、20等。

假定数据集D中包含m个样本,若另k=m,则得到了交叉验证法的一个特例——留一法(Leave-One-Out,简称LOO):

留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用D训练出的模型很相似。因此,留一法的评估结果往往被认为比较准确。然后,留一法也有其缺陷:在数据集比较大时,训练m个模型的计算开销可能时难以忍受的(若有100w个样本,则需训练100w个模型),而这还是在未考虑算法调参的情况下。另外,留一法的估计结果也未必永远比其他方法准确;NFL定理对实验评估方法同样适用。

2.3 自助法(bootstrapping):

我们希望评估的是用D训练出的模型。但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比D小,这必然会引入一些因训练样本规模不同而而导致的估计偏差。留一法受训练样本规模变化的影响较小,但计算复杂度又太高,所以为了解决这个问题,自助法出现了。

它直接以自助采样法(bootstrap sampling)为基础。给定包含m个样本的数据集D,我们对它进行采样产生数据集D`,过程是这样的:每次随机从D中挑选一个样本,将其拷贝放入D`,然后再将该样本放回初始数据集D中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行m次后,我们就得到了包含m个样本的数据集D`,这就是自助采样的结果。显然,D中有一部分样本会在D`中多次出现,而另一部分样本不出现。可以做一个简单的估计,样本在m次采样中始终不被采到的概率如下:

自助法它的长处和短处:自助法在数据集较小、难以有效划分训练/测试集时很有用;此外,自助法能从初始数据集中产生多个不同得训练集,这对集成学习等方法有很大的好处。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。因此,在初始数据量足够时,留出法和交叉验证法更常用一些。

2_Plus 关于调参与数据集划分

机器学习常涉及两类参数:一类是算法的参数,亦称“超参数”,数目常在10以内;另一类是模型的参数,数目可能很多,例如大型“深度学习”模型甚至有上百亿个参数。两者调参方式相似,均是产生多个模型之后基于某种评估方法来进行选择;不同之处在于前者通常是由人工设定多个参数候选值后产生模型,后者则是通过学习来产生多个候选模型(例如神经网络在不同轮数停止训练)。

其实,调参和算法选择没什么本质区别:对每种参数配置都训练出模型,然后把对应最好的参数作为结果。但这里有一点需要注意:学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的。现实中常用的做法,是对每个参数选定一个范围和变化步长,例如在[0,0.2]范围内以0.05为步长,则实际要评估的候选参数值有5个,最终是从这5个候选值中产生选定值。显然,这样选定的参数值往往不是“最佳”值,但这是在计算开销和性能估计之间进行折中的结果,只有这样,学习过程才变得可行。

给定包含m个样本的数据集D,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选定完成后,学习算法和参数配置已选定,此时应该用数据集D重新训练模型。这个模型在训练过程中使用了所有m个样本,这次是我们最终提交给用户的模型。

另外,需注意的是,我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为“验证集”(validation set)。就是说,在研究对比不同算法的泛化性能时,我们用测试集(也就是新的样本数据,训练中没出现过的)上的判别效果来验证模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。

3 性能度量

3.1 对模型的泛化性能进行评估,不仅需要有效可行的实验估计方法,还需要衡量模型泛化能力的评价标准,这就是性能度量(performance measure)。性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的好坏是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求。

我们来看看“西瓜书”中是怎么写的:

我觉得,作为初学者先不要把度量模型的指标考虑得过复杂,也先将特征维度简化成2维。只需考虑怎样通过“均方误差”使得预测值尽量逼近真实值。

接下来,我们需要熟悉一些与性能度量相关的指标:

错误率、精度                    查准率、查全率、F1值

P-R曲线                            平衡点

调和平均                           宏F1、微F1

ROC、AUC······    

查准率和查全率往往是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。例如,希望尽可能多的挑出好男人,则可通过增加选择男人的数量来实现,如果选上所有男人,那所有的好男人必然都被选上了,但这样查准率就会较低;若希望选出的男人中好男人比例尽可能高,则可只挑选最有把握的男人,但这样难免会漏掉不少好男人,使得查全率低。通常只有在一些简单任务中,才可能使查准率和查全率都很高。

通过比较P-R曲线下面积的大小,它在一定程度上表征了模型在查准率和查全率取得相对“双高”的比例。当然,一个模型的曲线完全包裹另一个模型的曲线,那前面一个一定更好。但是这个值不太好算,于是,人们设计了一些综合考虑查准率、查全率的性能度量。比如说F1值:

3.2 ROC和AUC

很多算法是为测试样本产生一个实值或概率预测,然后将这个给预测值与一个分类阈值(threshold)进行比较,若大于阈值则分为正类,否则为反类。

我们从高到低排序每一个样本的预测值,根据不同的任务需求来选取“截断点”,例如若我们更重视“查准率”,则可选择排序中靠前的位置进行截断;若更重视“查全率”,则可选择靠后的位置进行截断。因此,排序本身的质量好坏,体现了综合考虑模型在不同任务下的“期望泛化性能”的好坏,或者说,“一般情况下”泛化性能的好坏。ROC曲线则是从这个角度出发来研究模型泛化性能的有力工具。ROC:一个正例,一个负例,预测为正的概率值比预测为负的概率值还要大的可能性。

AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间。Auc作为数值可以直观的评价分类器的好坏,值越大越好。

 


最新回复(0)