Supervised Learning Model Evaluation: Cross-Validation, Classification Metrics, and ROC Curves

Hyacehila

模型评估方法

误差与过拟合

我们把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”(error),学习器在训练集上的误 差 称 为 “训练误差 ”(training error)或 “经验误差” (empirical error),在新样本的误差称 为 “泛化误差”(generalization error).

显然,我们希望得到泛化误差小的学习器;我们只能寻找一种接近泛化误差最小的学习器,后面会介绍我们的方式。

这时候我们就不得不提到过拟合和欠拟合的现象了。当学习器把训练样本学得“太好” 了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降.这种现象在机器学习中称为“过拟合” (overfitting).与 “过拟合”相对的是“欠拟合” (imderRtting),这是指对训练样本的一般性质尚未学好.

下面是一个过拟合思想的例子 我们来根据已知数列预测下一个数 已知:31 28 31 30 31 一个简单的想法是 28 30 32 但是我们发现

f(n)=2/3n425/3n3+25/3n2857/12n+66f(n)=2/3n^4-25/3n^3+25/3n^2-857/12n+66

这也是一个有效的拟合 并且完全拟合了所有已知的值 但是它完全无法泛化 这就是过拟合现象

有多种因素可能导致过拟合,其中最常见的情况是由于学习能力过于强大,以至于把训练样本所包含的不太一般的特性都学到了,而欠拟合则通常是由于学习能力低下而造成的

欠拟合比较好处理,例如在决策树学习中扩展分支、在神经网络学习中增加训练轮数等;过拟合相对而言非常的麻烦,我们在后面会介绍各种方法来处理训练模型的过拟合问题,整个机器学习领域,处理过拟合都是重要的问题

传统的ML模型

在现实任务中,我们往往有多种学习算法可供选择,甚至对同一个学习算法,当使用不同的参数配置时,也会产生不同的模型.那么,我们该选用哪一个学习算法、使用哪一种参数配置呢?这就是机器学习中的“模型选择”(modelselection)问题

理想的办法是研究模型的泛化误差,可惜我们没有办法,然而训练误差肯定是不能使用的,我们下面,就是来寻找模型评估的方法

通常,我们可通过实验测试来对学习器的泛化误差进行评估并进而做出选 择.为此 需使用一个“测试集”(testing set)来测试学习器对新样本的判别能力,然后以测试集上的“测试误差”(testing error)作为泛化误差的近似 ,测试集应该尽可能与训练集互斥,下面是一些方法,让我们从一个数据集DD中产生训练集和测试集

留出法

“留出法”(hold-out)直接将数据集。划分为两个互斥的集合,其中一个 集合作为训练集SS ,另一个作为测试集TT , .在SS上训练出模型后,用TT来评估其测试误差,作为对泛化误差的估计.

需注意的是,训练/测试集的划分要尽可能保持数据分布的一致性,避免因数据划分过程引入额外的偏差而对最终结果产生影响,例如在分类任务中至少要保持样本的类别比例相似.

在使用留出法时,一般要采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果

常见做法是将大约2/3〜 4/ 5的样本用于训练,剩余样本用于测试.

交叉验证法

“交叉验证法”(cross validation)先将数据集DD划分为k个大小相似的互斥子集每个子集DiD_i都尽可能保持数据分布的一致性,即 从数据中通过分层采样得到.

然后,每次用k - 1 个子集的并集作为训练集,余下的那个子集作为测试集;这样就可获得k组训练/测试集,从而可进行k 次训练和测试,最终返回的是这k个测试结果的均值.显然,交叉验证法评估结果的稳定性和保真性在很大程度上取决于k的取值,为强调这一点,通常把交叉验证法称为“ k 折交叉验证”(k-fold crossvalidation), k 最常用的取值是1 0 ,此时称为1 0 折交叉验证;其他常用的k 值有 5、2 0 等

与留出法相似,将数据集划分k个子集同样存在多种划分方式.为减小因样本划分不同而引入的差别,k折交叉验证通常要随机使用不同的划分重复p次最终的评估结果是这p次k折交叉验证结果的均值,例如常见的有“10次10折交叉验证” 哪怕我们采取交叉已经给出了k个值了 还是要进行多次交叉验证试验,每一次交叉验证只取均值

假定数据集DD中包含mm个样本,若令 k=1k = 1 ,则得到了交叉验证法的一个特例:留一法

留一法使用的训练集与初始数据集相比只少了一个样本,这就使得在绝大多数情况下,留一法中被实际评估的模型与期望评估的用DD 训练出的模型很相似.因此,留一法的评估结果往往被认为比较准确.

然而,留一法也有其缺陷:在数据集比较大时,训练M 个模型的计算开销可能是难以忍受的(例如数据集包含1 百万个样本,则需训练1 百万个模型),而这还是在未考虑算法调参的情况下.

自助法

除前两种以外,我们还有一个使用的较少的评估方法给定包含 mm 个样本的数据集DD 我们对它进行采样产生数据集DD^{`} 每次随机从DD 中挑选一个样本,将其拷贝放入DD^{`} ,然后再将该样本放回初始数据集D 中,使得该样本在下次采样时仍有可能被采到 重复mm

通过自助采样,初始数据集中约有36.8%的样本未出现在采样数据集中.于是我们可将DD 用作训练集;用DD^{`}作测试集;这样,实际评估的模型与期望评估的模型都使用馆个训练样本,而我们仍有数据总量约1 /3 的、没在训练集中出现的样本用于测试.这样的测试结果,亦称 “包外估计

自助法在数据集较小、难以有效划分训练/测试集时很有用;

此外,自助法能从初始数据集中产生多个不同的训练集,这对集成学习等方法有很大的好处.

然而,自助法产生的数据集改变了初始数据集的分布,这会引入估计偏差.因此,在初始数据量足够时,留出法和交叉验证法更常用一些.

较为新颖的DL模型

我们前面介绍的评估方法划分训练集和测试集,旨在用测试集评估训练集上的泛化误差。这仅仅适用于没有超参数需要调节的情况。

超参数:模型训练过程中无法学习的参数,需要在训练开始前手工指定

大多数学习算法都有超参数,超参数的不同对最后的模型结果有很大的影响 在进行模型评估与选择时,除了要对适用学习算法进行选择,还需对算法参数进行设定

此时我们前面介绍的留出法和交叉验证就不再实用了,实际上 在数据量较小和模型超参数较少的时候,也就是传统的机器学习模型中我们使用这些方法更为普遍,而DL中基本使用本节介绍的划分方法

在深度学习中,我们将原始数据集直接划分为三个部分

  • 训练集
  • 验证集
  • 测试集

其中训练集用于模型的学习,验证集用于超参数调节,测试集用来测量模型的泛化性能,评估模型的效果。

不得将验证集和测试集合二为一,否则可能会产生过拟合的问题(这实际上产生了信息泄露)。当然,更加应该避免的就是从训练集中选取测试集。

基本的工作流程为 训练集 -> 模型训练 -> 验证集 -> 超参数调整 -> 最终模型 -> 测试集 -> 最终性能评估

比例控制

  • 小样本(百万量级):60% 训练集、20% 验证集、20% 测试集
  • 大样本(千万量级):只要验证集和测试集的数量足够即可,如固定10w
  • 超参数较少:适当缩减验证集,增加给训练集
  • 数据极少:传统的ML方法,如交叉验证

多模型比较检验

直接对性能度量指标进行比大小恐怕不是一个很好的判断模型好坏的差别:

首先,我们希望比较的是泛化性能,然而通过实验评估方法我们获得的是测试集上的性能,两者的对比结果可能未必相同;

第二,测试集上的性能与测试集本身的选择有很大关系,且不论使用不同大小的测试集会得到不同的结果,即便用相同大小的测试集,若包含的测试样例不同,测试结果也会有不同;

第三,很多机器学习算法本身有一定的随机性,即便用相同的参数设置在同一个测试集上多次运行,其结果也会有不同.那么,有没有适当的方法对学习器的性能进行比较呢?

统计假设检验(hypothesis test)为我们进行学习器性能比较提供了重要依据.基于假设检验结果我们可推断出,若在测试集上观察到学习器A 比 B 好, 则 A 的泛化性能是否在统计意义上优于B ,以及这个结论的把握有多大. (我们采用多测试集选取的方法规避了前面的一二两点,用统计假设检验规避了三的问题)

下面 我们先介绍两种最基本的假设检验,然后介绍几种常用的机器学习性能比较方法.为便于讨论,本节默认以错误率为性能度量

假设检验

由于交叉验证思想带动的试验方法设计,我们都有着大于1个的错误率,多次观测,也就是不止一个样本,这就为我们使用统计假设检验提供了基础

假设学习器对各个样本犯错的概率为pp 我们已知一次训练与测试过程中测试集的大小和分错的个数我们可以使用概率p的假设检验判断学习器犯错的概率是否为某个值 对一次训练与测试进行错误率假设检验

有时候,我们不止留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时可使用t检验 对平均错误率进行估计和假设检验 多个错误率,本质上是均值的t检验

交叉验证t检验

在更多的情况下,我们希望评估多个学习器之间的性能,此时我们应该使用交叉验证t检验 也就是成对数据t检验

多个学习器对同一次训练与测试给出了结果,他们是成对的数据

McNemar检验

对于二算法 二分类问题 我们可以给出每种算法的正误列联表; 如果我们假设两种分类算法没有性能差别 则可以使用卡方检验处理问题

Friedman检 验 与 Nemenyi后续检验

他实现的效果是在一个数据集上比较多个算法的效果 比交叉验证t检验更加的方便了 我们不需要进行多次t检验了

分类模型的性能度量

前面我们介绍的方法是估计学习器性能的试验设计方法,现在我们还需要性能度量的指标性能度量反映了任务需求。

在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的“好坏”是相对的,什么样的模型是好的,不仅取决于算法和数据,还决定于任务需求.

在分类任务中,性能度量希望研究已知分类指标和模型的分类指标的差异

错误率与精度

我们很自然的可以给出下面的两个指标来反应模型的好坏

  • 错误率是分类错误的样本数占样本总数的比例,
  • 精度则是分类正确的样本数占样本总数的比例

容易看出 两者的和为1,当然这样的指标并不足够,我们需要更进一步的研究

基于列联表的度量

错误率和精度虽常用,但并不能满足所有任务需求,比如 我们经常关心 我们挑选出的目标有多少是应该被挑选的就不能用前面的指标评估,因此我们还有其他的指标设计。

分别根据真实点标签DD 和预测类标签RR对样本点进行划分,我们可以得到k×kk\times k的列联表,我们一般称为混淆矩阵 N(i,j)N(i,j) 其中各点的元素为nijn_{ij} 后面有二分类问题的混淆矩阵的例子

精度

分类器MM关于类cic_i的正确率(accuracy)或精度(precision)给定为所有被预测为cic_i类的点中预测正确的点的比例:

acci=preci=niimi\mathrm{acc}_i=\mathrm{prec}_i=\frac{n_{ii}}{m_i}

其中mim_i是分类器MM预测为cic_i的点的数目。

一个分类器的总体精度或正确率是各类正确率的带权均值:

Accuracy=Precisioni=1k(min)acci=1ni=1knii\text{Accuracy}=\text{Precision}\sum_{i=1}^k\left(\frac{m_i}n\right)\text{acc}_i=\frac1n\sum_{i=1}^kn_{ii}

就是前文研究过的精度

覆盖率

覆盖率讨论应该被分入此类的样本被模型覆盖到的比例

coveragei=recalli=niini\mathrm{coverage}_i=\mathrm{recall}_i=\frac{n_{ii}}{n_i}

F1

通常对于分类器而言,会面临精度和召回率之间的权衡。理想状况下,我们想要精度和召回率都尽可能地高。

每个类的 F-measure都试图平衡精度和召回率,它是通过计算类cic_i的调和平均数得到的:

Fi=21preci+1recalli=2precirecallipreci+recalli=2niini+miF_i=\frac2{\frac1{\mathrm{prec}_i}+\frac1{\mathrm{recall}_i}}=\frac{2\cdot\mathrm{prec}_i\cdot\mathrm{recall}_i}{\mathrm{prec}_i+\mathrm{recall}_i}=\frac{2n_{ii}}{n_i+m_i} FiF_i的值越高,分类器就越好。

分类器MM的总体 F-measure 是各类的 F-measure 的平均值:

F=1ki=1rFiF=\frac1k\sum_{i=1}^rF_i

二分类问题的混淆矩阵

对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划 分为真正例(true positive) 假正例(false positive) 真反例(true negative) 假反例(false negative)四种情形

令 TP 、FP 、TN 、FN 分别表示其对应的样例数,则显然有TP + FP + TN + FN = 样例总数.分类结果的“混淆矩阵 “ (confusion matrix)如下

预测结果 预测结果
真实情况 正例 反例
正例 TP (真正例) FN (假反例)
反例 FP (假正例) TN (真反例)

错误率与精度(二分类)

研究错误预测的比例,和机器学习补充知识:错误率与精度一样

Error Rate=FP+FNn\mathrm{Error~Rate}=\frac{\mathrm{FP}+\mathrm{FN}}{n}

研究正确预测的比例,和机器学习补充知识:错误率与精度一样

Accuracy=TP+TNn\mathrm{Accuracy}=\frac{\mathrm{TP}+\mathrm{TN}}{n}

查准率与查全率

分类研究精度 和机器学习补充知识:精度一样

precP=TPTP+FP=TPm1;precN=TNTN+FN=TNm2\mathrm{prec}_{P}=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FP}}=\frac{\mathrm{TP}}{m_1};\mathrm{prec}_{N}=\frac{\mathrm{TN}}{\mathrm{TN}+\mathrm{FN}}=\frac{\mathrm{TN}}{m_2}

他们是一对相互矛盾的度量,查准率要求我们查到到的目标尽可能的准确 也就是减少选择的目标 查全率要求我们将尽可能多的正例取出 这就要求我们扩大找到的目标

敏感性与特异性

正类的点被正确预测比例 就是机器学习补充知识:覆盖率

TPR=recallP=TPTP+FN=TPn1\mathrm{TPR}=\mathrm{recall}_P=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FN}}=\frac{\mathrm{TP}}{n_1}

负类的点被正确预测比例 就是机器学习补充知识:覆盖率

TNR=specificity=recallN=TNFP+TN=TNn2\mathrm{TNR}=\text{specificity}=\mathrm{recall}_N=\frac{\mathrm{TN}}{\mathrm{FP}+\mathrm{TN}}=\frac{\mathrm{TN}}{n_2}

假阴性与假阳性

就是前面的敏感性与特异性与1做差 如下

FNR=FNTP+FN=FNn1=1sensitivity\mathrm{FNR}=\frac{\mathrm{FN}}{\mathrm{TP}+\mathrm{FN}}=\frac{\mathrm{FN}}{n_1}=1-\text{sensitivity} FPR=FPFP+TN=FPn2=1specificity\mathrm{FPR}=\frac{\mathrm{FP}}{\mathrm{FP}+\mathrm{TN}}=\frac{\mathrm{FP}}{n_2}=1-\text{specificity}

综合性的度量方法

我们还是继承二分类的混淆矩阵进行研究,当存在类不平衡时,混淆矩阵中的绝对数可能不太有用 因此我们要开始下面的研究。他们旨在提出给为综合性的分类模型性能评价方法。

PR曲线

我们可以定义查准率PP查全率RR

P=TPTP+FP,R=TPTP+FN.\begin{aligned}P&=\frac{TP}{TP+FP},\\\\R&=\frac{TP}{TP+FN}.\end{aligned}

他们就是机器学习补充知识:查准率与查全率

在很多情形下,我们可根据学习器的预测结果对样例进行排序,排在前面 的是学习器认为“最可能”是正例的样本,排在最后的则是学习器认为“最 不可能”是正例的样本.按此顺序逐个把样本作为正例进行预测,则每次可以计算出当前的查全率、查准率

以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称 “P-R曲线;

P-R 图直观地显示出学习器在样本总体上的查全率、查准率.在进行比较时,若一个学习器的P -R 曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者。

F Measure

不过完全包住的情况还是太少了 交叉才是PR曲线的常态 因此我们还可以引入新的度量指标 比较常用的是F1度量 这里继承自机器学习补充知识:F1

F1=2×P×RP+R=2×TP样例总数+TPTN.F_1=\frac{2\times P\times R}{P+R}=\frac{2\times TP}{\text{样例总数}+TP-TN}.

他是查准率和查全率的调和平均

在一些应用中 对查准率和查全率的重视程度有所不同 因此我们给出广义的F1度量 我们称为FβF_\beta

Fβ=(1+β2)×P×R(β2×P)+R,F_{\beta}=\frac{(1+\beta^{2})\times P\times R}{(\beta^{2}\times P)+R}, β\beta是重要性权衡 大于1 则认为查全率有更大影响;反之我们认为查准率有更大影响 它的本质是加权调和平均

对于多元的分类问题 我们往往转化成多个二分类问题;此时就有着多个混淆矩阵 我们计算 TP 、FP 、TN 、FN的平均值,再计算F1度量就可以了

ROC与AUC

很多学习器是为测试样本产生一个实值或概率预测,然后将这个预测值与一个分类阈值(threshold)进行比较,若大于阈值则分为正类,否则为反类;

此时这个实值或概率预测结果的好坏,直接决定了学习器的泛化能力;

因此,排序本身的质量好坏,体现了综合考虑学习器在不同任务下的“期望泛化性能”的好坏,ROC 曲线则是从这个角度出发来研究学习器泛化性能的有力工具.

与PR曲线相似,我们根据学习器的预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横、纵坐标作图,就得到了 “ROC 曲线”

ROC 曲线的纵轴是“真正例率”(True Positive Rate ,简称 TPR ) , 横 轴 是 “假正例率”(False Positive Rate ,简称FPR ) 其中

TPR=TPTP+FNFPR=FPTN+FP\begin{aligned}\text{TPR}&=\frac{TP}{TP+FN}\\\\\text{FPR}&=\frac{FP}{TN+FP}\end{aligned}

他们就是 机器学习补充知识:敏感性与特异性

进行学习器的比较时,与 P-R 图相似,若一个学习器的ROC 曲线被另一 个学习器的曲线完全“包住”则可断言后者的性能优于前者;

若两个学习器的ROC曲线发生交叉,则难以一般性地断言两者孰优孰劣.此时如果一定要进行比较,则较为合理的判据是比较ROC 曲线下的面积,即 AUC (Area Under ROC Curve) 计算为

AUC=12i=1m1(xi+1xi)(yi+yi+1).\mathrm{AUC}=\frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1}-x_{i})\cdot(y_{i}+y_{i+1}).

一般来说,AUC值的解释如下:

  • AUC = 0.5:表示模型没有分类能力,相当于随机猜测。
  • 0.5 < AUC < 0.7:表示模型有一定的分类能力,但效果一般。
  • 0.7 ≤ AUC < 0.9:表示模型有较好的分类能力。
  • AUC ≥ 0.9:表示模型有非常好的分类能力。

ROC-AUC是最为常用的分类问题性能评价指标,很实用,他对类别不均衡的情况也不敏感

多分类下的性能评估

对于多分类的机器学习问题,可以使用ROC曲线、AUC和混淆矩阵等评估方法,但需要进行适当的扩展或调整。下面分别说明:

混淆矩阵(Confusion Matrix) 天然适用于多分类问题,可以直观看出各类别的分类性能,如哪些类别容易混淆.

ROC曲线和AUC最初是为二分类设计的,但在多分类中可以通过One vs. Rest(OvR) 策略扩展 得到CC条(按照OvR策略训练CC个二分类模型) ROC曲线,然后将曲线与曲线下面积等权或者按照样本数加权平均.

回归模型性能度量

回归模型度量的基本思路

在回归任务中,最常用的性能度量指标是均方误差MSE,计算公式为

E(f;D)=1mi=1m(f(xi)yi)2.E(f;D)=\frac{1}{m}\sum_{i=1}^{m}\left(f\left(\boldsymbol{x}_{i}\right)-y_{i}\right)^{2}.

当然我们有着一些其他的度量,这里没必要叙述了,以后有机会可以单独研究

  • Title: Supervised Learning Model Evaluation: Cross-Validation, Classification Metrics, and ROC Curves
  • Author: Hyacehila
  • Created at : 2025-10-02 08:04:00
  • Link: https://hyacehila.github.io//blog/2025/10/02/supervised-learning-model-evaluation/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments