机器学习入门(二):模型评估与选择

0x00 简介

这节我们将会学到如何评估和选择一个机器学习模型

0x01 正文

误差

通常我们把分类错误的样本数占样本总数的比例称为错误率(error rate)。更一般的,我们把学习器的预测输出与样本的真实输出之间的差异称为误差。学习器在训练集上的误差称为训练误差,在新样本上的误差称为泛化误差。显然,我们希望得到泛化误差最小的学习器。然而,我们能做的只是让训练误差最小化。TIM截图20180327173623.png

通常将学习方法对未知数据的预测能力称为泛化能力

过拟合和模型选择

当假设空间含有不同复杂度的模型时,就要面临模型选择问题。我们可以知道测试误差小的模型往往泛化误差也比较小。但是如果一味追求提高对训练数据的预测能力,所选模型的复杂度往往很高,这种现象称为过拟合。过拟合是指学习时选择的模型包含参数过多,以致于出现这一模型对已知数据预测得很好,但对未知数据预测得很差的现象。可以说模型选择旨在避免过拟合,下面是一个例子

TIM截图20180327174513.png

下面这个图,我们可以看到,训练误差和测试误差随着模型复杂度的变化
TIM截图20180327175030.png
我们可以看到,模型复杂度较小时,训练误差和测试误差都很大,这种现象叫做欠拟合。 随着模型复杂度的增大,训练误差和测试误差会达到一个最优点,此时模型最优,复杂度适当。当模型复杂度继续增大时,发生过拟合现象,训练误差减小趋向于0,但是测试误差一直在增大。
理想来说,最优的解决方案就是找个泛化误差最小的模型不就得了呗。但是,我们无法直接获得泛化误差,而训练误差又由于过拟合现象的存在而不适合作为标准。那么该怎么进行模型评估和选择呢?

正则化与交叉验证

正则化

模型选择的典形方法时正则化(regularizaion).正则化是结构风险最小化策略的实现。是在经验风险上加一个正则化项,或罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。常用的有l1,l2 范数TIM截图20180327180837.png
正则化符合奥卡姆剃刀(Occam’s razor)原理,能够很好地解释已知数据并且十分简单才是最好的模型!!!

交叉验证

另一种常用的模型选择方法是交叉验证(cross validation)。如果样本充足,进行模型选择的一种简单方法是随机地将数据集切成三部分,分别为
训练集(training set),验证集(validation set),测试集(test set)。训练集用来训练模型,验证集用于模型选择,测试集用于最终对学习方法的评估。但是许多实际应用中数据是不充足的,为了选择好的模型,可以采用交叉验证方法。

首先,来想一个问题,测试样本为什么要尽可能不出现在训练集中呢?为理解这一点,试想一下这样一个场景。老师出了10道习题做为月考,等到期末考试时候又出了10道一摸一样的题,这样还能反应出同学们的能力吗?答案显而易见,是不行的。回到我们的问题上,我们希望得到泛化性能强的模型,就好比是学生对课程学得很好,有了举一反三的能力。而测试样本被用作训练了,则得到的是过于‘乐观’的结果。接下来我们介绍几种划分数据集的方法。

留出法

留出法直接将数据集D划分为两个互斥的集合,训练集S和测试集T。在S上训练模型后,用T来评估测试误差,作为对泛化误差的估计。

交叉验证法

用得最多的是交叉验证法,先将数据集D划分为K个大小类似的互斥子集。每个子集都尽可能保持数据分布的一致性。然后每次用K-1个子集用作训练集,余下的那个子集作为测试集;这样就可以获得K组训练/测试集。从而经过K次训练和测试,返回K个测试结果的均值。通常把交叉验证称为K折交叉验证(K-fold cross validation). k最常取10.
TIM截图20180327202443.png

调参

大多数学习算法都有些参数需要设定,参数配置不同,模型的性能往往有显著差别。因此,在进行模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的调参
现实生活中,我们不可能把每种参数配置都训练一遍,这样太耗时间了。常用的做法时,对每一个参数选定一个范围和变化步长,例如在[0.,0.2]范围内,以0.05为步长,这样实际要评估的候选参数值有五个。显然,这样选定的参数值往往不是最佳值,但这是计算开销和性能估计之间折中的结果

性能度量

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

错误率与精度

错误率和精度是最常用的两种性能度量
错误率是分类错误的样本数占样本总数的比例
TIM截图20180327204931.png

查准率,查全率与F1

错误率和精度虽然常用,但并不能满足所有任务需求,如果我们想了解正例中有多少被挑选出来了,显然错误率派不上用场,我们需要其他性能度量。首先来看一下混淆矩阵TIM截图20180327205404.png
查准率: 预测的正例中真正的正例的比例,换句话说,你认为的好人有多少是好人
查全率: 真实情况中真正的正例的比例,简单来说,所有好人中认出的好人的个数

查准率和查全率是一对矛盾的度量。举个例子,如果你认为好人都是很有把握的好人的话(查准率越高),可能一些你不是特别确定的好人就会被遗漏了(查全率变低)。但是如果你想尽可能找出更多的好人,使得查全率越高,一些你不是特别把握的人就被误以为是好人了,所以导致查准率变低。下面是P-R曲线
TIM截图20180327215444.png

P-R 图直观地显示出学习器在样本总体上的查全率和查准率。如果一个学习器的P-R曲线把另一个完全包住的话,那么就可以认为这个学习器性能表现更好。
平衡点: 综合考虑查准率和查全率的性能度量
TIM截图20180327220233.png

ROC与AUC

很多学习器是为了测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)比较,如果大于阈值为正类,小于为反类。我们可以想象有一条队伍,阈值相当于截断点,正类排前面,反类排后面。如果我们更重视查准率,可以把截断点定前面一点。如果重视查全率,可以把截断点定偏后一点。排序本身的质量好坏,体现了综合考虑学习器在不同任务的期望泛化性能的好坏,或者说,一般情况下,泛化性能的好坏。ROC曲线则是从这个角度出发来研究学习器的泛化性能!!
TIM截图20180327221457.png
TIM截图20180327221528.png
与P-R图相似,若一个学习器的ROC曲线被另一个完全包住,则可认为后者性能优于前者。
TIM截图20180327221906.png

对角线可以认为随机猜测(50%概率)
AUC就是ROC曲线下的面积,可认为是泛化能力,面积越大,泛化能力越强。
简单来说:查准率与查全率的抉择可以通过调整阈值(截断点)的大小(位置)。而ROC曲线就展现了处于各个阈值(截断点)下,模型的性能。

0x02 总结

这一节,我们详细地介绍了模型评估和选择的方法

  • 误差概念
  • 模型选择:过拟合,正则化和交叉验证
    • 交叉验证: 留出法,K折交叉验证
  • 模型评估:性能度量
    • 错误率与精度
    • 查准率,查全率,F1
    • ROC曲线