长文收藏|关于模型评估那些事都在这里了

浏览: 2293

本篇是合集文章,主要供各位童鞋系统学习和日后复习使用。本篇是旧篇中的“如何直观地理解过拟合与欠拟合的那些事”,“分层抽样与交叉验证”及新篇“模型性能度量那些事”的合集,如已看过旧篇的童鞋可以直接跳到第三部分。

幻灯片1.JPG


在上前几期中,我们曾谈到过在我们希望借助统计学习方法,能够在现有的数据当中掌握规律,从而能够对未来/未知进行预测控制。虽然是说从现有的数据当中掌握规律,但是很显然地,我们的重心还是在于预测上。

既然我们是在做预测,不可避免地,就存在对错的问题,就存在这预测准确率的问题。若是用了精度不够的模型,轻则可能影响生产,重则也是有可能造成事故~当年,要是孔明先生不能准确预测东风,就是不是大事可成,而是万事休矣~

那当然,预测精准率高不仅仅指的是,通过学习得到这个模型对已有的数据有很好的预测能力,更重要的是对未来,未知的数据也能够有很好的预测能力。但是在具体的执行层面,由于我们并没有未来的数据,为了能够充分评价模型的性能,因此我们一般可以会把现有的数据集简单划分为两个部分:一部分数据用作训练集,进行模型训练;剩下的数据用作测试集,用于模型性能评估。(具体的划分比例需要根据实际情况进行调整,一般的做法,我们会将大约60% ~ 80%的数据用于训练,剩下的样本用于测试)。

其实,我们需要把数据划分为训练集合测试的原因很好理解,如果我只有一个训练数据集合,无论是模型训练还是模型测试,都是在训练集上执行的话,这就有点类似于运动会上,咱们既当运动员又当裁判,这事儿怎么看都透着这么点诡异了。

一般地,我们把在训练集上的计算得到误差称之为训练误差,在测试集上计算得到的称为测试误差(也称作为泛化误差)。一般来说,我们通过比较测试误差的高低从而进行模型的选择。

举个简单例子说明,例如我们在研究客户流失,在集合D中我们有1000个样本,我们利用随机抽样的方法从中抽取800个样本作为训练集,剩下的200个作为测试集。划分出集合后,我们就可以在训练集S上进行模型训练,再在测试集T上评估结果。假如在训练集中,我们有700个样本被正确分类,那么训练集的正确率就有700/800*100%=87.5%,而在测试集中,假如我们只有150个样本被正确分类,那么测试集的正确率绩则是150/200*100%=75%.

虽然,一般来说,训练集的准确率都是高于测试集,但是,我们认为训练集测预测准确率不能很好地评估模型的预测能力,直观地说,就类似上面所说这样会带来‘即是裁判又是运动员的问题’。进一步地说,这样很可能会导致过拟合的问题。

让我们再看看如下的例子,对包含10个样本的数据集进行线性回归,分别构建多项式:M=1,M=3,M=5以及M=9(注M=9,因为含有常数项的话,实际上已经包含有10个参数)

(1)首先,我们选择了一个一次项的回归模型,我们拟合出一条直线,可以看到数据拟合的效果并不好,不但与训练数据偏差较远,而且变动情况也没有很好的拟合出来,可以想象得到,该模型无论是在训练集上还是在测试集上,误差都比较大。由于变量考虑不足或者对模型形式估计不足,这种对训练数据基本特征都不能够很好拟合的情况,我们称之为“欠拟合”

(2)进一步地,当我们选取M=3的时候,尽管拟合曲线并没有能够完美拟合出所有的点,但已基本能够把数据趋势很好地拟合出来,基本能够反映出自变量与因变量的关系,该模型在训练集以及测试集的误差可能都比较低,这个状态相对合适。

(3)接下来,我们进一步考擦,当我们选取M=6的时候,我们发现曲线的拟合效果进一步提高,已经非常接近实际数据;当最后,我们选择M=9,可以发现拟合曲线穿过所有的样本点,效果达到最好状态,训练误差为0。尽管,这是在训练集当中最好的状态,但是正因为把样本数据学习得太好了,将会导致我们的泛化能力大大的下降,要知道在我们的训练集中,也是存在噪声的这种把训练集中数据所有特性(包括噪声特性)都学习起来的状态,我们称之为‘过拟合’。过拟合状态往往在测试集的数据上都表现都要比训练集效果差得多;

实际上,当我们选择M=3的时候,就已经把训练数据的基本特征学习到了,并且这个时候模型也相对简单,因此我们可以选取多项式(M=3)作为最终选择。

从上面的例子,我们可以看到,随着模型复杂度的提高(例如更多的参数),训练误差也会随之减少,直至趋向于0(甚至等于0)。但对于测试误差来说,则不是,一开始随着模型复杂度的增加,测试误差逐渐降低,直至模型符合现实数据情况达到最低,如果在这个基础上模型复杂度继续增加,那么测试误差就会从最低点又开始增大。

下图展示了模型复杂度与模型误差之间的关系。


从上图,我们就可以明显看出,模型复杂度并不是越高越好。实际上,模型越复杂,出现“过拟合”的可能性就越大,因此一般而言,我们更喜欢“简单”的模型,而这种思想确实又与众所周知的“奥卡姆剃刀原理”是不谋而合的。

“奥卡姆剃刀原理”是有14世纪逻辑学家奥卡姆的威廉所提出,简单来说就是“如无必要,勿增实体”。而放在统计学习领域里面,我们则可以翻译为“若有两个预测能力相当的模型时,我们应该选择其中较为简单的一个”

一般来说,欠拟合的问题比较清楚明了,不外乎是由于所选择的特征不足够或者所选择的学习算法学习能力不够强大。相反,过拟合的问题就比较复杂了,很多时候我们并不清楚问题是否由过拟合引起,或者说过拟合所带来的问题有多严重,因为我们总是不可能避免过拟合的出现。因此,怎们选进行合适的模型选择就变得重中之重。

因此综合来说,为了能准确评估模型性能,我们就可以把整个数据集集分成两个部分,一部分用于训练模型,得到估计参数(训练集);另一部分用于评估模型误差,得到准确率(测试集)


更进一步,在有些实践当中,如在分类问题上,我们往往在事先不知道那种算法是最优的,并且不同的算法里面也包含大量的需要人为设定的超参数。在这些情况下,我们往往需要再划分多一个验证集,用于选择具体超参数,因此也可以把数据集划分为训练集,验证集以及测试集。



步骤:

(1)首先按照一定比例划分为广义训练集A以及测试集T

(2)由于我们还需要一个验证集,所以我们再从广义训练集A再按比例划分训练集S以及验证集V

(3)我们在训练集S上分别采用不同的算法/参数得出模型,再利用验证集V评估各个模型的性能。经过这一步,我们已经得到了最优的算法/参数配置

(4)根据得到的最优配置,我们在广义训练集A上(即S+V)重新构建模型,得到最终模型;

(5)把最终模型用于测试集T检验结果,进行评估测试。

注意点:

a):在步骤(3)中,利用随机方法把广义训练集A直接划分为训练集S以及验证集V我们一般称之为留出法,这里的划分方法不但可以使用随机抽样也可以选择分层抽样,这样可以一定程度保持分布的一致性;

b):针对留出法只是直接切割划分,可能会为模型带来一定的不确定性,因此这阶段我们可以选择交叉检验(Cross Validation,简称CV)进行代替;

c):可以在第四步中的广义训练集A得到的模型作为最终模型,也可以在确认算法及超参数的配置后,用整个数据集(A+T)作为最终模型。




1留出法(Hold out)与分层抽样

留出法就是咱们在上期文章介绍的进行对训练集和测试集进行的划分方法。

上期内容:如何直观地理解过拟合与欠拟合那些事~

留出法的意思就是直接将总数据D划分为两个对立集合,训练集S以及测试集T,我们有S+T=D,以及S交T等于空集;

举个简单例子说明,例如我们在研究客户流失,在集合D中我们有1000个样本,我们利用随机抽样的方法从中抽取800个样本作为训练集,剩下的200个作为测试集。

划分出集合后,我们就可以在训练集S上进行模型训练,再在测试集T上评估结果。假如在训练集中,我们有700个样本被正确分类,那么分类的正确率就有700/800*100%=87.5%,而在测试集中,假如我们只有150个样本被正确分类,那么分类的正确率绩优150/200*100%=75%.

但实际上,这样的做法是存在一定的问题的。由于我们采取的是完全随机抽样的方法,这就可能会由于抽样划分的问题而改变了原有的数据分布。

例如在上述1000个样本中,其中有200名客户被标记为流失,800名客户被标记为普通客户。

接下来,我们随机抽取数据集D中的800个样本作为训练集,200个样本作为测试。但是由于抽样的问题,其中有100名流失客户被分在了训练集,另外的100名客户被分在了测试集。

让我们在回顾一下分布比例,原本在数据集D中,流失客户的分布比例是20%,而经过划分后,我们在训练集中的流失比例只有12.5%,而在测试集中流失比例达到50%,显然,我们的数据分布与原有的数据分布发生了极大的改变,而这很有可能给我们的模型训练以及评估带来非常大的隐患。

因此,为了避免这种情况,在我们使用留出法进行训练集测试集划分的时候,也会采用分层抽样的方法。

回到原来的例子,我们可能从200个流失客户中随机抽取80%放到训练集,20%放到测试集;再从800个非流失客户中抽取80%放到训练集,剩下20%又放回到测试集。值得注意的是,划分训练集以及测试集的方法是多样的,我们完全可以通过抽样方法的结合,帮助我们更好的决定训练集以及测试集的组成

除了结合抽样方式,另外一种改进策略被称为“重复抽样”。它的思想是这样的,考虑到我们只进行一次随机抽样划分训练集与测试集可能会有存在较大的不稳定性,因此我们就将抽样结果重复p次,最后把p次结果进行加和求平均。

2交叉验证(Cross Validation)

虽然留出法可以通过分层抽样解决数据分布不等的问题,但是由于我们需要拿出一部分数据作为测试,因此总有部分的数据不能用于构建模型,而一种更好的选择是交叉验证,一般也简称CV

交叉验证法是一个将整体数据集平均划分为k份,先取第一份子集数据作为测试集,剩下的k-1份子集数据作为训练集进行一次试验;之后再取第二份子集数据,剩下的k-1份子集数据在进行一次试验,不断往复,最后重复k次的过程,一般我们称之为k折交叉检验,交叉检验是我们进行参数调整过程中非常重要的一个方法。

一般我们常用十折交叉检验,不妨我们设定k=10进行举例:

  • 首先我们把总数据集划分为10份,分别成D1,D2,… …,D10;

  • 首先选择D1数据集作为测试集,D2,…D10作为训练集。在训练集上构建模型,在测试集上进行模型评估,得到评估记过O1;

  • 之后选择D2数据集作为测试集,D1,D3,…D10作为训练集。在训练集上构建模型,在测试集上进行模型评估,得到评估记过O2;

  • 分别抽去D3,D4,…,D10作为测试集,一共重复10次,并得到10个结果:O1,O2,…,O10;

  • 将得到10个结果:O1,O2,…,O10加和取平均,作为最终评估结果O。

以上过程,我们称之为10折交叉检验。一般而言,在平常的使用中,10折交叉检验比较常见,当然也会有5折交叉检验,3折交叉检验。

更进一步地,类似于留出法可以采取重复抽样,对于交叉检验来说同样也存在着划分方式的不同情况,因此我们也可以采用不同的划分方式重复进行交叉试验的方法,例如,我们利用不同的划分方式划分数据5次,每次都是划分为10折,那我们就称之为5次10折交叉试验

特别地,交叉验证还有一种特殊情况,称之为留一交叉验证(leave one Out)。它是指,我们令样本划分次数k等于数据集合D的样本数量n,即对样本集合D划分为n份子集,每份子集只包含一个样本。这个方法的优缺点都十分的明显,优点点我们每次的训练集都与原始数据集非常接近,并且也能做到训练集与测试集是对立的,这样可以保证我们得到的结果相对比较准确。但相对而言,采取这样的方式也意味着我们的计算开销会大大增加。


幻灯片2.JPG

在之前,我们讨论了关于模型评估的那些事。我们已经知道要准确评估模型的性能,我们需要对数据划分训练集及测试集,那么在本期分享当中,我们将进一步为大家详细介绍模型的评估指标。

1

回归任务的性能度量

1.平均绝对误差MAE

平均绝对误差(MAE,Mean Absolute Error),或被称为L1范数损失,作为评估指标来说现在用得比较少。

blob.png

2.均方误差MSE

均方误差(MSE,Mean Squared Error),是我们最常用的性能评估指标是.

blob.png

实际上,均方误差其实就是求得我们模型预测值和实际值的偏差,因此模型的均方误差越小越好。值得一提的是,对回归模型有印象的同学其实也会发现,这是我么利用最小二乘法求解回归问题时的损失函数。

3.均方根误差RMSE

均方误差(RMSE,Root Mean Squared Error)

blob.png

均方误差的开方,也是经常使用的模型评估指标。从MAE,MSE、再到RMSE,都是衡量我们模型预测与实际偏差的度量,直观地来说,以上的指标越小越好。但是上述指标有一个问题是,这是一个“比较型”的指标,也即是通过均方误差,我们可以知道哪个模型的偏差最小,但是我们并不知道这个模型是否足够的好,而且这个指标的大小明显和数据的数量级有关系

例如我们构建了一个回归模型预测广州市区的房价,模型的RMSE为2000,我们认为模型效果是可以接受的,这是因为对于均价在40000的房价预测中,2000的偏差只是其中的5%。但是,假如我们是构建了一个回归模型预测国内某个均价在5000的小县城的房价时,模型的RMSE为2000明显是不可以接受的,因为偏差已经占到均值的40%了。

blob.png

4. 决定系数blob.png

因为MAE,MSE以及RMSE的局限性,在传统的线性回归中,我们往往会使用决定系数blob.png对模型进行评估。

blob.png

关于决定系数的详细内容我们已在前面的文章中详细介绍(统计挖掘那些事-9个相关R先生的故事(理论+动手案例),这里不再复述。但值得注意的是决定系数看上去似乎不再受到数据量级的局限,但是相比于MSE等指标,决定系数只能评估对线性模型的拟合程度,因此对于可能构建了非线性模型的算法来说(例如神经网络),我们还是需要使用RMSE进行评估。

2

分类任务的性能度量

1.准确率和错误率

对于分类任务来说,最常见的准确率和错误率。

模型的错误率:

blob.png

模型的准确率:

blob.png

其中blob.png为示性函数,但函数中内容为真时,函数结果取值为1,否则为0.

2.查准率,查全率和F值

模型的准确率和错误率是最常用的指标,但是有时候仅仅使用模型的准确率和错误率并不足够。为了说明这一点,我们以二分类问题为例,假设我们建立了一个客户影响响应模型

blob.png

表  客户影响活动响应分析预测矩阵

预测客户响应情况
TrueFalse
实际客户影响情况TrueTP(真正例)FN(假反例)
FalseFP(假正例)TN(真反例)

对于模型评估,可以采取一些常用的指标进行判读。

(1)模型准确率(Accuracy)

blob.png

(2)模型查准率(Precision)

blob.png

模型查准率又被成为精确率。正如上面所说,我们更加关心此次营销活动中对客户的响应预测是什么样的情况,因此,这里引入模型精确率这个指标,它主要反映了我们对目标类别的预测准性。例如,建模人员提供了一份100人的客户响应名单,精确率研究的是在这份名单中有多少客户是真正响应营销活动的。

(3)模型查全率(Recall)

blob.png

模型查全率又被称为查全率。既然我们已经可以通过精确率把我们的焦点放在关注的类别上,那么分析工作是不是就可以结束呢?回到本案例中,假设又得到了一份100个用户响应名单,其中的精确率也非常高,有90人真正响应了营销活动,精确率达到90%。但问题是,如果最终响应情况是有1000人响应,那么我们就只是发现响应群体中的9%,很明显这个结果是不能接受的。因此,可以使用召回率这个指标来衡量我们是否能够将目标情况“一网打尽”

需要值得注意的是,我们固然希望能够得到模型的查准率和查全率都比较高,但是模型的查全率和查准率往往是相互制约的,要提高查准率,往往会降低查全率,而要提高查全率则往往会降低查准率。而要综合考虑模型的查准率和查全率,我们可以借助P-R曲线。

如下图所示P-R曲线的纵坐标和横坐标分别是模型的查准率和查全率。要绘制P-R曲线,我们可以先对模型的预测样本按照准确率从高到低排序。接下来依次把判断阈值从高到低调整,之后按顺序阈值的调整顺序依次计算不同阈值的查准率和查全率,最后把计算结果绘制到图上就得到了下图的结果。事实上,随着阈值的逐渐降低,就是模型查准率下降而查全率上升的过程。

blob.png

图 西瓜书中P-R曲线示意图

有一点需要值得注意的是,在实际的项目当中P-R曲线往往不会这么平滑,而且很有可能是取不到(0,1)以及(1,0)两个点。借助于P-R曲线,我们能够很好地对模型进行综合评估。当多个模型进行比较时,例如模型A的P-R曲线完全“包住”了另一个模型C的P-R曲线,则可以认为模型A的性能要优于模型C。但是当两个模型的P-R曲线发生交叉时,例如模型A和模型B的P-R曲线由于发生了交叉,则可能难以判断,这要根据我们实际的情形进行取舍。如果我们对模型的查准率有较高的要求,则可能选择模型A,而当我们对模型的查全率有较高的要求,则可能选择模型B。

不过另一角度来讲,如果本身我们对模型查准率和查全率没有明显的“偏好”,实际上我们其实可以使用曲线下面积作为取舍,曲线下面积越大,模型的综合性能越好。值得注意的是,作为对面积的替代,我们还可以利用“平衡点”(BEP,Break-Even Point),即产准率=查全率的取值点进行比较。在上图中,模型A的平衡点要高于模型B,因此我们可以认为模型A要优于模型B。

(4)F Measure

某些情况下,只考虑平衡点可能过于简单,那么我们可以使用F1 Measure。

blob.png

实际上F1值就是查准率和查全率的调和平均数,调和平均数常用于用在相同距离但速度不同时,平均速度的计算。一段路程,前半段时速60公里,后半段时速30公里〔两段距离相等〕,则其平均速度为两者的调和平均数时速40公里。

但也正如我们前面所说的,有些场景下,我们对查准率和查全率的重视程度是不一样的。例如在体检过程中,我们希望尽可能发现体检者是否患有某种疾病,此时我们更加重视查全率。又例如在商品推荐中中,我往往不希望过于打扰客户,则会更加重视查准率。因此我们可以在F1值的计算中引入权重blob.png不妨使用blob.png代表查全率相比查准率的重要性,有加权调和平均的计算如下:

blob.png

显然当blob.png=1时,,就是blob.png指标。

3. ROC与AUC

通常,我们的算法模型也会为我们生成预测概率。一般我们可以选择一个阈值,当预测概率大于这个阈值时,我们将其划分为正类。通常我们习惯选取0.5作为阈值,当然,根据实际的任务需要,如果我们更加关注查准率,则可以适当调高阈值。相反,如果我们更加关注查全率,则可以适当调低阈值。

受试者工作特征曲线 (Receiver Operating Characteristic Curve,简称ROC曲线),与P-R曲线类似,我们根据预测概率对分类结果进行排序。之后从高到低依次选择阈值对样本进行分类,并计算出“真正例率”和“假正例率”。因为开始的时候,阈值最高,因此时所有的样本均被划分为负类,无论是“真正例率”和“假正例率”均为0.随着不断调低阈值,直至所有的样本均被划分为正类,这时无论是“真正例率”和“假正例率”均为1.真正例率和假正例率的定义如下:

blob.png

一个典型的ROC曲线如下图所示,其中图上的对角线对应于随机猜测结果,曲线下面积越大,代表模型效果越好,显然如果模型A的ROC曲线完全包住另一个模型B的ROC曲线,我们可以说模型A的分类效果要优于模型B。最理想的模型是曲线直接去到(0,1)这个点,此时曲线下面积达到最大,为1.比较客观的比较方法同样可以使用面积,AUC曲线下的面积越大,说明模型的分类效果越好,我们把ROC曲线下的面积称之为AUC(Area Under ROC Curve)

blob.png

当然,因为在实际情况AUC(Area Under ROC Curve)是各点链接而成,一般出现不了上图这般平滑的曲线,通常我们得到的ROC曲线如下图所示。

blob.png

幻灯片5.JPG


近期热门文章精选

1.六行代码打造萌萌哒聊天机器人

2.超详细|关于梯度下降方法四知四会

3.如何通俗地理解决策树中的信息熵

4.真的只需要关心PM2.5?广州空气质量分析报告(附代码)

5.重磅|谷歌发布机器学习速成课程(完美中文支持)

注:由于最近老撕比较忙,所以有些信息没有及时查看回复(微信规定48小时没有回复的话,则不能再次回复),所以如果浩彬老撕没有及时回复,大家可以再次留言。

作者简介:浩彬老撕

好玩的数据炼丹师,

曾经的IBM 数据挖掘攻城狮,

还没开始就过气数据科学界的段子手,

致力于数据科学知识分享,不定期送书活动

推荐 3
本文由 浩彬老撕 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册