一个模型在预测分数上排名第一,不代表它的归因结果可以拿来决定预算怎么分。预测准和归因可信是两个独立的问题,混在一起评估会让错误的模型被选中。
假设某团队对比了六个引擎跑出的 MMM 模型:Ridge、PyMC、Stan、Meridian、Nevergrad 和 LGBM。在共同 holdout 窗口上按 MAPE 和 R² 排序,LGBM 的预测分数最高。如果评选标准只有一个——哪个模型预测最准——团队很容易就把 LGBM 定为冠军,用它输出的渠道归因去调预算。
但在 SparkX 的评分协议里,LGBM 会被自动排除在决策排行榜之外。原因不是它预测不准,恰恰相反,它的预测分数可以是六个模型里最高的。问题在于它输出的渠道贡献度来自 SHAP,而 SHAP 值和需要拿来定预算的增量 ROI,是两种在数学上不同质的量。第一名预测器和可以被采纳的决策依据,并不是同一件事。
本文的案例均为说明原理所构造的假设场景,不对应任何客户的真实数据。文中引用的权重、阈值和打分公式来自 SparkX 评分引擎的实际实现,用于说明评选机制本身。
把冠军评选归结为单一排名,隐含的前提是预测准、归因准、可以拿来决策这三件事天然连在一起。但它们是三个独立的问题:
| 问题 | 回答的是什么 | 哪里可能出错 |
|---|---|---|
| 预测准不准 | 模型在没见过的时间段上能否复制出接近真实的销量或转化 | 过拟合、特征泄露、训练集与测试集分布不一致 |
| 归因准不准 | 把整体销量拆解到各渠道的增量贡献是否接近真实因果效应 | 共线性、先验设定不合理、模型本身不输出因果量(如 LGBM 的 SHAP) |
| 能不能拿来决策 | 归因结果是否稳定、可校准、贝叶斯模型是否收敛 | 参数区间过宽、MCMC 未收敛、没有用 lift test 校准过 |
一个模型可以在预测准上得分很高,同时在归因可信度上得分很低(LGBM 就是典型例子);也可以在归因上看上去合理,但因为贝叶斯链没收敛而不具备被采纳的资格。把三个问题捆在一个分数里,等于用其中一个问题的标准来回答其他两个问题。
SparkX 的评分协议把上述三个问题拆成三个独立的分数,每个分数有自己的入选门槛,分别选出各自的冠军——三个冠军可以是三个不同的引擎:
| 维度 | 回答什么问题 | 入选门槛 |
|---|---|---|
| prediction_score | 模型对整体销量或转化的预测准不准 | 存在对齐的共同 holdout;否则仅作参考,不具备被推荐资格 |
| decision_score | 归因结果是否稳定到足以拿来定预算 | 预测合格 + 贝叶斯收敛 + 参数稳定性达标 + 归因基准可比 |
| interpretation_score | 模型结果能不能被人理解、解释、汇报 | 预测合格 + 归因基准可比 |
关键在于:这三个分数并不是同一套指标的三种加权方式,而是三个各自有门槛、门槛通过才能进入排名池的独立排名。一个模型可以在 prediction 池里排第一,却不在 decision 池的入选范围内;也可以同时入选三个池,但在每个池里排名不同。最终给出的 采用建议banner,只基于 decision_champion——因为预算决策需要的是可以被采纳的归因结果,而不是单纯的预测精度排行。
决策分数和可解释性分数都要求 归因基准可比,这个门槛背后是一个容易被忽略的区分:不同引擎输出的渠道贡献度,衡量的并不是同一件事。SparkX 把归因基准分为三类:
| 归因基准 | 覆盖引擎 | 衡量的是什么 |
|---|---|---|
| incremental(增量) | Ridge、Nevergrad、SparkX、SparkX-Expert、PyMC、Stan、Meridian、Robyn | 相对于该渠道投放为零这个反事实基准,销量会减少多少 |
| shap | LGBM | 相对于模型在该样本上的平均预测值,各特征让预测偏离了多少 |
| unknown | 未识别或自定义引擎 | 不参与跨引擎归因对比 |
属于 incremental 类的引擎,无论算法差异多大,回答的都是同一个问题:拿掉这个渠道的预算,销量会少多少。这个共同基准是跨引擎比较 ROI、合并预算建议的前提。LGBM 的 SHAP 值回答的是另一个问题,和增量 ROI 不是同一个量,因此在决策和可解释性两个维度上都被标记为归因基准不可比,不会和其他引擎的 ROI 放在同一张表里比较。
SHAP(Shapley Additive exPlanations)回答的是一个关于单个样本预测值的问题:对于这一天、这一周的预测结果,各个特征相对于模型的平均预测偏离了多少。它是 预测值相对于期望预测的偏离量,而不是如果完全不投放这个渠道,销量会少多少的零媒体反事实。
这两者在大多数时候方向一致——投放多的渠道,SHAP 贡献度通常也高——但它们不是同一个量,差异在边界情况下会被放大。例如一个渠道的投放长期保持在较高水平,模型学到的期望预测本身已经把这部分投放内化为基准的一部分,这个渠道的 SHAP 值会偏低,但如果真的把它降到零,销量的下降可能远大于 SHAP 显示的贡献度。把 SHAP 值直接乘以某个系数换算成增量 ROI,相当于用一个关于局部偏离的度量去回答一个关于全局反事实的问题,换算结果可能方向对、量级错,也可能方向都不对。
这也是为什么评分协议不是给 LGBM 的归因打一个比较低的分数,而是直接把它标记为归因基准不可比——不是不够好,而是衡量的不是同一件事,因此不参与跨引擎的 ROI 合并排名,也不会被 decision_champion 或 interpretation_champion 选中。
decision_score 的构成,体现了 能不能拿来定预算比预测好不好更看重稳定性:
50 分的收敛惩罚不是调参调出来的数字游戏,而是在明确表态:一个贝叶斯模型如果链没有收敛,它给出的 ROI 置信区间本身就不可信,不管预测分数有多高,都不应该被当作决策依据。
对 PyMC、Stan、Meridian、SparkX-Expert 这类依赖 MCMC 采样的引擎,收敛诊断是进入决策排名前必须通过的硬门槛,分三档:
| 诊断结果 | 判定条件 | 后续处理 |
|---|---|---|
| 未收敛(硬性失败) | R-hat > 1.1,或有效样本数 ESS < 100,或散度(divergence)次数 > 50 | 收敛加分改为扣 50 分,基本退出决策排名 |
| 带警告通过 | R-hat > 1.05,或 ESS < 400,或散度次数 > 10 | 标记为 带警告通过,仍可入选但附带提示 |
| 干净通过 | 以上三项均在更严格的阈值内 | 获得满额的 10 分收敛加分 |
R-hat 衡量多条独立采样链是否收敛到同一个分布,ESS 衡量采样链在去除自相关后等效的独立样本数量,散度次数反映采样器在参数空间里是否遇到了几何上难以探索的区域。三项任意一项触发硬性阈值,就认定链没有收敛——此时模型给出的参数区间和置信区间本身就不可靠,无论预测分数多高,都不足以支撑一个预算决策。
六个引擎各自训练、各自验证,天然会用不同长度的 holdout 窗口——有的引擎默认验证最近 4 周,有的默认 8 周。如果直接拿各引擎自报的 MAPE 数字横向比较,比的其实是不同时间跨度上的误差,不是同一件事。
SparkX 的做法是只取所有已完成训练的模型在 horizon_days 上的交集,作为跨引擎比较的共同 holdout 窗口。如果六个引擎里有一个用的验证窗口和其他五个完全不重叠,系统不会把它的指标硬凑进平均数,而是直接判定不存在共同窗口,跳过这次跨引擎的 holdout 推荐——宁可少给一个结论,也不用不等长的序列拼出一个似是而非的平均值。
这里的 共同窗口和上周讨论的渠道 ROI 随时间漂移是两个不同层面的问题:漂移讨论的是同一个模型在不同训练窗口上估计出不同的系数;这里讨论的是不同模型用不同验证窗口时,它们的误差指标能不能放在一起比较。
interpretation_score 的构成同样是三部分加权:
其中 引擎可解释性基础分是一张和具体数据无关、按引擎类型写死的分值表,反映的是方法本身的透明程度,不随某一次训练结果波动:
| 引擎 | 可解释性基础分 | 原因 |
|---|---|---|
| Ridge | 100 | 线性模型,系数直接对应渠道弹性,结构最透明 |
| PyMC | 88 | 贝叶斯线性结构,附带可解释的不确定性区间 |
| Stan / Meridian | 85 | 同属贝叶斯层级模型,结构可读但实现更复杂 |
| Nevergrad | 76 | 黑盒优化器包裹线性响应曲线,结构部分可读 |
| SparkX-Expert | 72 | 融合多种先验与专家规则,结构复杂度更高 |
| SparkX | 68 | 时变参数结构,系数随时间变化,解释需要额外上下文 |
| LGBM | 45 | 树模型本身是黑盒,依赖 SHAP 近似解释,基础分最低 |
这张表的分值是引擎固有的,不会因为某一次训练数据质量好就变高。一个模型即使预测分数很高、参数也足够稳定,如果本身是黑盒结构,可解释性分数的上限也会被这个基础分锁住——这是在提醒:能不能向业务方讲清楚为什么这么分配预算,和预测准不准,是两件需要分别评估的事。