第 2 章 模型评估与选择
《机器学习 Machine Learning (Chinese Edition)》Zhou Zhihua 周志华
2.1 经验误差与过拟合
错误率(error rate):
分类错误的样本数占样本总数的比例
即在 个样本中有 个样本分类错误,则错误率
精度(accuracy):
1 减错误率
精度
误差(error):
-
训练集上的误差称为训练误差(training error)或经验误差(empirical error)
-
在新样本上的的误差称为泛化误差(generalization error)
⚠ 在训练集上表现很好甚至完美的学习器,不能保证对新样本也能表现很好,大多数情况下这种学习器在新样本下的表现都不好。
过拟合(overfitting):学习器已经把训练样本学得“太好”,把一些训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,导致泛化能力下降
欠拟合(underfitting):对训练样本的一般性质尚未学好
导致过拟合的因素:
- 学习能力过强,以至于把训练样本所包含的不太一般的特性都学到了
导致欠拟合的因素:
- 学习能力低下
学习能力是否“过强”是由学习算法和数据内涵共同决定的
模型选择(model selection):一个问题有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型
2.2 评估方法
通常可通过实验测试来对学习器的泛化误差进行评估并进而做出选择
测试集(testing set):测试学习器对新样本的判别能力
测试误差(testing error):作为泛化误差的近似
通常假设测试样本也是从样本真实分布中独立同分布采样而得
⚠ 注意:测试集应该尽可能与训练集互斥,即测试样本尽量不在训练集中出现、未在训练过程中使用过
从训练集得到测试集的方法:通过对已有的数据集 进行适当的处理,从中产生出训练集 和测试集 ,下面有几种常用做法:
2.2.1 留出法
留出法(hold-out):直接将数据集 划分为两个互斥的集合,其中一个集合作为训练集 ,另一个作为测试集 ,即:
在 上训练出模型后,用 来评估其测试误差,作为对泛化误差的估计。
以二分类任务为例,假定 包含 个样本,将其划分为 包含 个样本, 包含 个样本,
用 进行训练后,如果模型在 上有 个样本分类错误,那么其错误率为 ,
相应的,精度为
⚠ 注意:训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务重至少要保证样本的类别比例相似。
如果从采样(sampling)的角度来看待数据集的划分过程,则保留类别比例的采样方式通常称为分层采样(stratified sampling)
若 、 中样本类别比例差别很大,则误差估计将由于训练/测试数据分布的差异而产生偏差
⚠ 注意:即便在给定训练/测试集的样本比例后,仍存在多种划分方式对初始数据集 进行分割。这些不同的划分将导致不同的训练/测试集,相应的,模型评估的结果也会有差别。
✅ 在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果
留出法有一个缺点:若令训练集 包含绝大多数样本,则训练出的模型可能更接近于用 训练出的模型,但由于 比较小,评估结果可能不够稳定准确;若令测试集 多包含一些样本,则训练集 与 差别更大了,被评估的模型与用 训练出的模型相比可能有较大差别,从而降低了评估结果的保真性(fidelity)
这个问题没有完美的解决方案,常见的做法是将大约 2/3 ~ 4/5 的样本用于训练,剩余样本用于测试
2.2.2 交叉验证法
交叉验证法(cross validation):先将数据集 划分为 个大小相似的互斥子集,即
每个子集 都尽可能保持数据分布的一致性,即从 中通过分层采样得到
然后每次用 个子集的并集作为训练集,余下的那个子集作为测试集;这样就可以获得 组训练/测试集合,从而可以进行 次训练和测试,最终返回的是这 个测试结果的均值
显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于 的取值,为强调这一点,通常把交叉验证法称为** 折交叉验证**(k-fold cross validation)
最常用的取值是 10,此时称为 10 折交叉验证,其他常用的 值有 5、20 等
与留出法类似,将数据集 划分为 个子集同样存在多种划分方式
为减小因样本划分不同而引入的差别, 折交叉验证通常要随机使用不同的划分重复 次,最终的评估结果是这 次 折交叉验证结果的均值,例如常见的有“10 次 10 折交叉验证”
“10 次 10 折交叉验证”与“100 次留出法”都是进行了 100 次训练/测试
✅ 假定数据集 中包含 个样本,若令 ,则得到了交叉验证法的一个特例:留一法(Leave-One-Out)
-
优点:
- 显然,留一法不受随机样本划分方式的影响,因为 个样本只有唯一的方式划分为 个子集 —— 每个子集包含一个样本
- 留一法使用的的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用 训练出的模型很相似,评估结果往往被认为比较准确
-
缺点:
- 在数据集比较大时,训练 个模型的计算开销可能是难以忍受的(例如数据集包含一百万个样本,则需训练一百万个模型),而这还是在未考虑算法调参的情况下
- 另外,留一法的估计结果也未必永远比其他评估方法准确;“没有免费的午餐”定理对实验评估方法同样适用
2.2.3 自助法
我们希望评估的是用 训练出的模型,
但在留出法和交叉验证法中,由于保留了一部分样本用于测试,因此实际评估的模型所使用的训练集比 小,这必然会引入一些因训练样本规模不同而导致的估计偏差
留一法受训练样本规模变化的影响较小,但计算复杂度又太高了
希望有一种办法既能减少训练样本规模不同造成的影响,又能比较高效地进行实验估计,这就是自助法
自助法(bootstraping)直接以自助采样法(bootstrap sampling)为基础。
- 给定包含 个样本的数据集 ,我们对它进行采样产生数据集每次随机从 中挑选一个样本,将其拷贝放入 ,然后再将该样本放回初始数据集 中,使得该样本在下次采样时仍有可能被采到;这个过程重复执行 次后,我们就得到了包含 个样本的数据集 ,这就是自助采样的结果
显然, 中有一部分样本会在 中多次出现,而另一部分样本不出现
可以做一个简单的估计,样本在 次采样中始终不被采到的概率是 取极限得到:
即通过自助采样,初始数据集 中约有 的样本未出现在采样数据集 中
于是我们可将 用作训练集, 用作测试集
表示集合减法
这样,实际评估的模型与期望评估的模型都使用 个训练样本,而我们仍有数据总量约 的、没在训练集中出现的样本用于测试
这样的测试结果亦称为包外估计(out-of-bag estimate)
-
优点:
- 自助法在数据集较小、难以有效划分训练/测试集时很有用
- 自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处
-
缺点:
- 自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差
- 因此,在初始数据量足够时,留出法和交叉验证法更常用一些
2.2.4 调参与最终模型
大多数学习算法都有些参数(parameter)需要设定,参数配置不同,学得模型的性能往往有显著差别
因此,在进行模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定,这就是通常所说的参数调节或简称调参 (parameter tuning)
调参和算法选择没什么本质区别:对每种参数配置都训练出模型,然后把对应最好模型的参数作为结果
这样的考虑基本是正确的,但有一点需注意:学习算法的很多参数是在实数范围内取值,因此,对每种参数配置都训练出模型来是不可行的
✅ 现实中常用的做法,是对每个参数选定一个范围和变化步长,例如在[0, 0.2]范围内以 0.05 为步长,则实际要评估的候选参数值有 5 个,最终是从这 5 个候选值中产生选定值
显然,这样选定的参数值往往不是“最佳”值,但这是在计算开销和性能估计之间进行折中的结果,通过这个折中,学习过程才变得可行
事实上,即便在进行这样的折中后,调参往往仍很困难。可以简单估算一下:假定算法有 3 个参数,每个参数仅考虑 5 个候选值,这样对每一组训练/测试集就有 53 = 125 个模型需考察;很多强大的学习算法有大量参数需设定,这将导致极大的调参工程量,以至于在不少应用任务中,参数调得好不好往往对最终模型性能有关键性影响
例如大型“深度学习”模型甚至有上百亿个参数
⚠ 给定包含 个样本的数据集 ,在模型评估与选择过程中由于需要留出一部分数据进行评估测试,事实上我们只使用了一部分数据训练模型。因此,在模型选择完成后,学习算法和参数配置已选定,此时应该用数据集 重新训练模型。这个模型在训练过程中使用了所有 个样本,这才是我们最终提交给用户的模型
⚠ 我们通常把学得模型在实际使用中遇到的数据称为测试数据,为了加以区分,模型评估与选择中用于评估测试的数据集常称为验证集(validation set)。例如,在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参
2.3 性能度量
性能度量(performance measure):衡量模型泛化能力的评价标准
性能度量反映了任务需求,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的“好坏”是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求
在预测任务中,给定样例集 其中 是示例 的真实标记
要评估学习器 的性能,就要把学习器预测结果 与真实标记 进行比较
回归任务最常用的性能度量是均方误差(mean squared error):
更一般的,对于数据分布 和概率密度函数 ,均方误差可描述为:
下面主要介绍分类任务中常用的性能度量
2.3.1 错误率与精度
分类任务中最常用的两种性能度量:
-
错误率
-
精度
既适用于二分类任务,也适用于多分类任务
错误率是分类错误的样本数占样本总数的比例,精度则是分类正确的样本数占样本总数的比例
对样例集 ,分类错误率定义为:
精度则定义为:
更一般地,对于数据分布 和概率密度函数 ,错误率与精度可分别描述为:
2.3.2 查准率、查全率与 F1
错误率和精度虽常用,但并不能满足所有任务需求,以西瓜问题为例,假定瓜农拉来一车西瓜,我们用训练好的模型对这些西瓜进行判别,显然,错误率衡量了有多少比例的瓜被判别错误。但是若我们关心的是“挑出的西瓜中有多少比例是好瓜”,或者“所有好瓜中有多少比例被挑了出来”,那么错误率显然就不够用了,这时需要使用其他的性能度量
类似的需求在信息检索、Web 搜索等应用中经常出现,例如在信息检索中,我们经常会关心“检索出的信息中有多少比例是用户感兴趣的” “用户感兴趣的信息中有多少被检索出来了”。查准率(precision)与查全率(recall)是更为适用于此类需求的性能度量
查准率亦称“准确率”,查全率亦称“召回率”
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative)四种情形,令 、 、 、 分别表示其对应的样例数,则显然有 分类结果的混淆矩阵(confusion matrix)如表 2.1 所示
查准率 与查全率 分别定义为:
✅ 查准率和查全率是一对矛盾的度量。一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低
例如,若希望将好瓜尽可能多地选出来,则可通过增加选瓜的数量来实现,如果将所有西瓜都选上,那么所有的好瓜也必然都被选上了,但这样查准率就会较低;若希望选出的瓜中好瓜比例尽可能高,则可只挑选最有把握的瓜,但这样就难免会漏掉不少好瓜,使得查全率较低。
通常只有在一些简单任务中,才可能使查全率和查准率都很高
在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面的是学习器认为“最可能”是正例的样本,排在最后的则是学习器认为“最不可能”是正例的样本.按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率.以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称P-R曲线,显示该曲线的图称为“P-R图”
P-R 图直观地显示出学习器在样本总体上的查全率、查准率
✅ 学习器性能比较:
-
若一个学习器的 P-R 曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者,例如图 2.3 中学习器 A 的性能优于学习器 C
-
如果两个学习器的 P-R 曲线发生了交叉,例如图 2.3 中的 A 与 B ,则难以一般性地断言两者孰优孰劣,只能在具体的查准率或查全率条件下进行比较
然而,在很多情形下,人们往往仍希望把学习器 A 与 B 比出个高低。这时一个比较合理的判据是:
- 比较 P-R 曲线下面积的大小,它在一定程度上表征了学习器在查准率和查全率上取得相对“双高”的比例
但这个值不太容易估算,因此,人们设计了一些综合考虑查准率、查全率的性能度量
平衡点(Break-Event Point,BEP):查准率与查全率相等时的取值,例如图 2.3 中学习器 C 的 BEP 是 0.64 ,而基于 BEP 的比较,可认为学习器 A 优于 B
度量:相比平衡点更常用
在一些应用中,对查准率和查全率的重视程度有所不同
例如在商品推荐系统中,为了尽可能少打扰用户,更希望推荐内容确是用户感兴趣的,此时查准率更重要;而在逃犯信息检索系统中,更希望尽可能少漏掉逃犯,此时查全率更重要
度量的一般形式 —— ,能让我们表达出对查准率/查全率的不同偏好,它定义为
其中 度量了查全率对查准率的相对重要性:
-
退化为标准的
-
时查全率有更大的影响
-
时查准率有更大的影响
注:
度量基于查准率与查全率调和平均(harmonic mean)定义:
则是加权调和平均:
与算术平均()和几何平均()相比,调和平均更重视较小值
⏩ 很多时候我们有多个二分类混淆矩阵,例如进行多次训练/测试,每次得到一个混淆矩阵;或是在多个数据集上进行训练/测试,希望估计算法的“全局”性能;甚或是执行多分类任务,每两两类别的组合都对应一个混淆矩阵;……
总之,我们希望在 个二分类混淆矩阵上综合考察查准率和查全率
一种直接的做法是先在各混淆矩阵上分别计算出查准率和查全率,记为 ,再计算平均值,这样就得到宏查准率(macro-)、宏查全率(macro-),以及相应的宏 (macro-):
还可先将各混淆矩阵的对应元素进行平均,得到 、 、 、 的平均值,分别记为 、 、 、 ,再基于这些平均值计算出微查准率(micro-)、微查全率(micro-)和微(micro-):
2.3.3 ROC 与 AUC
很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值则分为正类,否则为反类
例如,神经网络在一般情形下是对每个测试样本预测出一个 [0.0, 1.0] 之间的实值,然后将这个值与 0.5 进行比较,大于 0.5 则判为正例,否则为反例
这个实值或概率预测结果的好坏,直接决定了学习器的泛化能力
实际上,根据这个实值或概率预测结果,我们可将测试样本进行排序,“最可能”是正例的排在最前面,“最不可能”是正例的排在最后面。这样,分类过程就相当于在这个排序中以某个截断点(cut point)将样本分为两部分,前一部分判作正例,后一部分则判作反例
在不同的应用任务中,我们可根据任务需求来采用不同的截断点,例如若我们更重视“查准率”,则可选择排序中靠前的位置进行截断;若更重视“查全率”,则可选择靠后的位置进行截断
因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,或者说,“一般情况下”泛化性能的好坏
ROC 曲线则是从这个角度出发来研究学习器泛化性能的有力工具
✅ 受试者工作特征(Receiver Operating Characteristic,ROC)曲线:根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出真正例率(True Positive Rate,TPR)与假正例率”(False Positive Rate,FPR),分别以它们为横、纵坐标作图,就得到了 “ROC 曲线”
TPR、FPR 两者分别定义为:
真正例率是指预测结果中真正例占测试集中正例的比率
假正例率是指预测结果中假正例占测试集中反例的比率
显示 ROC 曲线的图称为“ROC图”
图2.4(a)给出了一个示意图,显然,对角线对应于“随机猜测”模型,而点 (0, 1) 则对应于将所有正例排在所有反例之前的“理想模型”
进行学习器的比较时,与 P-R 图相似,若一个学习器的 ROC 曲线被另一个学习器的曲线完全“包住“则可断言后者的性能优于前者;若两个学习器的 ROC 曲线发生交叉,则难以一般性地断言两者孰优孰劣
此时如果一定要进行比较,则较为合理的判据是比较 ROC 曲线下的面积,即 AUC(Area Under ROC Curve),如图 2.4 所示
从定义可知,AUC 可通过对 ROC 曲线下各部分的面积求和而得。假定 ROC 曲线是由坐标为 的点按序连接而形成 参见图 2.4(b) ,则 AUC 可估算为:
形式化地看,AUC 考虑的是样本预测的排序质量,因此它与排序误差有紧密联系
给定 个正例和 个反例,令 和 分别表示正、反例集合,则排序“损失”(loss)定义为:
即考虑每一对正、反例,若正例的预测值小于反例,则记一个“罚分”,若相等,则记 0.5 个“罚分”
容易看出, 对应的是 ROC 曲线之上的面积:若一个正例在 ROC 曲线上对应标记点的坐标为 ,则 恰是排序在其之前的反例所占的比例,即假正例率。因此有:
额外参考资料:机器学习基础(1)- ROC曲线理解
2.3.4 代价敏感错误率与代价曲线
在现实任务中常会遇到这样的情况:不同类型的错误所造成的后果不同
例如在医疗诊断中,错误地把患者诊断为健康人与错误地把健康人诊断为患者,看起来都是犯了 “一次错误”,但后者的影响是增加了进一步检查的麻烦,前者的后果却可能是丧失了拯救生命的最佳时机
再如,门禁系统错误地把可通行人员拦在门外,将使得用户体验不佳,但错误地把陌生人放进门内,则会造成严重的安全事故
为权衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价“(unequal cost)
以二分类任务为例,我们可根据任务的领域知识设定一个“代价矩阵" (cost matrix),如表2.2所示。其中 表示将第 类样本预测为第 类样本的代价
-
一般来说,
-
若将第 0 类判别为第 1 类所造成的损失更大,则
-
损失程度相差越大, 与 值的差别越大
一般情况下,重要的是代价比值而非绝对值,例如 与 所起效果相当
回顾前面介绍的一些性能度量可看出,它们大都隐式地假设了均等代价,例如式 (2.4) 所定义的错误率是直接计算“错误次数”,并没有考虑不同错误会造成不同的后果
在非均等代价下,我们所希望的不再是简单地最小化错误次数,而是希望最小化“总体代价”(total cost)
若将表 2.2 中的第 0 类作为正类、第 1 类作为反类,令 与 分别代表样例集 的正例子集和反例子集,则“代价敏感”(cost-sensitive)错误率为:
类似的,可给出基于分布定义的代价敏感错误率,以及其他一些性能度量如精度的代价敏感版本
若令 中的 、 取值不限于 0、1 ,则可定义出多分类任务的代价敏感性能度量
✅ 在非均等代价下,ROC 曲线不能直接反映出学习器的期望总体代价,而“代价曲线”(cost curve)则可达到该目的
➡ 代价曲线图的横轴是取值为[0, 1]的正例概率代价:
其中 是样例为正例的概率
⬆ 代价曲线的纵轴是取值为[0, 1]的归一化代价:
其中 是式 (2.19) 定义的假正例率, 是假反例率
代价曲线的绘制很简单:
ROC曲线上每一点对应了代价平面上的一条线段,设 ROC 曲线上点的坐标为 ,则可相应计算出 ,然后在代价平面上绘制一条从 到 的线段,线段下的面积即表示了该条件下的期望总体代价;如此将 ROC 曲线上的每个点转化为代价平面上的一条线段,然后取所有线段的下界,围成的面积即为在所有条件下学习器的期望总体代价,如图2.5所示