《西瓜书》小记(二)模型评估与选择

简介

此章节介绍了对模型的评估方法,以及对两个或多个模型进行比较的方法。

概念

错误率(error rate):如果在 m 个样本中有 a 个样本分类错误,则错误率为 E = a / m 。

精度(arrcuracy):精度为 1 - a / m,即精度 = 1 - 错误率

误差(error):学习器的实际预测输出与样本的真实输出之间的差异称为误差。其中,学习器在训练集上的误差称为训练误差(training error)经验误差(empirical error),在新样本上的误差称为泛化误差(generalization error),在训练集(testing set)上的误差被称为测试误差(testing error)

过拟合(overfitting):学习器将训练样本的性质学得“太好”,过于拟合训练样本而导致泛化性能下降,对于新的样本无法做出正确的判别。

欠拟合(underfitting):学习器没有学好训练样本的一般性质,对样本的拟合程度较低。

参数调节(parameter tuning):简称调参,即对算法的参数进行调节。一般对每个参数选定一个范围和变化步长,例如在 [0, 0.2] 范围内以 0.05 为步长,则实际要评估的候选参数值有 5 个,从这 5 个参数值中选取最佳的 1 个作为最终的结果。

验证集(validation set):模型评估与选择中用于评估测试的数据集称为验证集。在研究对比不同算法的泛化性能时,我们用测试集上的判别效果来估计模型在实际使用时的泛化能力,而把训练数据另外划分为训练集验证集,基于验证集上的性能来进行模型选择和调参。

性能度量(performance measure):性能度量是衡量模型泛化能力的评价标准。对比不同模型的能力时,不同的性能度量通常会返回不同的结果。

规范化(normalization):将不同变化范围的值映射到相同的固定范围中,常见的是 [0, 1],此时亦称归一化

评估方法

留出法(hold-out):

将数据集 D 划分为两个互斥的集合,其中一个集合作为训练集 S,另一个作为测试集 T,即 D = S ∪ T, S ∩ T = ∅ 。在 S 上训练出模型后,用 T来评估测试误差,作为对泛化误差的估计。

留出法通常采用分层采样(stratified sampling)对数据集进行划分,即在训练集 S 和测试集 T 中,正例和反例的数量应当相同。一般采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。

通常将 2/3 ~ 4/5 的数据划分为训练集,将剩下的数据划分为测试集。一般可以用 70% 作为训练集,30% 作为测试集。

交叉验证法(cross validation):

将数据集 D 划分为 k 个大小相似的互斥子集,即 D = D1 ∪ D2 ∪ ... ∪ Dk,Di ∪ Dj = ∅ (i ≠ j)。每个子集 Di 尽可能保持数据分布的异质性,即从 D 中通过分层采样得到。每次用 k - 1 个子集的并集作为训练集,剩下的那个子集作为测试集,重复 k 次后得到 k 个测试结果,取 k 个测试结果的平均值为最终的评估结果。通常把交叉验证法称为k 折交叉验证(k-fold cross validation),其中 k 最常用的取值是 10,即 10 折交叉验证;其他常用的 k 值有 5、20等。

假设数据集 D 中包含 m 个样本,令 k = m,则得到了留一法(Leave-One-Out,简称 LOO)

自助法(bootstrapping):

给定包含 m 个样本的数据集 D,每次随机从 D 中挑选一个样本拷贝放入(D 中仍有 m 个样本)训练集 S,重复 m 次后训练集 S 中就有了 m 个样本,其中有一部分样本会在 S 中多次出现。样本在挑选过程中始终不被选择到的概率为

取极限得

即数据集 D 中约有 36.8% 的样本未出现在训练集 S 中。取 D \ D' 为测试集 T,则 T 中拥有约 1 / 3 的样本数据。这样的测试结果,亦称包外估计(out-of-bag estimate)

自助法在数据集较小、难以有效划分训练/测试集时很有用。然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差。

性能度量

均方误差(mean squared error):

回归任务最常用的性能度量是均方误差

更一般的,对于数据分布 D 和概率密度函数 p(·) ,均方误差可以描述为

错误率(error rate)与精度(accuracy):

对样例集 D,分类错误率的定义为

精度定义为

更一般的,对于数据分布 D 和概率密度函数 p(·) ,错误率可以描述为

精度描述为

查准率(precision)、查全率(recall)与 F1:

查准率表示在所有被认为是正确的样例中,有多少个被正确分类的样例;而查全率表示在所有本身即是正确的样例中,有多少个被正确分类的样例。

对于二分类问题,分类结果的混淆矩阵(confusion matrix)

分类结果混淆矩阵

查准率 P 与查全率 R 分别定义为

我们根据学习器的预测结果对样例进行排序,排在前面的是学习器认为最可能是正例的样本,排在最后的是学习器认为最不可能是正例的样本。按此顺序逐个把样本作为正例进行预测,每次计算出相应的查全率、查准率,以查准率y 轴查全率x 轴作图,则可以得到查准率-查全率曲线,简称 P-R 曲线。实际应用中的 P-R 曲线通常是非单调、不平滑的,且在很多局部有上下波动,如

P-R 曲线与平衡点示意图

平衡点(Break-Even Point,简称 BEP)是一个用于比较学习器的性能度量,它是查准率 = 查全率时的取值,如图中的 BEP 是 0.55。基于 BEP 值的高低可以比较出学习器的优劣。

但是 BEP 还是过于简化,更常用的是 F1 度量:

F1度量的一般形式——,能让我们表达出对查准率/查全率的不同偏好,它定义为

其中 β > 0度量了查全率对查准率的相对重要性。β = 1 时退化为标准的 F1;β > 1 时查全率更重要;β < 1 时查准率更重要。

当执行多分类任务或在多个数据集上进行训练/测试时,每两两类别的组合都对应一个混淆矩阵。对每个混淆矩阵都计算出相应的查准率和查全率,记为(P1, R1),(P2, R2),...,(Pn, Rn),再计算平均值,就得到了宏查准率(macro-P)宏查全率(macro-R),以及相应的宏F1(macro-F1)

还可以先将每个混淆矩阵的对应元素进行平均,得到TP、FP、TN、FN的平均值,再基于这些值计算出微查准率(micro-P)微查全率(micro-R),以及相应的微F1(micro-F1)

ROC 曲线(Receiver Operating Characteristic curve) 与 AUC(Area Under ROC Curve):

ROC 曲线全称是受试者工作特征曲线,与 P-R 曲线相似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出相应的真正例率(True Positive Rate,简称 TPR)假正例率(False Positive Rate,简称 FPR),以TPRy 轴FPRx 轴作图,则可以得到 ROC 曲线

其中 TPR 与 FPR 的定义为

得到 ROC 图:

ROC 曲线与 AUC

其中 AUC 表示 ROC 曲线下的面积,用于比较学习器的性能优劣,一般面积更大的学习器的性能更为优良。AUC 可估算为

形式化地看,AUC 考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。给定 m+ 个正例和 m- 个反例,令 D+ 和 D- 分别表示正、反例集合,则排序损失(loss)定义为

因此有

代价敏感错误率与代价曲线

在现实任务中,常常有不同类型的错误会造成不同的损失的情况,即错误分类为正例造成的损失可能远远超过(或小于)错误分类为反例造成的损失,因此可为错误赋予非均等代价(unequal cost)

例如二分类代价矩阵:

二分类代价矩阵

在矩阵中,若将第 0 类判别为第 1 类所造成的损失更大,则 cost01 > cost10;损失程度相差越大,cost01 与 cost10 的差值越大。

此时的代价敏感(cost-sensitive)错误率为

在非均等代价下,需要用代价曲线(cost curve)代替 ROC 曲线来反映出学习器的期望总体代价。代价曲线图的 x 轴是取值为 [0, 1] 的正例概率代价

其中 p 是样例为正例的概率;y 轴是取值为 [0, 1] 的归一化代价

ROC 曲线上每一点对应了代价平面上的一条线段,设 ROC 曲线上的点的坐标为(FPR,TPR),则先计算出 FNR = 1 - TPR,再在代价平面上绘制一条从(0,FPR)到(1,FNR)的线段,线段下的面积表示该条件下期望总体代价所有线段的下界围成的面积即为所有条件下学习器的期望总体代价,如

代价曲线与期望总体代价

比较检验

统计假设检验(hypothesis test)

通常以统计假设检验方法来比较学习器性能。书中以错误率为性能度量,用 ϵ 表示,即有泛化错误率 ϵ测试错误率 ϵ^,则泛化错误率为 ϵ 的学习器被测得测试错误率为 ϵ^ 的概率为

解方程

可知,在 ϵ = ϵ^ 时 P 最大,|ϵ - ϵ^| 增大时 P 减小。

二项检验(binomial test)

我们可使用二项检验来对 ϵ 进行假设检验,如检验 ϵ <= ϵ0(即泛化错误率是否不大于 ϵ0):

其中 1 - α 反映了结论的置信度(confidence)

t 检验(t-test)

当通过多次重复留出法或是交叉验证法等进行多次训练/测试,我们会得到多个测试错误率,此时可使用 t 检验。假定我们得到了 k 个测试错误率,则平均测试错误率 μ 和方差 σ^2 为

考虑到这 k 个测试错误率可看作泛化错误率 ϵ0 的独立采样,则变量

服从自由度为 k - 1 的 t 分布。

交叉验证 t 检验

对两个学习器 A 和 B,我们可以用成对 t 检验(paired t-tests)来进行比较检验。先对每对测试错误率求差,△ = ϵA - ϵB,若两个学习器性能相同,则差值的均值应该为 0 。因此,可根据差值△1,△2,...,△k 来对学习器 A 与 B 性能相同做 t 检验,若变量

小于临界值,则假设不能被拒绝,即认为两个学习器的性能没有显著差别。

5 x 2 交叉验证是做 5 次 2 折交叉验证之前随机将数据打乱。同样由上述检验方法可得

变量

服从自由度为 5 的 t 分布。

McNemar 检验

对二分类问题,可以获得两学习器分类结果的差别,如列联表(contingency table)

两学习器分类差别列联表

若我们做的假设是两学习器性能相同,则应有 e01 = e10,那么变量 |e01 - e10| 应当服从正态分布。McNemar 检验考虑变量

服从自由度为 1 的卡方分布,即标准正态分布变量的平方。

Friedman 检验与 Nemenyi 后续检验

假定我们用 D1、D2、D3 和 D4 个数据集对算法 A、B、C 进行比较。首先,使用留出法或交叉验证法得到每个算法在每个数据集上的测试结果,然后在每个数据集上根据测试性能由好到坏排序,并赋予序值 1,2, ...;并对每一列的序值求平均,得到平均序值,可得

算法比较序值表

然后,使用 Friedman 检验来判断这些算法是否性能都相同,若相同,则它们的平均序值应该相同。假定我们在 N 个数据集上比较 k 个算法,令 ri 表示第 i 个算法的平均序值,则 ri 的均值和方差分别为 (k + 1) / 2 和 (k^2 + 1) / 12。变量

在 k 和 N 都较大时,服从自由度为 k - 1 的卡方分布。

然而,上述这样的原始 Friedman 检验过于保守,现在通常使用变量

服从自由度为 k - 1 和 (k - 1)(N - 1) 的 F 分布。

所有算法的性能相同这个假设被拒绝,则说明算法的性能显著不同。这是需进行后续检验(post-hoc test)来进一步区分各算法。常用的有 Nemenyi 后续检验。

Nemenyi 检验计算出平均序值差别的临界值域

若两个算法的平均序值之差超出了临界值域 CD,则以相应的置信度拒绝两个算法性能相同这一假设。

偏差(bias)与方差(variance)

以回归任务为例,学习算法的期望预测为

方差为

噪声为

偏差为

算法的期望泛化误差为

也就是说,泛化误差可分解为偏差、方差、噪声之和。

泛化误差与偏差、方差的关系示意图

小结

在此章节学到了如何对学习器的性能进行评估、比较,为以后评估各种学习器的性能打好基础。各种的统计假设检验方法也凸显了现在机器学习中统计学的重要性,从侧面说明了现在是统计学习主导潮流。要研究这一块,相比牢固的概率论统计学基础是必不可少的。当然,除此之外的各种数学基础也是必要的。

在写此小记的时候突然发现方差竟然是以 n - 1 作为分母,而不是 n。好像我以前一直没有注意到这个问题。随即去网上搜了下资料,顺便自己推了一下证明式,感觉写得还行,贴出来留作纪念

推荐阅读更多精彩内容