第二章 模型评估与选择
2.1 经验误差与过拟合
错误率 E(error rate)
E = a / m = 样本分类错误 / 样本总数
精度(accuracy)
精度 = 1 - E
误差(error)
- 训练误差(training error) / 经验误差(empirical error): 学习器在训练集上的误差
- 泛化误差(generalization): 学习器在新样本上的误差
拟合
- 过拟合: 训练样本学的过好,泛化性能变差
- 欠拟合: 学习能力低下
2.2 评估选择
用s实验测试来对学习器的泛化误差进行评估
需要一个训练集训练学习器,一个测试集测试学习器
已知一个包含m个样例的数据集:
既要训练又要测试
测试集尽可能与训练集互斥
以下为几种从数据集 D 产生训练集和测试集的方法
2.2.1 留出法(hold-out)
直接把数据集D划分为两个互斥的集合,
其中一个作为训练集S,另一个作为测试集T
训练集和测试集的划分要尽可能保持数据分布的一致性,
采用分层采样(stratified sampling)
缺点:
- 若令训练集S包含大多数样本则训练出的模型更接近用D训练出的模型,但T会过小,评估结果不够准确。
- 若令测试集T包含多一些样本,则训练集S与D差别更大,被评估的模型与用D训练的模型可能有较大差别。
常见做法:2 / 3 ~ 4 / 5样本用于训练,剩余用来测试。
2.2.2 交叉验证法(cross validation)
将数据集D划分为k个大小相似的互斥子集:
每个子集都从D中通过分层采样获取,尽可能保持数据分布的一致性。
用 k-1 个子集的并集作为训练集,剩下的子集作为测试集;
可获得 k 组训练/测试集,进行 k 次训练和测试,最终返回 k 次测试结果的均值。
结果的稳定性和保真性取决于k的取值,故又称 "k折交叉验证"(k-fold cross validation)
将数据集D划分为k个子集存在多种划分方式
为减少因样本划分不同而引入的差别,需采用不同的划分方式p次
结果为p次k折交叉验证的均值
留一法(Leave-One-Out,LOO): 假定数据集D包含m个样本,令k=m
- 优点: 被实际评估的模型与期望用D训练的模型很相似,结果往往比较准确。
- 缺点: 数据集较大时训练m个模型的计算开销难以忍受,估计结果也未必比其它评估方法准确。
2.2.3 自助法(bootstrapping)
给定包含m个样本的数据集D,采样产生D'
自助采样(bootstrap sampling):
每次随机从D中挑选一个样本,拷贝放入D',然后再将该样本放回D中
重复上述过程m次,得到包含m个样本的D'。
样本在m次采样中始终不被采到的概率是 ,取极限得:
即通过自助采样,初试数据集D中约有36.8%的样本未出现在D'中,
用D'作训练集,D\D'作测试集。
- 优点:
- 数据集较小、难以有效划分训练/测试集时很有用。
- 能从初始数据集中产生多个不同的训练集,对集成学习等有很大好处。
- 缺点:
- 改变了初始数据集的分布,会引入估计偏差。
- 数据量足够时,常用留出法和交叉验证法。
2.2.4 调参与最终模型
验证集(validation set):
研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型的泛化能力,
把训练数据另外划分为训练集和验证集,基于验证集上的性能来进行模型选择和调参。
2.3 性能度量(performance measure)
什么样的模型是好的,不仅取决于算法和数据,还取决于任务需求
在预测任务中,给定样例集
其中 是示例 的真实标记
要评估学习器 f 的性能,看要把学习器预测结果f(x)和y进行比较
均方误差(mean squared error):
- 离散:
对于数据集D:
- 连续:
对于数据分布D和概率密度函数p(·):
2.3.1 错误率与精度
错误率: 分类错误的样本数占样本总数的比例
精度: 分类正确的样本数占样本总数的比例
其中II(·)记号:括号内的若符合则记为1,否则记0。
2.3.2 查准率(precision)、查全率(recall)与F1
对于二分类问题,可以根据真实类别与学习器预测类别的组合分为:
真正例(True Positive)、假正例(False Positive)、
真反例(True Negative)、假反例(False Negative)
可得TP+FP+TN+FN=样例总数
真实情况 | 预测结果 | |
---|---|---|
正例 | 反例 | |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
查准率P(预测正例中真实正例的比率):
查全率R(真实正例中预测正例的比率):
查全率与查准率是一对矛盾的度量,
以查全率为横轴,查准率为纵轴可得P-R曲线
P-R曲线与平衡点示意图:
P-R图能直观的显示学习器在样本总体上的查全率、查准率,
进行比较时,若一个学习器的P-R曲线被另一个学习器的曲线完全包住,
则后者的性能优于前者。
很多时候无法完全包住,会产生交叉
此时需要综合考虑查准率和查全率的性能度量:
平衡点(Break-Even Point,BEP):
查准率=查全率 的取值
F1度量: 调和平均
度量:加权调和平均
多数时候会有多个二分类混淆矩阵
一种做法:
宏查准率(macro-P)
宏查全率(macro-R)
宏F1(macro-F1)
另一种做法:
先对混淆矩阵的对应元素求平均,得到TP、FP、TN、FN的平均值:
记为:
再计算:
微查准率(micro-P)
微查全率(macro-R)
微F1(macro-F1)
2.3.3 ROC与AUC
学习器为测试样本产生一个实值或概率预测,然后将预测值与分类阈值(threshold) 比较,
大于阈值则为正类,小于阈值则为反类
根据实值或概率预测可以将测试样本进行排序,
"最可能"是正例的排在最前面,"最不可能"是正例的排在最后面,
分类过程即相当于在排序中以某个截断点(cut point) 将样本分为两部分,
前一部分为正例,后一部分为反例
可根据不同任务需求选择截断点:
- 若更重视查准率,截断点靠前
- 若更重视查全率,截断点靠后
ROC:受试者工作特征(Receiver Operating Characteristic)
纵轴:真正例率(True Positive Rate , TPR)
横轴:假正例率(False Positive Rate , FPR)
对角线对应于随机猜测模型;
(0,1)点对应于所有正例都在反例之前的理想模型
现实任务为有限样例,只能绘制图(b)所示的近似ROC曲线。
绘制方法:
- 给定个正例和个反例,
- 根据学习器预测结果进行排序,
- 把分类阈值调到最大值,即所有样例均预测为反例,此时TPR和FPR均为0,即原点
- 然后将分类阈值依次设置为每一个样例的预测值,即依次将每个样例划分为正例
- 设前一个点坐标为(x,y)
- 若为真正例,当前点坐标为
- 若为假正例,当前点坐标为
与P-R图类似,若一个学习器的ROC曲线被另一个学习器的曲线完全包住,
则后者的性能优于前者。
若曲线产生交叉,可以用AUC(Area Under ROC Curve,ROC曲线下的面积)进行比较。
AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系
给定个正例和个反例,令和分别表示正、反例集合
则有
排序损失(loss):
指的是正例样本,
指的是反例样本,
指的是学习器给出的概率预测结果
真正例率的分母是,假正例率的分母是
ROC曲线图可看成矩形分割成个小矩形,则:
为ROC曲线上部分的面积
AUC为ROC曲线下部分的面积
2.3.4 代价敏感错误率与代价曲线
为权衡不同类型错误所造成的不同损失,可为错误赋予"非均等代价"(unequal cost)
真实类别 | 预测类别 | |
---|---|---|
第0类 | 第1类 | |
第0类 | 0 | cost_01 |
第1类 | cost_10 | 0 |
:表示将第i类样本预测为第j类样本的代价
一般来说,
令第0类作为正类,第1类作为反类,
作为正例子集,作为反例子集。
代价敏感(cost-sensitive)错误率:
非均等条件下,ROC曲线不能直接反映学习器的期望总体代价,
而代价曲线(cost curve) 可以。
- 横轴:正例概率代价,取值范围[0,1]
其中,p为样例为正例的概率
- 纵轴:归一化代价,取值范围[0,1]
其中FPR是假正例率,FNR=1-TPR是假反例率。
代价曲线的绘制:
- ROC曲线上的每一点对应了代价平面上的一条线段
- 设ROC曲线上的一点为(FPR,TPR),则可计算出FNR
- 代价平面上绘制一条线段,起始点:(0,FPR),终点:(1,FNR)
- 这条线段下方的面积代表着在该点条件下的期望总体代价
- 将ROC曲线上的所有点都转化为代价曲线上的线段
- 取所有线段的下界即为代价曲线
- 围成的面积即为在所有条件下学习器的期望总体代价
2.4 比较检验
对学习器性能进行评估
- 希望比较泛化性能,但实验只能获得测试集上的性能,与真实的结果未必相等
- 测试集上的性能与测试集的选择有很大关系:
- 不同大小的测试集,结果可能不同
- 相同大小但包含的测试样例不同,结果可能不同
- 机器学习算法本身具有一定的随机性,即便是相同参数在同样的测试集上多次运行,其结果也会有不同
故通过统计假设检验(hypothesis test)来进行学习器性能比较
先介绍两种最基本的假设检验,默认以错误率为性能度量,用表示。
2.4.1 假设检验
现实中我们只能获取测试错误率,
而不知道其泛化错误率
二者未必相同,但接近的可能性比较大,因此可通过测试错误率估推出泛化错误率。
泛化错误率为的学习器在一个样本上犯错的概率是;
测试错误率意味着在m个测试样本中有个被误分类。
假设测试样本是从样本总体分布中独立采样而得,
那么泛化错误率为的学习器将其中m'个样本误分类
其余样本全部分类正确的概率为
其中,
由此可估算出学习器刚好将个样本误分类的概率为:
这也表示了在m个样本的测试集上,泛化错误率为的学习器被测得测试错误率为的概率。
对于给定的(做实验得到的)测试错误率,由可得,在时取最大值,符合二项分布(binomial)
如下图所示,取,则10个样本中测得3个被误分类的概率最大。
使用二项检验(binomial test)对 (泛化错误率是否不大于3)的假设进行检验
考虑假设 ,
在 的概率内所能观测到的最大错误率如下式(为置信度(confidence),对应上图非阴影部分):
(s.t.是“subject to”的简写,表示在右式条件满足的时候左式才成立)
这里公式还有疑问
若测试错误率 小于临界值 ,
则根据二项检验可得:
- 在的显著度下,假设 不能被拒绝
即在的置信度下可认为学习器的泛化错误率不大于 - 否则,拒绝该假设,即在的显著度下认为泛化错误率大于
大多数时候我们并非只做一次留出法估计,而是通过多次重复留出法或交叉验证法等进行多次训练/测试,会得到多个测试错误率,此时可用"t检验"。
假定我们得到k个测试错误率,,则此时有:
- 平均测试错误率:
- 方差:
考虑到k个测试错误率可看作泛化错误率 的独立采样,则有变量:
服从自由度为 k-1 的t分布
如下图:
对于假设 和显著度,
可以计算当测试错误率为时,在概率内能观测到的最大错误率,即临界值。
如上图所示,两边阴影部分各有的面积
阴影部分范围分别为
若 位于临界值范围内内,则不能拒绝假设
下表给出一些常用临界值:
a | k | ||||
---|---|---|---|---|---|
2 | 5 | 10 | 20 | 30 | |
0.05 | 12.706 | 2.776 | 2.262 | 2.093 | 2.045 |
0.10 | 6.314 | 2.132 | 1.833 | 1.729 | 1.699 |
上面是对于单个学习器泛化性能的假设进行检验,
而在现实中我们需要对不同学习器的性能进行比较,
下面介绍此类情况的假设检验方法。
2.4.2 交叉验证t检验
对两个学习器A和B,记使用k折交叉验证法得到的测试错误率分别为和,
其中,表示在相同的第i折训练/测试集上得到的结果。
可用k折交叉验证"比较t检验"(paired t-tests)进行比较检验。
基本思想:若两个学习器性能相同,则使用相同的训练/测试集得到的测试错误率应相同,即
具体做法:
- 对每对结果做差,
- 若两个学习器性能相同,则差值的均值应为0
- 根据差值对"学习器性能相同,即"的假设进行 t 检验
- 计算出差值的均值和方差
- 在显著度下:
- 若变量小于临界值,则假设不能被拒绝,即学习器性能没有显著差别
- 否则可以认为两个学习器性能有显著差别,且平均错误率较小的性能更优
( 指自由度为k-1的 t 分布的上侧 分位点 )
对于一个有效的假设检验,应保证测试错误率都是泛化错误率的独立采样,
但在上述过程中,所采用的训练集在不同轮次会有一定程度的重叠,故测试错误率并不独立,
为缓解这一问题,故采用"交叉验证"法
具体做法:
- 做5次2折交叉验证
- 每次2折交叉验证之前把数据随机打乱,使得5次中数据划分不重复
- 对两个学习器A、B,第i次2折交叉验证将产生两对测试错误率,做差:
- 第1折差值:
- 第2折差值:
- 为缓解测试错误率的非独立性,仅计算第1次2折交叉验证的两个结果的均值
- 对每次2折交叉验证的结果都计算方差
- 变量
- 服从自由度为5的t分布
- 双边检验临界值:
- 当时,取2.5706
- 当时,取2.0150
2.4.3 McNemar检验
对于二分类问题,留出法不仅可以估计学习器A和B的测试错误率,还能获得两学习器分类结果的差别,如列联表(contingency table):
算法B | 算法A | |
---|---|---|
正确 | 错误 | |
正确 | e_00 | e_01 |
错误 | e_10 | e_11 |
做假设两学习器性能相同,则有
那么变量应符合正态分布
McNemar检验考虑变量:
服从自由度为 1 的分布
自由度为 1 的检验的临界值:
- 当时,取3.8415
- 当时,取2.7055
2.4.4 Frideman检验与Nemenyi后续检验
交叉验证t检验和McNemar检验都是在一个数据集上比较两个算法的性能,
而很多时候需要在一组数据集上对多个算法进行比较。
两种办法:
- 在每个数据集上分别两两比较,可采用上述方法
- 基于算法排序的Frideman检验
假设用4个数据集:对算法A、B、C进行比较
使用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,
然后再每个数据集上根据测试性能由好到坏排序,赋予序值1,2,3,...
若性能相同则平分序值,如下图:
然后使用Frideman检验判断算法的性能是否相同
若相同,则平均序值应相同
假定在N个数据集上比较k个算法,令表示第i个算法的平均序值(暂不考虑平分序值)
的均值为(k+1)/2,方差为
变量:
当k和N较大时,服从自由度为k-1的分布
上述原始Frideman检验过于保守,现常使用:
变量:
服从自由度为k-1和(k-1)(N-1)的 F 分布
下表为一些常用临界值
若"所有算法性能相同"这个假设被拒绝,则说明算法的性能显著不同,
这时需要进行后续检验(post-hoc test)来进一步区分算法
常用Nemenyi后续检验
计算出平均序值差别的临界值域:
下表给出常用的值
若两个算法的平均序值之差超过了临界值域CD,则拒绝假设"所有算法性能相同"
2.5 偏差与方差
通过"偏差-方差分解"来解释学习算法的泛化性能
泛化误差=偏差+方差+噪声
偏差:度量学习算法的期望预测与真实结果的偏离程度,刻画学习算法本身的拟合能力
方差:度量同样大学的训练集的变动导致的学习性能的变化,刻画数据扰动产生的影响
噪声:表达当前任务上任何学习算法所能达到的期望泛化误差的下界,刻画学习问题本身的难度
一般来说,偏差与方差是有冲突的,称为偏差-方差窘境(bias-variance dilemma)
训练不足时,学习器拟合能力较弱,泛化误差较大
训练充足后,继续训练会使学习器过拟合,泛化误差增高