10.3 分类指标:数清决策后果
前两节已经产生了概率、排序与不同模型家族。只有先声明正类,再把概率转换为行动,分类指标才有明确含义。这里继续令 late=1 表示延迟正类。选定一个阈值后,每笔验证订单都会且只会进入混淆矩阵的一个格子。
从混淆矩阵建立指标
混淆矩阵(confusion matrix)交叉排列真实类别与预测类别。scikit-learn 使用真实类别作为行、预测类别作为列。设置 labels=[0, 1] 后,二分类矩阵是:
四个格子分别对应不同运营后果:
| 格子 | 真实 | 预测 | 延迟订单含义 |
|---|---|---|---|
| TN | 准时 | 准时 | 无需警报 |
| FP | 准时 | 延迟 | 不必要的干预 |
| FN | 延迟 | 准时 | 漏掉了延迟订单 |
| TP | 延迟 | 延迟 | 发出了有用警报 |
每幅矩阵图都值得直接写明这个方向。转置后的四个数字虽然没变,行列回答的问题却已经不同。
准确率(accuracy)衡量全部行动中正确的比例:
精确率(precision)询问:预测为正的订单中,有多少确实为正?
召回率(recall,也叫 sensitivity 或 true-positive rate)询问:真实正类中抓到了多少?
特异度(specificity,也叫 true-negative rate)提出对应的负类问题:
阈值实验会先把每笔订单放在矩阵上方的概率带中。移动阈值,观察单个点先改变预测颜色,对应格子的数量随后变化。这就是模型分数与指标之间肉眼可见的因果桥梁。
F1 分数(F1 score)是精确率与召回率的调和平均:
只有两个分量都较高,F1 才会高。但它完全忽略 TN,而且隐含了某种对称的 FP/FN 权衡,并不自动等于配送业务成本。如果漏掉一笔延迟订单的成本是误报的六倍,就应在 F1 旁边报告显式期望成本。
from sklearn.metrics import (
ConfusionMatrixDisplay,
classification_report,
confusion_matrix,
)
prediction = (validation_probability >= 0.50).astype(int)
matrix = confusion_matrix(y_valid, prediction, labels=[0, 1])
ConfusionMatrixDisplay(
matrix,
display_labels=["on time (0)", "late (1)"],
).plot()
print(classification_report(
y_valid,
prediction,
labels=[0, 1],
target_names=["on time", "late"],
zero_division=0,
))如果没有任何样本被预测为正,precision 的分母就是零。软件需要明确的报告策略,但实质结论应当是“这个阈值没有触发任何正类行动”,而不能被悄悄理解成“精确率安全地等于零”。每类指标旁边都要报告支持度(support),也就是该类真实样本数。
揭开类别不平衡与切片失败
假设只有 2% 的订单延迟。一个永远预测准时的模型能达到 98% accuracy,却一笔延迟订单也抓不到。因此准确率必须与类别基准率和 DummyClassifier 基线一起看。平衡准确率(balanced accuracy)对正、负两类召回率取平均,多数类不会仅凭数量支配它。
多分类或多标签报告还会引入平均方式。宏平均(macro averaging)先独立计算每类指标,再让各类获得相同权重;加权平均(weighted averaging)按照每类支持度加权;微平均(micro averaging)先汇总所有格子的贡献,再计算指标。三者都不是普遍正确答案:它们回答不同问题,任何一个总体数字都不能取代逐类表。
即使总体指标不错,也可能隐藏糟糕的业务切片。模型或许能抓住中心城区的延迟,却在郊区、暴雨时段或少见车辆类型上大量漏报。应建立逐行审计表,保存冻结预测、真实值、概率、群组与决策时刻上下文,再按切片报告样本量、正类率、FP、FN、precision 和 recall。
精确率—召回率实验把两种隐藏机制画出来。第一,分数分离度不变时,正类越稀有,误报越容易与更少的 TP 竞争,precision 因而下降。第二,提高阈值往往增加 precision,却降低 recall。实时预测正类数量还显示了这个权衡背后的人员处理量。
切片指标具有不确定性。某区域只有两个正类样本时,一笔订单变化就能让召回率从 0% 变成 50%,甚至从 50% 变成 100%。必须标注样本量、预先声明最小支持度,并在决策依赖某切片时展示区间或折间波动。不能为了让报告显得平衡就删除多数类;如果训练时确有理由重采样,也必须在每个训练折内部执行,评估数据仍要保留真实部署分布。
现在已经出现了三种不同对象:
| 对象 | 示例问题 | 合适证据 |
|---|---|---|
| 硬行动 | 阈值 时哪些订单收到警报? | 混淆矩阵、成本、precision、recall |
| 排序 | 延迟订单通常是否排在准时订单前面? | ROC 曲线、PR 曲线、AUC、平均精确率 |
| 概率 | 预测 0.7 的相似订单中是否约 70% 延迟? | 校准曲线、对数损失、Brier 分数 |
本节测量了一个固定阈值。最后一节会主动移除这个固定点,追踪所有可能的运行状态,检查概率是否名副其实,再在不打开最终测试集的前提下选择行动。