“跟着西瓜去学习”之--模型评估与选择

在上一节的绪论里主要介绍了一些机器学习里面比较基础的概念定义,帮助大家了解下机器学习方面的名词,算是个基础的入门。同样的在这节我们将讲到一些为后面的学习打基础的内容。其中的许多概念还是挺耐人寻味,需要好好理解的。

简介:这一节主要是介绍机器学习中模型的评估与选择,大家都知道,所谓的机器学习,其本质就是在训练样本上学习出一个恰当的模型,然后将模型应用在需要用来预测或计算的新样本上。我们也知道,对于不同的问题,我们需要建立的模型是不同的,一个好的模型对于问题的解决起到了非常大的作用。但是当我们遇到一个具体的问题的时候,我们该怎么选择模型呢?或者说我们怎么知道我们选择的模型好不好呢?这就需要我们对选择的模型建立一个评估的机制来评判模型的好坏。下面将介绍一些概念和评估方法。

1.经验误差与过拟合

错误率(error rate):分类错误样本数占样本总数的比例。如m个样本中有a个样本分类错误,那么错误率E = a / m。

精度(accuracy):分类正确样本数占样本总数的比例。精度=1 - 错误率。

误差(error):学习器的实际预测输出与样本的真实输出直接的差异。在训练集上的误差称为“训练误差(training error)”或者“经验误差(empirical error)”。在新样本上的误差称为“泛化误差(generalization error)”。相比于训练误差,我们更希望模型有更小的泛化误差,因为模型的目的是为了预测新的样本。所以如果一个模型有很小的训练误差,甚至训练误差为0,但是泛化误差很大的话,这个模型也不是一个好的模型。

我们希望学习器能够学习到样本的“普遍规律”,这样才可以在遇到新的样本的时候做出正确的判断。但是训练不当的时候会出现“过拟合”和“欠拟合”的问题。

过拟合(overfitting):通俗一点地来说过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。如下图所示:

左图是我们的训练数据,右图是我们训练出来的模型,显然我们的曲线过于复杂,不符合样本的真实分布。

欠拟合(underfitting):欠拟合与过拟合相对,就是模型没有很好地捕捉到数据特征,不能够很好地拟合数据。如下图所示:

左图是我们的数据,右图是训练出来的模型,很显然我们的模型学习的过于简单,没有将数据的曲线表现出来。

这里我们需要注意一点:针对过拟合我们会采取很多方法来抑制。但是过拟合是无法避免的,所有我们能做的只是“缓解”。因为我们面临的问题大多是NP难甚至更难,但是有效的学习算法必然是在多项式时间内完成的,也就是P问题,因为NP不等于P,所以过拟合不可避免

 

2.评估方法

       我们前面讲到了,对于我们选择的一个模型我们需要去评估这个模型的好坏。用来评估的数据集合我们叫做“测试集(testing set)”,在测试集上得到的误差叫做“测试误差(testing error)”,我们把测试误差当作是泛化误差的一个近似。由于我们在训练中是无法得到泛化的数据的,所以这些测试集是从样本真实分布中独立同分布采样得到的。那么测试集要满足什么条件呢?直观上我们可以想到,我们的目的是为了使得泛化性能更好,所以选取的测试集要尽可能的与训练集互斥,即测试样本尽量不要在训练集中出现,未在训练过程中使用过。举一个简单的类比例子来解释下为什么要这么做:比方说老师教授一门课,我们每个学生都当做一个学习器,平时的作业题看作是训练集,用于训练我们的解题能力。期末考试题就当作是测试集,来测试我们学习效果的好坏。可以想到,如果期末考试题都是没有做过的题目,那么考察的效果肯定比较好,学的好的学生就能得到更高的分数,学生之间学习效果的差异性就表现出来了;而如果拿作业原题来考察的话,大部分同学都能考的很好,却并不代表着他们都学的很好。从这个例子中我们可以比较形象的理解为什么测试集要这么选。

  我们知道,用于训练一个学习器,我们的数据是有限的,对于一个包含有m个样例的数据集D={(x1,y1),(x2,y2)......(xm,ym)}。我们既要训练又要测试,那么该怎么通过这个数据集来分别产生训练集S和测试集T呢?下面介绍几种常用的方法:

2.1 留出法(hold-out)

  第一种方法叫做留出法,这个方法比较的简单粗暴,它直接将数据集划分为两个互斥的集合,一个作为训练集S,一个作为测试集T。比如D有1000个数据,将其中700个作为训练集S,另外300个作为测试集T。但是这里的700和300可不是随便的划分的。我们要保证样本比例相似,从采样的角度来看就叫做分层采样(stratified samping),比如说数据集D中有500个正样本,500个负样本,正负样本比例为1:1,那么我们的训练集S和测试集T中应该正负样本比例也为1:1。这种想法也可以通过上面的例子来理解:老师同时教授几何和函数,它们在课程中同等重要,那么平时的训练量也是一半一半,考试的时候也是一半一半的出题。而不会出现平时大量的练习函数,考试疯狂的考察几何的情况。

  留出法存在一个问题就是即使在保证分层采样的前提下,不同的划分导致不同的训练集和测试集,模型评估结果就会有差别。解决方法是进行多次的随机划分,重复实验取平均值。留出法存在的另一个问题在与训练集和测试集比例的问题:如果训练集包含大多数样本,T比较下,无法准确的评估模型;如果测试集T多包含一些样本,S和T差别过大会降低评估结果的保真性。这里常见的做法是:将大约2/3 ~ 4/5的样本用于训练,剩余样本用于测试。

 

2.2 交叉验证法(cross validation)

  交叉验证法首先将数据集D分为k个大小相似的互斥子集,即D = D1 ∪ D2 ∪.....∪ Dk,Di ∩ Dj = 空集。每个子集都保持数据分布的一致性,即从D中通过分层采样得到。分割完毕之后,我们选取其中K-1个作为训练集,剩余的那个子集作为测试集。我们轮流把第k个子集作为训练集,这样便得到了k组训练/测试集,我们经过k次训练和测试,最终返回k个测试结果的均值。通常也把交叉验证法称作“k折验证法”。k通常取 5,10 20等。为了更形象理解,我们还拿上课的例子来解释。数据集D就是我们的题库,然后老师根据考试大纲把题库组成了k份试卷,这里每份试卷的题型分布和题量都是差不多的,然后把其中的k-1份试卷作为训练,1份作为期末考试。唯一的区别可能是我们考试不会考k次而已。这样是不是比较好理解一点呢?

  类比一下留出法我们就会发现,我们的子集分割也会出现多种的分割方式,不同的分割得到的k个子集也是不一样的。参照前面的方法,我们同样可以通过多次随机分割取平均值的方法来实现。比如我们随机分割p次,最终得到的方法为“p次k折交叉验证”。这里还得说下这个方法的特例情况,也就是当k=m时,每一个样例作为一个子集,这种方法被称作“留一法(Leave-One-Out,简称LOO)”,这种方法实际上跟用整个数据集D训练出来的模型很相似,评估结果也比较准确。但是存在一个巨大的问题:当数据集样本数量非常大时(一百万),计算的开销也是非常巨大的,这个是不能接受的。我们可以看到“没有免费午餐定理”在这里也同样的适用。

2.3 自助法(bootstrap sampling)

  在留出法和交叉验证法中,我们实际训练所使用的训练集都是要小于数据集D的,这样会引入一些由于训练样本规模不同而导致的评估误差。自助法便是针对于这个问题的:对于给定的有m个训练样本的数据集D,我们对其进行采样产生训练集D'。产生的方法如下:每次随机从D中挑选一个样本,拷贝放入D'中,然后挑选的样本重新放入D中,这个样本下次还有可能被选到。此步骤重复m次之后我们便得到了有m个数据的训练集D‘,然后将D\D'(在D中而不在D'中的数据)作为测试集。自助法在数据集较小,难以有效划分训练集和测试集时很有用。但是会带来一个问题,它改变了数据的原始分布(D和D'不一样),引入了估计误差。所以在数据量足够的情况下,留出法和交叉验证法更加常用

3.性能度量

衡量模型泛化能力的评价标准就是性能度量(performance measure).

3.1 错误率和精度

对于数据集D,错误率为分类错误样本数占样本总数的比例:

 

这里 I(x) = 0 如果x=0;I(x) = 1 如果x != 0;

对应的精度为分类正确样本数占样本总数的比例:

 

更一般性的,对于数据分布D和概率密度p(.),错误率和精度分别可以描述为:

p(x)为x的概率。

3.2 查准率,查全率和F1

对于二分类问题,可以将样例根据真实类别学习器预测类别分为:

真正例(true positive,TP):真实类别为真,预测类别为真;

假正例(false positive,FP):真实类别为假,预测类别为真;

真反例(true negative,TN):真实类别为假,预测类别为假;

假反例(false negative,FN):真实类别为真,预测类别为假。

查准率(precision) P:

    

 

查准率表示的是“检索出来的信息有多大的比例是用户感兴趣的”。

查全率(recall)R:

           

查全率表示的是“用户感兴趣的信息有多少被检索出来了”。如下图所示:

查准率和查全率是一对矛盾的度量,查准率高时查全率往往较低;而查全率较高时查准率往往较低。我们以查准率为纵轴,查全率为横轴作图的话就可以得到查准率-查全率曲线,简称“P-R曲线”:

 

在P-R图中,如果一个曲线完全将另一个曲线包住,则性能更优,如图中的A要优于C。如果发生交叉的话则很难判断孰优孰劣,于是便设计一个能够综合考虑查准率和查全率的性能度量。“平衡点”(Break-Even Point,BEP)便是这样一个度量,他是"查准率=查全率"的取值。则可以判断出上图中性能A > B > C。但是更加常用的是F1度量:

 

这里我们赋予P和R同样大小的权重,但是在有些应用中,对于查准率和查全率的重视程度有所不同。那么F1度量的一般形式为Fβ,定义为:

F1是基于查准率与查全率的调和平均定义的:

 

Fβ是加权调和平均:

 

β = 1时为标准F1,β > 1查全率有更大影响,β<1查准率有更大影响。

3.3 ROC和AUC

ROC全称“受试者工作特征”(Receiver Operating Characteristic)曲线。与P-R曲线不同,ROC曲线的纵轴是“真正例率”(True Positive Rate,TPR),横轴是“假正例率”(False Positive Rate,FPR)。定义如下:

显示ROC曲线的图称为“ROC图”:

但是现实任务中是用有限个测试样例来绘制ROC图,所以无法做到平滑,如下:

当我们通过ROC曲线来进行性能度量时,与P-R图一样,如果被一个曲线完全包住另一个曲线,则这个曲线对应的性能更好。如果两个曲线发生相交则很难判断孰优孰劣。此时我们可以通过AUC(Area Under ROC Curve)判断,即ROC曲线下面积

4.偏差与方差

偏差(bias):度量学习算法的期望预测与真实结果的偏离程度,刻画学习算法本身的拟合能力。

方差(variance):度量同样大小的训练集的变动所导致的学习性能的变化,刻画了数据扰动所造成的影响。

噪声(noise):表达了在当前的任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习本身的难度。

泛化误差:     E(f;D)  = bias2(x) + var(x) + ε2

下面的图可以很好的刻画偏差和方差的区别:

bias描述的是在训练集上的表现,即模型预测值与真实值的差别,简单点说就是如果在训练集上的bias越低那么拟合的越好,相应的模型会更加复杂,会带来过拟合的风险。

variance则描述的是在测试集上的表现,简单点说也就是在测试集上variance越低越好,相应的模型会更加简单,会导致欠拟合的发生。

由上可以看到偏差和方差是有冲突的,这个称为偏差-方差窘境(bias-variance dilemma).下面的图可以反映出这个:

可以看出,在训练集上并不是训练的越好,模型也就越好,关于这个内容后面还会再讲。

第二章的内容大概就讲这么多,主要讲了模型的评估与选择方面的内容,这个也是为我们之后的学习奠定一个基础,包括:误差分析,评估方法,性能度量,偏差与方差,其实很多东西还可以展开的非常广,可以细细的去品味。本章作业题的答案后续会补充上。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

       

 

posted @ 2017-10-15 14:17  zutterhao  阅读(626)  评论(0编辑  收藏  举报