机器学习与统计分类中的性能评估

  • 分类问题是机器学习和统计学中最核心的监督学习任务之一,其目标是通过学习已有数据的特征,构建预测模型,将新数据分配到预定义的类别或标签中。

  • 分类模型通常会基于样本特征给出类别、概率或风险分数。从统计分类的角度看,模型是在用数据估计样本属于某个类别的可能性,再根据阈值或决策规则给出最终判断。

  • 衡量分类模型的效果不是简单地问“预测对了多少”,而是要判断模型在真实任务中是否可靠、稳定、可用,这就引申出了很多不同的评价指标,本文将对这些指标进行总结。

为什么要评估分类模型

分类模型的目标是把样本划分到离散类别中,训练完成以后,模型会在训练集上给出一个看似不错的结果,但这并不意味着它在新数据上也可靠。模型评估要回答的是:

  1. 模型是否真的学到了可泛化的规律;
  2. 模型容易犯哪类错误;
  3. 错误的代价是否可以接受;
  4. 在不同阈值或使用场景下,模型表现是否稳定;
  5. 多个模型之间应该如何比较。

因此,评估指标不是装饰性的数字,而是模型能否投入使用的依据。

评估分类模型的两种层次

在分类任务中,模型可能输出两种东西。

第一种是类别标签:

y^{0,1}\hat{y} \in \{0, 1\}

例如直接输出“正类”或“负类”。

第二种是分数或概率:

s=f(x)s = f(x)

这个分数通常表示样本属于正类的倾向。要把分数变成类别,还需要一个阈值 θ\theta

y^={1,sθ0,s<θ\hat{y} = \begin{cases} 1, & s \ge \theta \\\\ 0, & s < \theta \end{cases}

这带来两个不同的评估层次:

  • 固定阈值后,评估模型的分类结果;
  • 不固定阈值时,评估模型对样本的排序能力。

Accuracy、Precision、Recall、F1 等指标属于前者;ROC、AUC 更偏向后者。

数据集划分与泛化能力

评估模型时不能只看训练集表现。训练集上的高分可能只是模型记住了训练样本而不是学到了规律。

常见划分方式包括:

  • 训练集:用于拟合模型参数;
  • 验证集:用于选择超参数、调阈值和比较模型;
  • 测试集:用于最后报告模型泛化性能。

如果数据量较小,也可以使用交叉验证。无论采用哪种方式,核心原则都是:用于最终评估的数据,不应该参与模型训练和调参。

对于时间序列、用户行为、推荐系统等场景,还要避免数据泄漏。例如不能把未来信息混入训练集,也不能让同一用户高度相关的样本同时出现在训练和测试中。

混淆矩阵及延伸的指标

二分类模型的评估可以从混淆矩阵开始,这是二分类模型与实际数据相互作用的最基础的结果:

预测为正类 预测为负类
实际为正类 TP FN
实际为负类 FP TN

四个量分别表示:

  • TP:True Positive,正样本被正确预测为正类。
  • FN:False Negative,正样本被错误预测为负类。
  • FP:False Positive,负样本被错误预测为正类。
  • TN:True Negative,负样本被正确预测为负类。

混淆矩阵可以帮助我们计算出许多模型评估指标,包括准确率、精确率、召回率和 F值分数等。这些指标可以帮助我们全面评估模型在不同方面的表现。

Accuracy / ACC

准确率 (Accuracy, ACC) 表示所有样本中预测正确的比例:

Accuracy=TP+TNTP+TN+FP+FN\mathrm{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}

它回答的问题是:模型总体预测对了多少?

假设一个疾病筛查任务中,患病率只有 1%1\%。如果模型永远预测“未患病”,Accuracy 也可以达到 99%99\%,但它没有发现任何真正需要关注的患者。

它直观,但容易被类别比例误导,所以适合类别比例相对均衡、错误代价接近的场景。只要类别分布明显不均衡,就不能只看 Accuracy。

Precision / PPV

精确率 (Precision) 也叫阳性预测值 (Positive Predictive Value, PPV) 表示预测为正类的样本中,有多少真的为正类:

Precision=TPTP+FP\mathrm{Precision} = \frac{TP}{TP + FP}

它回答的问题是:模型报出的正例有多可靠?

如果 FP 很多,Precision 就会下降,对于误报代价高的任务 Precision 往往很重要。

NPV

阴性预测值 (Negative Predictive Value, NPV) 表示预测为负类的样本中,有多少真的为负类:

NPV=TNTN+FN\mathrm{NPV} = \frac{TN}{TN + FN}

它回答的问题是:模型报出的负例有多可靠?

如果 FN 很多,NPV 就会下降,对于漏报代价高的任务 NPV 往往很重要。

Recall / TPR

召回率 (Recall), 也叫真阳性率(True Positive Rate,TPR)表示真实正样本中被模型预测为正样本的占比:

Recall=TPTP+FN\mathrm{Recall} = \frac{TP}{TP + FN}

它回答的问题是:真实正例有多少被找回?

一般而言,它的值越大意味着模型性能越好,因为它表示模型能够正确识别更多的正样本。对于漏报代价高的任务,Recall 往往很重要。

TNR

真阴性率 (True Negative Rate,TNR) 表示真实负样本中被模型预测为负样本的占比:

TNR=TNFP+TN\mathrm{TNR} = \frac{TN}{FP + TN}

它回答的问题是:真实负例有多少被正确识别?

一般而言,它的值越大意味着模型性能越好,因为它表示模型能够正确识别更多的负样本。对于误报代价高的任务,TNR 往往很重要。

FPR

假阳性率 (False Positive Rate, FPR) 表示真实负样本中,被错误预测为正类的比例:

FPR=FPFP+TN\mathrm{FPR} = \frac{FP}{FP + TN}

它回答的问题是:真实负例中有多少被误报?

一般而言,它的值越小意味着模型性能越好,因为它表示模型能够减少误报的数量。对于误报代价高的任务,FPR 往往很重要。

FNR

假阴性率 (False Negative Rate, FNR) 表示真实正样本中,被错误预测为负类的比例:

FNR=FNTP+FN\mathrm{FNR} = \frac{FN}{TP + FN}

它回答的问题是:真实正例中有多少被漏报?

一般而言,它的值越小意味着模型性能越好,因为它表示模型能够减少漏报的数量。对于漏报代价高的任务,FNR 往往很重要。

F1 Score

Precision 和 Recall 通常互相牵制。提高阈值时,预测为正类的样本变少,Precision 可能上升,但 Recall 可能下降;降低阈值时,Recall 可能上升,但 Precision 可能下降。

F1 Score 是 Precision 和 Recall 的调和平均:

F1=2PrecisionRecallPrecision+RecallF_1 = \frac{2 \cdot \mathrm{Precision} \cdot \mathrm{Recall}}{\mathrm{Precision} + \mathrm{Recall}}

调和平均会惩罚偏科。如果 Precision 很高但 Recall 很低,或者 Recall 很高但 Precision 很低,F1 都不会太高。

更一般地,可以用 FβF_\beta 调整 Precision 和 Recall 的权重:

Fβ=(1+β2)PrecisionRecallβ2Precision+RecallF_\beta = (1+\beta^2) \cdot \frac{\mathrm{Precision} \cdot \mathrm{Recall}} {\beta^2 \cdot \mathrm{Precision} + \mathrm{Recall}}

其中:

  • β>1\beta > 1 时,更重视 Recall;
  • β<1\beta < 1 时,更重视 Precision;
  • β=1\beta = 1 时,就是 F1。

Youden's J Statistic

Youden's J Statistic 是一个综合指标,定义为:

J=Sensitivity+Specificity1=TPR+TNR1J = \mathrm{Sensitivity} + \mathrm{Specificity} - 1 = \mathrm{TPR} + \mathrm{TNR} - 1

它回答的问题是:模型在区分正负样本方面的整体能力如何?

一般而言,它的值越大意味着模型性能越好,因为它表示模型在区分正负样本方面的能力更强。Youden's J Statistic 的取值范围是 [1,1][-1, 1],其中:

  • J=1J = 1:模型完美区分正负样本;
  • J=0J = 0:模型没有区分能力,相当于随机猜测;
  • J<0J < 0:模型的预测结果与实际情况相反。

曲线与排序指标

前面的混淆矩阵指标都有一个共同前提:必须先选定一个阈值。

比如模型输出一个分数: 0.91, 0.72, 0.63, 0.41, 0.18

对应的真实标签是: 1, 1, 1, 0, 0

如果规定: 分数 >= 0.6 判为正类。

就能得到 TP、FP、TN、FN,然后计算 Precision、Recall 等指标。

阈值本身会改变模型表现,如果我们不固定阈值,而是观察模型在不同阈值下的表现,就引入了曲线指标,核心是不只看模型在某个阈值下分类得怎么样,还要看模型给正负样本排序的能力怎么样。

ROC Curve

ROC 曲线 (Receiver Operating Characteristic Curve) 用于观察不同阈值下 FPR 和 TPR 的变化。

它的横轴是 FPR,纵轴是 TPR:

FPR=FPFP+TN\mathrm{FPR} = \frac{FP}{FP + TN}

TPR=TPTP+FN\mathrm{TPR} = \frac{TP}{TP + FN}

改变阈值,会得到一系列 (FPR,TPR)(FPR, TPR) 点。把这些点连起来,就是 ROC 曲线。

它回答的问题是:模型能否在较低误报率下保持较高召回率?

理想模型的曲线会靠近左上角,因为左侧表示 FPR 低,误报少;上方表示 TPR 高,召回多。如果模型完全没有区分能力,ROC 曲线会接近对角线,对角线意味着模型排序接近随机。

ROC 曲线示意图

AUC

AUC (Area Under Curve) 通常指 ROC-AUC,也就是 ROC 曲线下的面积,取值通常位于 [0,1][0, 1]

  • AUC = 1:排序完全正确;
  • AUC = 0.5:接近随机;
  • AUC < 0.5:排序方向可能反了。

它回答的问题是:随机抽取一个正样本和一个负样本,模型把正样本排在负样本前面的概率有多大?

这个解释说明 AUC 衡量的是排序能力,而不是某个固定阈值下的分类效果。如果任务更关心“高风险样本是否排在前面”,AUC 很有参考价值。

需要注意的是,AUC 不直接反映某个业务阈值下的误报和漏报。当类别极度不均衡时,ROC-AUC 有时会显得偏乐观,此时还需要结合 PR 曲线观察正类识别质量。

可视化参考:Google ROC/AUC 交互说明,其中包含不同 AUC 形态的曲线示例。

常用指标总结

缩写 全拼 别名 公式 简要定义
TP True Positive 真阳性 - 正样本判正
FN False Negative 假阴性 - 正样本判负
FP False Positive 假阳性 - 负样本判正
TN True Negative 真阴性 - 负样本判负
ACC Accuracy 准确率 TP+TNTP+TN+FP+FN\frac{TP + TN}{TP + TN + FP + FN} 整体正确率
PPV Positive Predictive Value Precision / 精确率 TPTP+FP\frac{TP}{TP + FP} 判正可信度
NPV Negative Predictive Value 阴性预测值 TNTN+FN\frac{TN}{TN + FN} 判负可信度
TPR True Positive Rate Recall / Sensitivity TPTP+FN\frac{TP}{TP + FN} 正类找回率
TNR True Negative Rate Specificity TNFP+TN\frac{TN}{FP + TN} 负类识别率
FPR False Positive Rate 假阳性率 FPFP+TN\frac{FP}{FP + TN} 负类误报率
FNR False Negative Rate 假阴性率 FNTP+FN\frac{FN}{TP + FN} 正类漏报率
F1 F1 Score F1 分数 2PRP+R\frac{2PR}{P + R} 平衡 P 与 R
FβF_\beta F-beta Score F-beta 分数 (1+β2)PRβ2P+R\frac{(1+\beta^2)PR}{\beta^2P + R} 加权 P 与 R
J Youden's J Statistic Youden 指数 TPR+TNR1\mathrm{TPR} + \mathrm{TNR} - 1 正负区分能力

其中,P=PrecisionP = \mathrm{Precision}R=RecallR = \mathrm{Recall}

参考