模型第一次跑出结果时,团队通常不缺想法。有人想换更大的模型,有人想补数据,有人想调阈值,还有人想把错误样本全部重新标一遍。真正稀缺的是一套能把这些想法排出先后顺序的方法。
这一章讨论的就是这个问题:当你已经拿到模型、验证结果和一批错误样本,下一步究竟做什么? 我们会把总体分数拆成可行动的错误类别,建立不平衡分类的指标语言,分清排序、阈值与概率校准,再判断应该修标签、补哪类数据、调整评估集,还是暂时停止某条实验线。
上一章讲的是机器学习系统怎样形成闭环,本章把镜头拉近到一次具体诊断。你可以把这里的方法看成一次“模型门诊”:先确认体温计可信,再辨认症状,最后才开药。顺序反过来,模型也许会变,问题却可能原封不动。
本章默认我们使用验证集做诊断和方案选择,并把测试集留到方案、阈值和报告口径全部冻结后再做最终验收。凡是看过测试结果后作出的改动,都属于新一轮开发,不能继续把同一份测试结果当作独立证据。
“新模型的 F1 提高了 2 个点”听起来很明确,但它可能混合了许多变化:数据切分换了、标签观察窗口变了、正类定义改了、阈值重新调过,甚至同一用户的重复记录从验证集移到了训练集。只要尺子在动,分数就不能告诉我们模型本身是否进步。
一份可复查的评估协议至少要固定下面这些内容:
这里的“冻结”不是永远不能改。业务目标或数据分布确实变化时,协议当然要更新,但要生成新版本,并重新建立可比基线。最危险的做法是协议悄悄变化,而实验表里仍把新旧结果放在同一列。
比例指标很容易隐藏样本规模。某切片召回率从 70% 升到 80%,可能是从 7/10 变成 8/10,也可能是从 7000/10000 变成 8000/10000;两者的证据强度完全不同。因此,每份报告应同时保存:
对于比例类指标,小样本时不要只给“点估计 ± 正态近似”。召回率本质上是在实际正类中的成功比例,可以使用适合二项比例的 Wilson 区间;F1、AUPRC 这类复合指标可按独立实体做 bootstrap。若同一用户有多条样本,重采样也应按用户,而不是把每一行假装成独立观测。

先固定评估尺子,后续模型迭代才真正可比较。
误差分析不是随手挑几个离奇案例,也不是开会凭印象给模型找原因。它是一种带抽样规则、分类口径和计数结果的人工审查。目的不是解释每一个错误,而是回答三个更实用的问题:
二分类任务至少要分别抽取假正例和假负例,因为两类错误通常有不同原因。还可以加入:
如果只看“最惊讶”的错误,很容易被极端案例带偏。如果只从所有错误中均匀抽样,稀有但代价很高的切片又可能一条也看不到。更稳妥的做法是预先写明分层抽样配额,并保留抽样权重。这样既能观察关键风险,也能在汇总时还原它们在整体中的真实占比。
一条样本可能同时属于“图片模糊”“夜间场景”和“标签存疑”。把类别强行做成互斥选项,会丢失真实结构。误差账本可以为每条样本保留多个标签,同时增加以下字段:
人工看到错误后说“模型不懂反讽”,通常还只是一个假设。只有在一批样本上定义了可重复识别的“反讽”口径,并发现这一类确实集中出现时,它才接近可行动的错误类别。
假设验证集共有 个错误,其中 个带有错误类别 。即使某个方案能完美解决这一类,它对当前错误数的理论上限也只有:
类别之间可以重叠,所以各上限相加可能超过 100%。更现实的估计还要乘上预计可修复比例 :
例如“扫描件过暗”占 35% 的错误,但现有图像增强只能解决约三分之一;“标签映射错误”只占 15%,却能通过修规则解决九成。后者可能更值得先做。优先级还要考虑开发成本、风险、是否能顺带改善多个切片,而不能只按错误占比排序。
当团队长期反复查看同一批验证样本时,也会逐渐对这批样本过拟合。验证集足够大时,可以把人工频繁查看的部分与黑盒验证部分分开;前者用于形成假设,后者用于确认改动是否能泛化。

样本账本把一个总分拆成可复核、可计数、可行动的错误模式。
在类别不平衡的任务里,准确率很容易给人错误安全感。假设 10000 次登录中只有 60 次是真正的账户盗用,一个始终预测“正常”的系统也有 99.4% 的准确率,但它没有拦住任何一次盗用。
我们先固定方向:下表的行是真实标签,列是模型最终决策。
“正类”不是天然等于坏事或少数类,而是团队在协议中指定的关注事件。只要正类定义变化,precision、recall 和 specificity 的解释也会变化。
准确率回答“所有决策中有多少是对的”:
精确率回答“所有被模型判为正类的样本里,多少真的为正”:
召回率,也叫敏感度或真正率,回答“所有真实正类里,多少被找到了”:
特异度回答“所有真实负类里,多少被正确放过”:
假正率与特异度互补:
以一份验证报告为例:、、、。此时:
这个例子还说明,98.11% 的特异度不一定意味着假正例很少。负类基数为 9940,哪怕假正率只有 1.89%,也产生了 188 条假告警,远多于 42 条真正例。业务容量最终面对的是计数,不是百分比。

混淆矩阵四格是计数原点,不同指标只是从不同风险方向读取它。
F1 是 precision 与 recall 的调和平均:
调和平均会明显惩罚其中较低的一项,因此 F1 高通常意味着 precision 和 recall 都不能太差。但它没有把 放入公式,也默认 precision 与 recall 同等重要。若漏诊代价远高于误报,或假正例会造成严重伤害,只追求 F1 最大值并不等于业务最优。
可以用 调整两者权重:
时更重视 recall, 时更重视 precision。这个参数仍然只是偏好的压缩表达;真正有明确成本或硬约束时,直接写成本和约束通常更透明。
假设一个三分类系统的结果如下:
三种常见平均方式回答的是三类问题:
因此,一份多分类报告不应只给“macro-F1 为多少”。至少同时给出每类 support、precision、recall、F1 和混淆矩阵,再根据业务问题选一个主汇总指标。若某类根本没有真实样本或模型从未预测该类,指标还可能出现零除;报告必须明确处理规则,不能悄悄删除这类结果。
Weighted 指标高不代表每个类别都好,Macro 指标低也不一定代表系统整体不可用。平均方式是在回答不同问题。先说明谁应当拥有相同权重,再选择平均方式,比看到结果后挑一个最好看的数字更可靠。
阈值从高到低移动时,模型会产生一系列混淆矩阵。ROC 曲线和 PR 曲线都在描述这组变化,但观察角度不同。
ROC 曲线的横轴是假正率,纵轴是真正率:
PR 曲线的横轴是召回率,纵轴是精确率:
ROC 关注模型怎样在正类与负类之间排序;随机排序的 ROC-AUC 期望约为 0.5,对角线是直观基线。PR 更直接展示“找回多少正类时,告警里有多少是真的”。随机排序的 precision 基线约等于评估总体的正类率 ,因此解释 AUPRC 时必须同时报告 。
假设 10000 个样本中正类率为 1%,模型在某阈值下有 80% 的 TPR 和 1% 的 FPR。100 个正类中得到 80 个 ,9900 个负类中得到 99 个 ,所以:
1% 的 FPR 在 ROC 图上看起来靠近左侧,但现实中已经产生了比真正例更多的假告警。PR 曲线把这个负担直接显示在 precision 上。
precision 还会随正类率变化。若 TPR、FPR 保持不变,目标总体正类率为 ,则:
这意味着同一模型从正类率 10% 的实验集部署到正类率 1% 的真实流量,precision 可能大幅下降。跨数据集比较 PR 曲线时,必须检查正类率和取样方案;用人为平衡过的测试集算出的 precision,不能直接当作线上告警命中率。
ROC-AUC 可以理解为随机抽取一个正类和一个负类时,模型把正类排在更前面的概率。AUPRC 也总结了整个阈值范围。它们适合比较排序能力,却会平均掉团队根本不会使用的区间。
如果人工一天只能处理 500 条告警,真正关心的可能是“前 500 条的 precision”和对应 recall;如果制度要求召回率至少 90%,就应比较 recall 大于 90% 的局部区域。一个整体 AUC 更高的模型,在实际工作区间里仍可能更差。

曲线必须连同正类率基线、目标区间和实际告警容量一起读。
连续分数负责排序,阈值负责把分数变成动作。0.5 只是部分分类器的默认规则,并不天然对应最低成本、最高 F1 或业务容量。更何况,许多模型输出的是距离或未经校准的分数,0.5 根本没有概率含义。
成本最小化适合每类错误能近似折算成本的场景。阈值 的经验损失可以写成:
实际系统还可能加入人工处理成本、延迟成本和正确拦截收益。成本数值不必假装精确到个位,但要通过范围分析说明结论是否会随成本假设改变。
约束优化适合存在硬门槛的场景,例如:
也可以规定 precision 不低于某值、关键切片的漏报率不得超过上限,或服务延迟必须守住护栏。
容量约束适合人工审核、客服回访和有限床位等场景。若每天最多处理 个样本,可以选择 Top-K 或使告警量不超过 的阈值。此时要监控流量与分数分布;固定 Top-K 会在风险激增时压低实际阈值,固定阈值则会让工作量波动。
正确顺序是:
使用训练数据拟合模型,并产出连续分数。若还要校准概率,校准器也必须只使用允许参与开发的数据。
在验证集或符合实体、时间边界的交叉验证中比较阈值。主目标、约束、关键切片和并列处理规则都要提前写入协议。
将模型、预处理、校准器、阈值和后处理规则视为一个完整候选方案,一起冻结。
最后在未参与选择的测试集上评估一次。若结果促使团队更换阈值,就需要新的独立验收数据。
如果多个相邻阈值的表现差不多,通常不必迷信小数点后第四位的“最优值”。应查看 bootstrap 下阈值是否稳定,优先选择在关键约束上留有余量、对流量轻微变化不敏感的区间。

阈值是一条业务决策政策,需要随着成本、容量与风险重新确认。
模型 A 把大多数真正例排在负类前面,说明它的排序能力不错。模型声称某批样本“有 80% 概率为正”,而这批样本中确实约有 80% 为正,说明它的概率校准不错。这两件事相关,却不相同。
把所有分数做一个严格单调变换,样本顺序可以完全不变,因此 ROC-AUC 也不变,但分数的概率含义会改变。反过来,一个只输出接近总体正类率的模型可能校准尚可,却几乎无法区分谁的风险更高。
校准曲线会把预测概率分箱。第 个箱中的平均预测为:
实际正类频率为:
若 与 接近,说明该箱较为校准。图上还应显示每个箱的样本数或分数直方图。最靠近 0 和 1 的箱往往样本很少,只看一条折线会把随机波动误当成严重偏差。
Brier loss 和 log loss 可评估概率预测,但它们同时受区分能力和校准影响。Brier 更低不一定表示可靠性图处处更贴近对角线;需要把概率损失、可靠性图和排序指标放在一起看。
校准映射不能用模型已经拟合过的同一批训练预测直接学习,否则训练分数通常过于乐观。可以留出独立校准集,或用交叉验证生成 out-of-fold 分数再拟合校准器。
数据分布变化后,旧校准也可能失效。正类率改变、标签延迟规则变化或目标人群改变,都会让“0.8”不再对应原来的实际频率。因此,依赖概率做成本决策、资源分配或风险沟通的系统,需要按目标时间窗和关键切片持续检查校准,而不只是上线前画一次图。

排序指标回答谁在前面,校准回答一个概率数值究竟意味着什么。
“更多数据有帮助”只有在新数据能减少当前主要误差时才成立。若标签规范相互冲突,复制十倍同类数据只会复制冲突;若验证流量来自新设备,继续收集旧设备样本可能几乎没有收益;若模型连训练集都拟合不好,盲目扩充数据也未必解决容量或优化问题。
可以把常见症状与数据动作对照起来:
标注流程应先定义对象、观察窗口、证据来源和无法判断时怎样处理。抽取一批重叠样本让多个标注者独立作答,可以发现指南歧义。对于高风险或困难样本,再交给更有经验的裁决者。
但分歧本身可能是信息。内容是否冒犯、交易是否可疑、医学影像是否边界异常,都可能存在合理不确定性。若团队强迫每条样本得到一个看似确定的标签,会把真实模糊性藏进噪声。可以保留标注分布、置信等级或“需进一步检查”状态,并让评估协议承认这种边界。
主动学习让模型从未标注池中提出值得标注的样本。最简单的不确定性采样会优先选预测最不确定的样本,确实可能用较少标签改进决策边界。但实践中有几个限制:
因此,实际批次常把不确定性与多样性、覆盖度和业务价值结合,并保留一部分随机抽样作为对照。标注前还要去重和做可标注性检查,标注后记录样本为什么被选中。主动学习产生的是训练候选,不应取代代表目标总体的独立验证集。

“多收数据”不是行动方案,新增样本必须对准当前主要错误机制。
现实项目经常有两种数据:数量很多但不完全像线上目标的训练来源 A,以及数量较少却更接近真实使用场景的目标来源 B。若模型在训练集上好、目标验证集上差,我们不能立刻断言“过拟合”,因为差距可能来自分布错配。
一种有用的四集合设计是:
假设错误率为:
Train 到 Training-dev 增加 2 个百分点,表示模型对来源 A 有一定泛化差距;Training-dev 到 Dev 再增加 9 个百分点,更强地指向 A 与 B 的分布错配。若没有 Training-dev,我们只能看到 4% 到 15%,很容易把所有差距都归因于方差。
“A 和 B 不一样”还不能指导行动。应分别比较两边的错误账本、输入统计和标签流程,例如:
接下来可以收集更接近 B 的训练数据、在 A 中模拟已证实的 B 属性、调整采样权重,或删除只在 A 中可用的特征。任何改动仍要在固定的目标 Dev 上验证。不能为了“让分布一致”把 Dev 样本悄悄并入训练,再继续报告同一份 Dev 分数。
Dev 与 Test 应来自团队真正关心的同一目标分布,并使用一致标签定义。如果上线目标变了,就应重建二者,而不是用训练来源 A 的测试集证明面向 B 的效果。

training-dev 集把同分布方差与目标分布错配拆成两段可诊断差距。
如果任务是从一张图片识别缺陷,而熟练人员在看到相同输入时能稳定判断,人工表现可以帮助估计还有多少可避免偏差。设参考错误率为 ,训练错误率为 ,一个粗略诊断量是:
若专家团队错误率约 2%,模型训练错误率为 12%,说明模型连现有训练样本都远未达到可实现参考线,先提高模型对现有信息的利用通常比盲目收更多同类数据更合理。
结合上一节的四集合,还可以粗略分解:
这些差值是行动线索,不是严格互不影响的因果分解。抽样噪声、标签流程和模型训练随机性都可能使差值不稳定,所以要结合区间和具体错误样本解释。
“人类准确率”不是随便找几个人做题。应说明:
若模型只能看到提交当刻的字段,却拿人工查看 30 天后完整调查记录的成绩作参考,这个“上限”不公平。反过来,若高水平专家团队能在相同输入上稳定达到 2% 错误,就不应拿普通人的 15% 错误当作不可避免水平。
长期违约、设备未来故障、个性化排序和需求预测都可能依赖人类无法直接判断的统计规律。模型超过整体人工表现后,人工上限也不再是可靠的最优误差代理。此时可以改用:
说得直接一点,人工参考适合回答“模型离熟练人员能做到的水平还有多远”,不适合把所有未知任务都硬塞进“人类上限”这个框架。
总体指标会把不同人群、设备和场景混在一起。一个模型总体 recall 提高,可能只是容易样本占比变大;少数但高风险的切片反而退化。切片评估的目的不是把数据随意切成几十张表,而是检查已知风险假设。
切片应优先来自:
例如某关键切片只有 12 个真实正类,模型找回其中 10 个,recall 点估计为 83.3%。这个数字不能单独证明“已达到 80% 门槛”,因为区间会很宽。样本少不是忽略该群体的理由,而是说明团队目前还不知道表现是否稳定,需要更多有针对性的评估数据或更保守的决策。
不同场景可能关注正例机会、误报负担、选择率、概率校准或最终资源分配。人口统计均等、机会均等、错误率均等等定义回答不同问题,在基础发生率不同的群体间甚至无法同时完美满足。
选择公平指标时,应先描述具体伤害:谁会因为假正例被额外审查,谁会因为假负例失去帮助,阈值改变会把什么负担转移给谁。然后再决定切片、指标、门槛和人工申诉路径。不能先挑一个数学定义,再假装它替团队完成了价值判断。
切片比较还要防止构成变化和多重试探。若上线后浏览上百个切片,只报告最差的几个,偶然波动会被放大。核心切片和门槛应预先登记;探索性发现可以保留,但要在新数据上确认。

点估计相同不代表证据强度相同;小切片必须同时展示不确定性。
误差分析结束后,白板上常会出现十几条建议。若没有统一格式,容易出现“换 Transformer”这样很具体却缺少诊断依据的任务,也容易让耗时最长的人自动获得最高优先级。
我建议每个候选实验都写成一张卡:
可以用“预计影响 × 证据把握 ÷ 成本”帮助排序,但不要把粗估值包装成精确科学。使用高、中、低三个等级往往更诚实。安全风险或法规约束也不能简单被平均收益抵消,应设为硬门槛。
通常应先做能验证基础假设、成本低且信息增益高的实验。例如先抽查 100 条标签,可能一天内证明所谓“模型不够复杂”其实是标签映射错误;这比直接训练一个昂贵模型更有价值。
每个实验在开始前写明:
一次实验尽量只改变一个主因素。若同时换标签、特征、模型和阈值,即使分数提高,也很难知道下一步该保留什么。确实需要组合改动时,可以先做消融,或者至少明确组合方案回答的是“整包是否可行”,而不是各部件的单独贡献。
某平台每周约有 50000 次需要评估的登录,其中最终确认的账户盗用约 200 次,正类率为 0.4%。安全团队希望尽量拦住盗用,但人工每周最多复核 800 条告警;正常用户被强制冻结也会造成明显损失。
团队把评估单位定为“账户在一次风险会话中的首次登录”,同一账户不能跨集合。标签要等待 30 天,综合用户申诉、资金损失和人工调查后才成熟。训练集使用较早时间,Dev 使用紧接其后的完整目标时间窗,Test 使用更晚且尚未查看的时间窗。
主约束是人工告警量不超过 800,主目标是在约束内最大化 recall。护栏包括正常用户冻结数、不同设备与地区切片的假正率、人工处理时延。模型输出、校准器、阈值和例外放行规则共同组成一个候选方案。
旧阈值下,Dev 的混淆矩阵为:
准确率为 99.48%,但 recall 只有 58%,意味着 84 次真实盗用未被拦住。precision 为 40%,290 条告警中有 116 条命中。此时“99.48% 准确率”对决策几乎没有帮助,真正的问题是怎样在 800 条容量内提高召回,同时控制用户伤害。
团队按假负例、假正例、设备和地区分层抽取样本,并由两名审核员独立复核。结果发现:
这份结果让“先换更大模型”降到了队列后面。排在前面的动作变成:修订标签裁决规则;确认新设备信号在预测时刻是否稳定可得;定向补充近期新设备的真实正负样本;为旅行与 VPN 场景建立关键切片。
候选模型的 PR 曲线显示,在 800 条告警以内仍有提高 recall 的空间。团队没有在 Test 上寻找阈值,而是在 Dev 上以容量为硬约束。某个候选阈值产生 、、,总告警 770,recall 提高到 82%,precision 约为 21.3%。
precision 下降并不自动表示方案变差,因为团队明确愿意用剩余人工容量换取更少漏报。但 606 个假正例是否可接受,还要看冻结动作、人工成本和关键切片。若某地区的正常用户被异常集中拦截,整体容量合规也不能直接发布。
可靠性图又显示,旧模型分数在 0.8 左右的样本实际只有约 43% 为正。它的排序尚可,但概率严重过度自信。团队用符合时间边界的 out-of-fold 分数拟合校准器,并重新检查近期 Dev 上的可靠性。校准后的概率用于成本范围分析;阈值仍按容量和 recall 约束选择。两项工作相关,却没有混成一句“把概率调准就能提高 AUC”。
模型在旧来源的 Train 和 Training-dev 上差距很小,在近期目标 Dev 上却明显变差,说明新设备和新攻击路径带来了分布错配。团队补充近期目标样本,同时保留随机抽样,不让主动学习只追着模型最不确定的会话跑。
主动学习批次由四部分组成:边界不确定样本、模型间分歧样本、新设备覆盖样本和随机对照。损坏日志、重复会话和审核员无法判断的样本先单独归档。这样做既提高标注信息量,也保留了估计真实正类率和发现自信错误的入口。
人工参考只用于审核员在相同会话信息下能稳定判断的切片。对于要等 30 天结果才能确认的盗用,团队不把审核员即时判断当作“不可避免误差”。这避免了拿事后真相与实时模型做不公平比较。
团队把接下来两周安排为:
这条路径没有承诺一定换模型。它承诺的是每一步都能回答一个问题:标签是否可信,信号是否可得,错误是否来自错配,排序是否足够,概率能否支持成本解释,阈值是否符合容量,以及小切片上的提升究竟是证据还是波动。