同一天收货,两个批次都拿到了 82 分(数字均为示意)。一个是老供应商的常规品类,分数由产品类别和季节抬高;另一个几乎全靠供应商过去的记录撑起来。检测人员对这两个 82 分要做的事完全不同,可惯常的风险报表只显示一个数字,把这层差别抹平了。纵横国际官网在讨论风险模型时,把“分数怎样拆开”当作与“分数是多少”同等重要的输出。
先把批次 A 的 82 分拆成五块
下面的数字是示意,不对应任何真实批次。
| 组成项 | 贡献 | 怎么读 | 对应的核查动作 |
|---|---|---|---|
| 基线 | 14 | 模型对一个普通批次的平均预测 | 作为起点,无需动作 |
| 供应商历史 | +18 | 该供应商过往记录把分数往上推 | 调出近期全部批次,看异常是否集中在少数几次 |
| 季节 | +12 | 当前季节同类产品历史上偏高 | 补充与季节性风险对应的检测项目 |
| 产品类别 | +21 | 训练数据里这类产品的记录偏高 | 当背景信息,先排除抽检密度的影响 |
| 既往检测记录 | +17 | 与该批次相关的历史检测偏高 | 回到原始记录逐条核对 |
| 合计 | 82 | 14 + 18 + 12 + 21 + 17 | 按贡献从大到小逐项处理 |
换成瀑布图,就是从 14 起步,一项接一项向上垒,最后停在 82。最长的一块是产品类别的 +21,可它恰恰是检测人员最没法改变的一项;能立刻转成动作的是供应商历史与既往检测记录,两项合计 +35。“最大”和“最有用”并不总是同一项。
同样是 82 分,批次 B 的读法完全不同
批次 B 的拆解(同样是示意):基线 14,供应商历史 +41,季节 +4,产品类别 +6,既往检测记录 +17,合计 14 + 41 + 4 + 6 + 17 = 82。将近一半的风险来自供应商这一项,收货口应先把这家供应商最近几批的记录全部拉出来,再核对它的供货来源近期有没有变化。
批次 A 的分数由三项中等大小的因素分摊,没有哪一项能单独说明问题,更像几个背景条件叠在了一起,按常规加检补足项目即可。两批的分数并列,该查的方向却不同;只按分数排队,它们会挤在同一个位置,有限的检测名额也就分不清往哪里用。至于供应商历史、季节这些特征为什么要一起放进模型,可以看风险预测为什么不能只看过去的不合格次数。
SHAP 在分数背后做了什么
XGBoost(梯度提升树)先给出预测,SHAP(SHapley Additive exPlanations,沙普利加性解释)再回答一个问题:与全体批次的平均预测相比,每个特征把这一次的预测推高或拉低了多少。它借用合作博弈里的 Shapley 值,把特征想成一起完成任务的队员,一个特征的贡献,是它加入不同组合时带来的平均增量。这样分出来的各项有个好性质:全部相加恰好等于预测值与基线的差,所以能画成瀑布图。对树模型,TreeSHAP 不必枚举所有特征组合,批量计算也来得及。
口径上有一个细节。默认的 SHAP 值是在对数几率(log-odds)空间里相加的,要换成 0–100 的“分”,得先把概率换算出来,再把各项按比例摊回去,摊法不同,各项数字就会略有出入。所以图上的数字适合比较大小,不适合当作精确分值去逐项核对。
对单个批次做拆解,属于局部解释;对大量批次的 SHAP 绝对值求平均,看到的则是模型整体依赖哪些特征。前者服务收货口的一次决定,后者供建模人员检查模型学到了什么:如果全局排第一的是“录入日期”这类与食品风险无关的字段,多半是记录习惯或数据泄漏被模型抓住了。
拆解会在哪里读错
- 相关特征互相分摊。供应商历史与既往检测记录本来就高度相关,模型把功劳记给谁,取决于树的结构与算法口径。17 和 18 之间的差距没有意义,值得读的是量级,+41 与 +4 才是真正的不同。
- 解释的是模型,不是原因。“产品类别 +21”只说明训练数据里这类产品的记录偏高,原因可能是确有风险,也可能是它被抽得更勤、异常更容易被发现和记录,这就是抽样偏差,哪一批更值得检查一文拆过。2026 年 Discover Food 上一项基于 RASFF 数据的研究,把 SHAP 归因与时间先后分析、what-if 敏感性检查和共形预测组合起来用,而不是拿一张贡献图收工。
- 时间泄漏让贡献图好看却没用。训练时若混进了“未来”的信息,比如事后才补录的整改记录,验证分数会很漂亮,这一项在 SHAP 图上也会显得贡献很大。要用时间切分验证:拿过去训练,用之后的时间段检验,再看各项贡献是否仍然稳定。
82 分旁边要有一个范围
图上 82 分的括号写着“约 76–88”(示意)。这个区间回答的是另一个问题:模型对这个数有几分把握。区间窄,意味着训练数据里见过很多相近的批次,按分数排队可以放心;区间宽,通常是碰上了新供应商、新品类或少见的季节组合,拆解里再漂亮的贡献项也得打折。
2026 年 9 月发表在 Frontiers in Food Science and Technology 的一项研究,在欧盟 RASFF 2019–2025 年共 22,643 条通报上做严重程度二分类,经 Platt 校准把校准误差 ECE 由 0.267 降到 0.043,再用共形预测把整体覆盖率做到约 90.3%,其中约 78.4% 的预测集只含一个类别,其余则老老实实标成“两类都有可能”。非洲地区的校准样本最少(n=232),覆盖率约 77.6%,没有达到 90% 的目标:样本少的地方,区间给出的把握也会打折。作者明确说明,这是原型,假设时间平稳,需要部署验证,不是可直接用于监管的系统。
翻译回 82 分:只输出点估计的模型,会把批次 A 和 B 都写成 82;带上范围以后,收货口才分得出“有把握的 82”和“没见过、拿不准的 82”,区间过宽的批次直接交给人工,这就是拒识(reject option)的用法。
拿到拆解以后的核查顺序
- 先读区间,再读分数。区间宽的批次先转人工,不急着相信贡献项。
- 找出能变成动作的项。供应商历史、季节、既往检测记录能对应到具体核查内容;产品类别这类固有属性只当背景。
- 做一次 what-if:把可疑的一项调回平均水平,看分数掉多少。掉得很少,说明分数靠多项叠加撑着,没有单独的问题点。
- 回到原始记录,核对抽检密度和记录口径有没有变化。
- 把当天的拆解与之后的实验室结果一起存档,按季度回看:贡献最大的那一项,后来查出问题的比例有多高。这个比例就是检验解释有没有用的办法。
风险分与拆解在 App 里通常怎样呈现,可以看App 怎样查看批次风险与原因,具体以当前发布版本为准。风险模型在纵横国际 AI 体系里与视觉、光谱模型怎样分工,则见为什么不能只用一个万能大模型。
回到批次 A:“产品类别 +21”究竟是真风险还是抽检偏差,取决于一个模型手里没有、检测人员手里有的数字:过去的抽检里,这类产品被抽到的频率比其他品类高出多少?