分类阈值 从精确率召回率到决策成本
先确认变量、单位与假设,再核对手算、图表和解释范围。
章节速览7 节 · 展开选择
概率校准问“报出的概率是否可信”,部署分类器还要回答“多少分才采取行动”。同一组分数可以对应不同的误报、漏报和人工复核量。默认阈值并不自动适合当前任务。
本文只讨论已获得分数的二分类:正类标签为 1,分数越大越倾向正类,分数 s≥阈值 t 时判为正类。八条记录全部是教学合成数据,不代表真实模型的效果。
先把分数、真实标签和决策分开
分数可以是概率,也可以是任意有序的实数;下面手算使用 [0,1] 内的分数,但不假定它们已经校准。scikit-learn 阈值指南将概率估计与行动决策分开,提醒读者根据目标选择阈值,并用独立数据评估。
flowchart LR A[固定样本与正类定义] --> B[模型给出分数] B --> C[验证集选择阈值] C --> D[冻结模型与阈值] D --> E[独立测试集报告混淆矩阵] E --> F[监测实际构成与成本]
对照真实标签,判正且确为正是 TP,判正但实际为负是 FP;判负但实际为正是 FN,判负且确为负是 TN。于是:
**精确率 P=TP/(TP+FP)**:判正的样本里有多少是真的?
**召回率 R=TP/(TP+FN)**:全部真实正例里找回了多少?
两者分母不同。精确率不是“全部样本中正确的比例”,也不能用来推断没有被判正的样本是否可靠。准确率为 (TP+TN)/N,类别很不平衡时单报准确率容易遮住正类漏检。
八条记录逐组降低阈值
按分数从高到低排列:A=(0.9,1)、B=(0.8,0)、C=(0.8,1)、D=(0.6,1)、E=(0.4,0)、F=(0.3,1)、G=(0.2,0)、H=(0.1,0)。括号内依次为分数与标签。正负各四条;B 和 C 同分,阈值必须同时纳入它们,不能用任意排序在同分组内部虚构一个操作点。
| 阈值 t | TP | FP | FN | TN | 精确率 | 召回率 |
|---|---|---|---|---|---|---|
| 0.9 | 1 | 0 | 3 | 4 | 1 | 1/4 |
| 0.8 | 2 | 1 | 2 | 3 | 2/3 | 1/2 |
| 0.6 | 3 | 1 | 1 | 3 | 3/4 | 3/4 |
| 0.4 | 3 | 2 | 1 | 2 | 3/5 | 3/4 |
| 0.3 | 4 | 2 | 0 | 2 | 2/3 | 1 |
| 0.1 | 4 | 4 | 0 | 0 | 1/2 | 1 |
t=0.2 还有一个操作点,TP=4、FP=3、FN=0、TN=1,P=4/7、R=1;表中省略它只是为了比较主要变化,计算曲线时仍保留它。t>0.9 时无人判正,精确率分母为零,数学上未定义,不能把工具约定的端点当作实测完美精确率。
为什么召回率单调,而精确率可以回升
在同一批样本上降低阈值,只会扩大判正集合,因此 TP 不会减少。真实正例总数 TP+FN 固定且大于零,所以召回率不会下降。
精确率则比较新增样本的正例比例与旧集合比例。若原有 a 个真阳性、b 个假阳性,新增 u 个正例和 v 个负例,则比较 (a+u)/(a+b+u+v) 与 a/(a+b),交叉相乘可得上升条件 ub>av。新增样本全是正例时,精确率就可能上升:本例 0.8→0.6,P 从 2/3 升到 3/4。
官方 Precision-Recall 示例也明确说明这种波动,不能把经验上的常见趋势写成定理。
自检:从 0.6 降到 0.4,为什么召回率没变?
新增的 E 是负例,只增加 FP。TP 仍是 3,真实正例总数仍是 4;召回率保持 3/4,精确率从 3/4 降到 3/5。
平均精确率不是连接各点后的梯形面积
沿阈值从高到低,使用每次召回增量所对应的精确率,非插值平均精确率为 AP=Σ ΔR·P。对本例,新增正例的四次增量均为 1/4:
AP=(1/4)×1+(1/4)×(2/3)+(1/4)×(3/4)+(1/4)×(2/3)=37/48≈0.770833。
只增加 FP 的步骤 ΔR=0,不直接增加 AP。这里采用 scikit-learn average_precision_score的非插值定义,不使用梯形积分,也不采用某些检索指标的插值包络。precision_recall_curve会附加 P=1、R=0 的绘图端点且不配阈值;不要把它误计为额外一组模型预测。
AP 汇总排序表现,没有替读者选出某个行动阈值。严格递增变换保留排序和同分关系,可以保持这些操作点与 AP,却改变分数数值;概率校准与决策阈值仍须单独检查。
正类基率改变,精确率也会改变
设目标总体正类比例为 π,固定阈值下真阳性率为 r,假阳性率为 f。在这两个条件率保持不变的假设下,由总概率可得:
**P=πr/[πr+(1−π)f]**,分母须大于零。
这只是条件概率推导,不保证换场景后 r、f 真会保持不变。假设 r=0.8、f=0.1,π=0.5 时 P=8/9;π=0.1 时 P=8/17。可见同样的条件识别率,面对更少的正例时也可能产生较低精确率。与分层和标准化一样,需要同时报告构成与组内表现。
用成本选择行动,再到独立测试集核验
若只计误报成本 C_FP 和漏报成本 C_FN,总经验损失为 C_FP·FP+C_FN·FN。本例取 C_FP=1、C_FN=4,t=0.9/0.8/0.6/0.4/0.3/0.2/0.1 的损失分别为 12/9/5/6/2/3/4;在这些操作点和无人判正点中,0.3 的损失最小。它只是这批合成样本的最小值,不是通用最佳阈值。
若输入 p 是当前目标总体下的真实条件概率,只有上述两类非负错误成本且两者之和大于零、正确决策成本为零,预测正类的条件期望损失为 C_FP(1−p),预测负类为 C_FN·p。比较两者可得 p≥C_FP/(C_FP+C_FN) 时选择正类。此例理论成本阈值为 0.2,与小样本经验最优 0.3 不同并不矛盾:例中分数未被假定为真实概率,有限样本还存在波动。人工复核容量、延迟和弃权成本加入后也要重新定义目标。
flowchart TD
A[先固定任务成本与容量] --> B[验证集扫描同分组阈值]
B --> C{约束是否满足}
C -->|是| D[选择目标损失较小的候选]
C -->|否| E[报告无可行候选]
D --> F[冻结阈值后只评估测试集]
不得在同一个测试集上反复调阈值后,再把该集称为未参与选择的最终证据。可参考配对 Bootstrap保留同题关系描述不确定性,但重采样不能消除已经发生的数据泄漏。
自检:AP 更高,是否保证任意成本下都更好?
不保证。AP 汇总多个阈值的排序表现,实际成本取决于选中的操作点、目标总体及行动约束。要在相同测试记录上核对冻结阈值后的 FP、FN 与成本,不能只比较一个汇总分数。
报告时保留什么
- 写明正类定义、评估单位、样本量、正类数量和时间范围。
- 保留阈值、同分规则及完整 TP/FP/FN/TN;无预测正例或无真实正例时,明确未定义量与软件约定。
- 分开排序指标、概率校准和行动损失;不能用其中一项替代其余两项。
- 选择在验证数据完成;最终测试固定模型、阈值和成本口径。新场景检查基率与条件率,不把旧精确率当作常量。