机器学习模型的评估与选择

作者:hooly

微信公众号:一口袋星光

机器学习

目录:

1.说明;

2.概念;

3.bias-variance trade-off;

4.评估方法

5.性能度量

说明:本文大部分内容来自于《机器学习》读书的笔记,对机器学习感兴趣的同学,非常推荐阅读周志华的这本书:

机器学习


1.概念

错误率&精度:分类错误的样本数占样本总数的比例是“错误率”,如果m个样本中有α个分类错误,则错误率E = α/m,相应的精度为1-E = 1-α/m

“训练误差”&泛化误差:对于模型来说,在训练集上的误差叫做“训练误差”,“训练误差”是被允许的,因为我们真正关心的是在训练集上学到的模型在新样本数据上的表现。在新样本上的误差是“泛化误差”。

“过拟合”&“欠拟合”:如果模型对于训练集的数据学习的太好,那么可能造成“过拟合”;如果“训练误差”都很大,那么可能是“欠拟合。


过拟合欠拟合

2.bias-variance trade-off:

bias-variance trade-off
Under-fitting&Over-fitting
过拟合&欠拟合

bias :误差

variance:方差

noise:噪声

bias:估计的均值模型与实际模型之间的距离

variance:不同模型与估计的均值模型之间的平均距离

在实际训练过程中,我们往往不会只使用一个样本训练一次,我们会使用多个样本,训练出多个不同的模型。

不同的训练集训练出不同的模型。这就要求:

第一,在不同训练集下训练出的模型,我们希望这些模型的均值越接近实际模型越好,即bias越小越好;

第二,这组模型,本身的方差不要太大。也就是不同训练集训练的模型之间,不要差别太大,即variance越小越好。

3.评估方法

3.1.对数据集进行划分,分为训练集和测试集两部分;数据集D、训练集S、测试集T

3.2.在测试集上,训练模型,得到“测试误差”,作为“泛化误差”的近似

3.3.调参和最终确定模型

3.1数据集的划分方法:

通常有以下三种:

留出法  

交叉验证法

自助法

3.1.1留出法:

留出法是直接将数据集D划分为两个互斥的集合,其中一个集合作为训练集S,另一个作为测试集T,我们需要注意的是在划分的时候要尽可能保证数据分布的一致性,即避免因数据划分过程引入额外的偏差而对最终结果产生影响。

为了保证数据分布的一致性,通常我们采用分层采样的方式来对数据进行采样。

但是样本的不同划分方式会导致模型评估的相应结果也会有差别,通常我们都会进行多次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

留出法的缺点:对于留出法,如果我们的对数据集D划分后,训练集S中的样本很多,接近于D,其训练出来的模型与D本身训练出来的模型可能很接近,但是由于T比较小,这时候可能会导致评估结果不够准确稳定;如果S样本很少,又会使得训练出来的样本与D所训练出来的样本相差很大。通常,会将D中大约2/3−4/5的样本作为训练集,其余的作为测试集。

3.1.2.交叉验证法:

交叉验证

k折交叉验证通常把数据集D分为k份,其中的k-1份作为训练集,剩余的那一份作为测试集,这样就可以获得k组训练/测试集,可以进行k次训练与测试,最终返回的是k个测试结果的均值。、

这里数据集的划分依然是依据分层采样的方式来进行。对于交叉验证法,其k值的选取往往决定了评估结果的稳定性和保真性。常见的K的取值有:5、10、20。与留出法类似,通常我们会进行多次划分得到多个k折交叉验证,最终的评估结果是这多次交叉验证的平均值。比如“10次10折交叉验证法”。(10次10折交叉验证和100次留出法,都是进行了100次实验)

假设数据集D里面包含m个样本,当k=m的时候,我们称之为留一法,我们可以发现留一法并不需要多次划分,因为其划分方式只有一种,因为留一法中的S与D很接近,因此S所训练出来的模型应该与D所训练出来的模型很接近,因此通常留一法得到的结果是比较准确的。但是当数据集很大的时候,训练m个模型的计算开销可能是无法忍受的。

3.1.3.自助法:

留出法与交叉验证法都是使用分层采样的方式进行数据采样与划分,而自助法则是使用有放回重复采样的方式进行数据采样,即我们每次从数据集D中取一个样本作为训练集中的元素,然后把该样本放回,重复该行为m次,这样我们就可以得到大小为m的训练集D',在这里面有的样本重复出现,有的样本则没有出现过,我们把那些没有出现过的样本D-D'作为测试集。

这种方法对于那些数据集小、难以有效划分训练/测试集时很有用,但是由于该方法改变了数据的初始分布导致会引入估计偏差。

总结

对于数据量充足的时候,通常采用留出法或者k折交叉验证法来进行训练/测试集的划分;

对于数据集小且难以有效划分训练/测试集时使用自助法

对于数据集小且可有效划分的时候最好使用留一法来进行划分,因为这种方法最为准确

3.2训练模型

模型的训练过程本文不做论述

3.3调参和最终确定模型

在机器学习过程中,除了要进行模型的选择,也需要进行参数的设定,这就是通常所说的“参数调节”简称“调参”。

注意:学习算法的很多参数是在实数范围内取值的,对于每种参数的配置都训练一个模型出来是不可能的,常用的做法是对每个参数设置一个变化范围和步长,比如在[0,2]之间,以0.05为步长,实际要评估的值是5个,最终也会从这5个候选值中产生选定值。这个值可能并不是最佳值,但是这是在性能和开销之间进行这种的结果,通过折中,学习这个过程才变得可行。假设有3个参数,每个参数有5个候选值,那么一共就是5*5*5=125个模型需要考察,所以即使是折中后,调参仍然是很困难的。

需要注意的是,我们会把训练集另外划分成训练集和验证集(validation set),基于验证集上的性能来进行模型选择和调优,用测试集上的判别效果来估计模型在实际使用时的泛化能力。

4.性能度量

对于模型的性能度量,我们通常用以下几种方法来进行度量:

1. 错误率/精度(accuracy)

2. 准确率(查准率,precision)/召回率(查全率,recall)

3. P-R曲线,F1度量

4. ROC曲线/AUC(最常用)

5. 代价曲线

接下来,我们将会更加详细的来介绍这些概念以及那些度量方法是最常用的。

3.4.1错误率/精度(accuracy)

假设我们拥有m个样本个体,分类错误的样本数占样本总数的比例是“错误率”,如果m个样本中有α个分类错误,则错误率E = α/m,相应的精度为1-E = 1-α

3.4.2准确率(查准率)/召回率(查全率)

准确率=预测为真且实际也为真的个体个数预测为真的个体个数

召回率=预测为真且实际也为真的个体个数实际为真的个体个数

我们将准确率记为P,召回率记为R,通过下面的混淆矩阵我们有

混淆矩阵

其中,TP(true positive),FP(false positive),FN(false negative),TN(true negative)

P=TPTP+FP

R=TPTP+FN

通过上面对准确率和召回率的描述我们可以发现,准确率更care的是在已经预测为真的结果中,预测正确的比例,这时候我们可以发现如果我们预测为真的个体数越少,准确率越高的可能性就会越大,即如果我们只预测最可能为真的那一个个体为真,其余的都为假,那么这时候我们的准确率很可能为100%,但此时召回率就会很低;而召回率care的是在所有为真的个体中,被预测正确的个体所占的比例,那么可以看到如果我们预测为真的个体越多,那么召回率更高的可能性就会越大,即如果我们把所有的个体都预测为真,那么此时的召回率必然为100%,但是准确率此时就会很低。因此这两个度量往往是相互对立的,即准确率高则召回率通常比较低,召回率高则准确率往往会很低。因此我们分别用准确率或召回率对模型的预测结果进行评价会有片面性,故接下来介绍P-R曲线来对模型进行更准确的评价。

3.4.3 P-R曲线/F1度量

P-R曲线是以召回率R为横轴,准确率P为纵轴,然后根据模型的预测结果对样本进行排序,把最有可能是正样本的个体排在前面,而后面的则是模型认为最不可能为正例的样本,再按此顺序逐个把样本作为正例进行预测并计算出当前的准确率和召回率得到的曲线。

通过上图我们可以看到,当我们只把最可能为正例的个体预测为正样本时,其准确率最高位1.0,而此时的召回率则几乎为0,而我们如果把所有的个体都预测为正样本的时候,召回率为1.0,此时准确率则最低。但是我们如何通过PR曲线来判断哪个模型更好呢?这里有以下集中判断方式:

基于曲线是否覆盖来进行判断。即如果模型B的PR曲线此时完全包住了模型C的PR曲线,此时我们认为模型B对于该问题更优于模型C,这也可以理解,因为在相同召回率的情况下,模型B的准确率要比模型C的更高,因此B必然更优一些。但是这种方法在曲线有交叉的时候不好判断;

基于平衡点来进行判断。平衡点即为召回率与准确率相等的点,如果该点的值越大,则认为模型越优,但这样的判断过于简单;

利用F1度量来进行判断。F1=2∗P∗RP+R,F1的值越大越好,可以发现,F1是一个准确率和召回率的调和平均数,其更care较小值,因此如果P与R中一个值太小会对F1产生更大的影响,但是这样的判断都是以准确率和召回率同等重要为基础的,但是对于很多问题,其会更care其中的一个指标,例如癌症的判断,其更关注的是召回率而不是准确率,因为如果我们更关注准确率,就会使得很多的癌症患者被误诊为不是癌症,从而造成患者的死亡率会更高;

利用Fβ来判断。Fβ=(1+β2)∗P∗Rβ2∗P+R,当β=1的时候,即为F1度量,当β>1的时候,召回率有更大的影响,反之准确率有更大的影响,这个很好理解,我们把Fβ转换一下又Fβ=11+β2(β2R+1P),通过该公式我们可以看到当β>1的时候,R对于Fβ的影响更大。

但是对于PR曲线,其对于样本类别是否平衡非常的敏感,在这里我们可以做一个证明:

假设我们拥有n个样本,我们首先对样本进行排序,把在该模型下最可能预测为正例的样本放在前面,把最不可能为正例的样本放在后面,然后我们选取阈值c,那么在c之前的样本我们会预测为正,c之后的样本我们会预测为负。p(fp)表示我们对样本预测为正的概率,那么我们有:

TP=n∫c−∞p(Y=1|fp)p(fp)dfp=n∫c−∞p(Y=1,fp)dfp=n∫c−∞p(fp|Y=1)P(Y=1)dfp=nP(Y=1)∫c−∞p(fp|Y=1)dfp

FP=n∫c−∞p(Y=0|fp)p(fp)dfp=n∫c−∞p(Y=0,fp)dfp=n∫c−∞p(fp|Y=0)P(Y=0)dfp=nP(Y=0)∫c−∞p(fp|Y=0)dfp

TN=n∫∞cp(Y=0|fp)p(fp)dfp=n∫∞cp(Y=0,fp)dfp=n∫∞cp(fp|Y=0)P(Y=0)dfp=nP(Y=0)∫∞cp(fp|Y=0)dfp

FN=N∫∞cp(Y=1|fp)p(fp)dfp=n∫∞cp(Y=1,fp)dfp=n∫∞cp(fp|Y=1)P(Y=1)dfp=nP(Y=1)∫∞cp(fp|Y=1)dfp

那么准确率

P=TPTP+FP=nP(Y=1)∫c−∞p(fp|Y=1)dfpnP(Y=1)∫c−∞p(fp|Y=1)dfp+nP(Y=0)∫c−∞p(fp|Y=0)dfp

我们可以看到准确率P与数据的先验分布P(Y)有很大的关系,当我们采的样本不均衡的时候,P(Y)会有变化,从而导致准确率也会发生变化,因此PR曲线对于数据采样的均衡性具有很高的敏感度

3.4.4 ROC曲线/AUC

ROC曲线则是以假正例率FPR为横轴,真正例率TPR为纵轴。其中

FPR=FPFP+TN

TPR=TPTP+FN

我们可以看到真正例率与召回率是一样的,那么ROC曲线图如下图所示:

该曲线与绘制PR曲线类似,也是首先将样本按照正例的可能性进行排序,然后按顺序逐个把样本预测为正例(其实相当于取不同的阈值),然后计算FPR值和TPR值,即可获得该曲线。

对于该曲线,我们首先有4个特殊的点要说明一下:

(0,0)点:我们把所有的个体都预测为假,那我们可以知道TP与FP都为0,因为TP表示预测为真实际也为真,而FP表示预测为真实际为假的个体;

(0,1)点:我们所有预测为真的个体都正确,这是我们最理想的情况,此时TP=TP+FN,而FP=0;

(1,0)点:这是预测最糟糕的情况,即所有的预测都是错误的,那么此时TP=0,而FP=FP+TN;

(1,1)点:因为其是在y=x的这条直线上,因此其相当于随机预测,即我预测一个个体为真还是假都是随机的。

因此我们可以发现如果一个模型的ROC曲线越靠近与左上角,那么该模型就越优,其泛化性能就越好,但是对于两个模型,我们如何判断哪个模型的泛化性能更优呢?这里我们有主要以下两种方法:

如果模型A的ROC曲线完全包住了模型B 的ROC曲线,那么我们就认为模型A要优于模型B;

如果两条曲线有交叉的话,我们就通过比较ROC与X,Y轴所围得曲线的面积来判断,面积越大,模型的性能就越优,这个面积我们称之为AUC(area under ROC curve)

由于我们的样本通常是有限的,因此所绘制出来的曲线并不是光滑的,而是像曲线b那样,因此我们可以通过以下公式来计算AUC

AUC=12∑i=1m−1(xi−1−xi)⋅(yi+yi+1)

根据FPR以及TPR的定义我们有

TPR=TPTP+FN=nP(Y=1)∫c−∞p(fp|Y=1)dfpnP(Y=1)∫c−∞p(fp|Y=1)dfp+nP(Y=1)∫∞cp(fp|Y=1)dfp=∫c−∞p(fp|Y=1)dfp∫c−∞p(fp|Y=1)dfp+∫∞cp(fp|Y=1)dfp

FPR=FPFP+TN=nP(Y=0)∫c−∞p(fp|Y=0)dfpnP(Y=0)∫c−∞p(fp|Y=0)dfp+nP(Y=0)∫∞cp(fp|Y=0)dfp=∫c−∞p(fp|Y=0)dfp∫c−∞p(fp|Y=0)dfp+∫∞cp(fp|Y=0)dfp

通过上面的公式运算,我们发现ROC曲线对于样本类别是否平衡并不敏感,即其并不受样本先验分布的影响,因此在实际工作中,更多的是用ROC/AUC来对模型的性能进行评价

3.4.5 代价曲线

在上面所描述的衡量模型性能的方法都是基于误分类同等代价来开展的,即我们把True预测为False与把False预测为True所导致的代价是同等的,但是在很多情况下其实并不是这样的,我们依然以癌症诊断为例,如果我们把一个患有癌症的患者预测为不患有与把不患有癌症的患者预测为患有明显其造成的损失是不同的,因此在这种情况下发我们是不可能以同等代价来进行预测。故这里引入了二分类代价矩阵

在这里我们给误分类赋予了一个代价指标。在非均等代价下,我们的目标就转化为最小化总体代价,那么代价敏感的错误率可以通过如下公式进行计算

e=1m(∑xi∈D+I(f(xi)≠yi)∗cost01+∑xi∈D−I(f(xi)≠yi)∗cost10)

由于在非均等代价下,ROC曲线并不能反映出模型的期望总体代价,因此引入了代价曲线,其中横轴为正例概率代价,纵轴为归一化代价。正例概率代价计算方式为:

P(+)cost=p∗cost01p∗cost01+(1−p)∗cost10

归一化代价计算方式为:

costnorm=FNR∗p∗cost01+FPR∗(1−p)∗cost10p∗cost01+(1−p)∗cost10

比较检验

前面介绍了各种性能度量方式,但是其度量的是模型在测试集下的测试误差的性能状况,虽然其可以近似代替泛化性能,但毕竟与真实的泛化性能有一定的距离,在这里我们介绍通过假设检验的方式,利用测试误差来预估泛化误差从而得到模型的泛化性能情况,即基于假设检验结果我们可以推断出若在测试集上观察到模型A比B好,那么A的泛化性能在统计意义上优于B的概率有多大

假设检验

假设检验就是数理统计中依据一定的假设条件,由样本推断总体的一种方法。其步骤如下所示:

1. 根据问题的需要对所研究的总体做某种假设,记为H0

2. 选取合适的统计量,这个统计量的选取要使得在假设H0成立时,其分布是已知的(统计量我们可以视为样本的函数)

3. 由实测的样本计算出统计量的值,根据预先给定的显著性水平进行检验,做出拒绝或接受假设H0的判断

根据以上三步我们知道首先我们要对所研究的总体做出某种假设,在我们所研究的问题中就是对模型泛化错误率分布做出某种假设或猜想。通常,测试错误率与泛化误差率的差别很小,因此我们可以通过测试误差率来估计泛化误差率。我们知道泛化误差率为ϵ的模型在m个样本中被测得的测试错误率为ϵ̂的概率为

P(ϵ̂,ϵ)=(mm∗ϵ̂)ϵϵ̂∗m(1−ϵ)m−ϵ̂∗m

我们可以看到该概率的格式满足二项分布,那么ϵ在取什么值的时候,概率P最大?让P对ϵ求导后我们可以发现当ϵ=ϵ̂的时候,概率值是最大的,二项分布示意图如下所示:

因此,我们可以假设泛化误差率ϵ≤ϵ0,那么在1−α的概率内所能观测到的最大错误率可以通过下式计算得到:

ϵ¯=maxϵs.t.∑i=ϵ0∗m+1m(mi)ϵi(1−ϵ)(m−i)<α

即我们最多能够误分的样本数为上图阴影部分乘上其相应的概率,故当测试错误率ϵ̂≤ϵ0时,在α的显著度下是接受的,即能够以1−α的置信度认为模型的泛化错误率不大于ϵ0

大多数情况下,我们会使用多次留出或交叉验证法,因此我们会得到多组测试误差率,此时我们可以使用t检验的方式来进行泛化误差的评估。

即假定我们得到了k个测试误差率,ϵ̂1,ϵ̂1,...,ϵ̂k,则平均测试错误率μ和方差σ2为

μ=1k∑i=1kϵ̂i

σ2=1k−1∑i=1k(ϵ̂i−μ)

由于这k个测试误差率可以看做泛化误差率ϵ0的独立采样,因此变量τt=k√(μ−ϵ0)σ服从自由度为k-1的t分布。对于假设μ=ϵ0和显著度α,我们可以计算出当前错误率均值为ϵ0时,在1−α概率内能观测到的最大错误率,即临界值。这样我们就可以对我们的假设做出拒绝或接受。

作者:hooly

微信公众号:一口袋星光

我会在微信公号上持续更新我的文章,你来讨论我很欢迎。

推荐阅读更多精彩内容