↓ Skip to main content
  1. Posts/

模型为什么这样预测?从 Permutation Importance 到 SHAP,重新理解神经网络可解释性

·11143 words·23 mins
Note: This article is available in Chinese only. 本文暂无英文版本。 View original

起因
#

之前在量化团队做 ML Infra 相关工作时,我曾参与过期货预测模型的特征重要度评估与特征筛选系统。

在那套系统里,Permutation Importance(置换重要度)是最核心的算子之一。当时我们面临的工作负载非常庞大:针对上千维的输入特征,要在多个交易日的数据上反复进行特征随机置换、模型前向推理以及评价指标的计算。在很长一段时间里,我的注意力几乎完全被系统层面的工程瓶颈吸引——如何降低内存拷贝、如何把推理批次打满、如何避免在不同特征扰动之间重复扫描数据。计算耗时被压下来之后,整套流水线跑得很顺,我也就习惯性地把这套指标当作特征评价的标准答案。

直到最近继续整理 MIT 6.S191(Lecture 6: New Frontiers)关于模型理解与可信深度学习的内容,接触到局部解释、LIME 以及 SHAP 时,我才开始回过头重新审视自己早已习以为常的工作流程。

当时脑子里冒出了几个很基础、但过去被我略过的疑问:

  1. 如果一个神经网络的前向计算代码完全开源,权重参数精确可知,为什么我们依然很难解释它究竟根据什么做出了预测?
  2. 在模型上打乱某个特征测出来的性能下降,真的能代表这个特征本身的预测价值吗?
  3. 如果模型在某一天、某一个具体的交易时点给出了强烈的预测信号,全局的特征重要度排名能帮我解释这一次具体决策吗?

带着这些问题顺藤摸瓜,我发现过去自己混淆了几个看似相邻、实则目标迥异的概念:模型依赖哪些特征(Feature Importance)、哪些特征值得保留(Feature Selection),以及模型针对某一次具体样本为什么这样预测(Local Interpretability)。

这篇文章想把这段从工程实践到模型可解释性理论的思考链条记录下来。

计算过程透明,为什么决策逻辑仍然不透明?
#

在讨论各种解释算法之前,先得澄清一个最直觉的矛盾。

很多刚接触机器学习的人会问:神经网络被叫作“黑盒”,到底黑在哪里?

如果说黑盒是指无法观察内部运作,那深度学习显然不是。以一个最基础的多层感知机(MLP)为例:

$$ \hat{y} = W_2 \cdot \sigma(W_1 x + b_1) + b_2 $$

从输入向量 \( x \)、权重矩阵 \( W_1, W_2 \)、偏置向量 \( b_1, b_2 \),到激活函数 \( \sigma \),所有的数值都在显存里清清楚楚地躺着。只要给定输入,CPU 或 GPU 执行确定性的浮点数乘加运算,就能在微秒级时间内精确计算出输出标量 \( \hat{y} \)。没有任何随机隐变量,每一条执行路径都完全透明。

但在可解释性的语境下,这种透明度仅仅属于计算过程透明(Algorithmic Transparency)。

计算过程透明与决策逻辑不透明的对比

知道浮点数是如何一步步算出来的,绝不等于理解模型依托了怎样的逻辑规则在做决策。

当输入特征维度扩展到几百甚至上千维,经过若干层包含非线性激活函数的密集投影后,原本各自独立的特征在隐藏层空间中被深度纠缠在一起。输出的某一个变化,往往是由成百上千个微小权重的非线性协同效应共同导致的。

如果业务方或者交易员跑来问: “在刚才这个时点,模型为什么把预测值从 +0.1% 突然推高到了 +0.5%?究竟是哪个指标起了主导作用?”

我们总不能把几百万个参数的矩阵乘法公式打印出来扔给对方。对方需要的不是计算步骤,而是一套具有语义因果感的高层归因解释。

因为无法从高维参数矩阵中直接读出决策逻辑,我们才不得不退而求其次:既然白盒代码读不懂,不如把训练好的网络当成一个黑盒系统,通过从外部主动施加扰动,观察输出的变化来反推其行为。

这就是特征重要度方法的出发点。

从熟悉的 Permutation Importance 说起
#

在众多模型审查工具中,Permutation Importance 是工程上最朴素、也最符合直觉的一种。它的核心思想非常纯粹:如果一个特征对模型极其重要,那么一旦把这个特征的信息彻底破坏掉,模型的预测表现就应该出现显著的崩塌。

期货时序预测中的具体做法
#

在量化预测任务中,模型的输入形式往往因设计而异。我过去参与的期货时序预测模型,使用的并不是带显式时间步的三维张量 (batch_size, sequence_length, feature_num),而是标准的二维表格特征:

$$ X \in \mathbb{R}^{B \times D} $$

其中 \( B \) 是样本批次大小,\( D \) 是特征总维度。这是因为时序预测并不一定非要依赖 RNN 或 Transformer。在很多实际工程中,过去不同时间窗口的价格变动、成交量异动、波动率曲面等动态信息,已经在特征工程流水线中被提炼成了各类滑动窗口统计量,打包编码进了当前时刻的特征向量中。模型按行接收这些时间切片快照,输出对未来收益率或趋势的预测。

在这个背景下,我们计算 Permutation Importance 的基本步骤如下:

  1. 保持已经训练好的模型参数冻结不变。
  2. 选定目标特征 \( j \),打破其原本的数值取值。
  3. 将扰动后的特征矩阵重新喂入模型,得到新的预测序列。
  4. 评估扰动前后模型预测质量的下滑幅度。

但这里有一个极其关键的工程细节:打乱数据时,绝对不能把跨越几个月或几年的所有样本混在一起全局随机打乱,而必须按交易日独立进行置换(Daily Grouped Permutation)。

在期货时序预测中,每天的市场微观结构、波动率基准和参与者情绪往往存在显著的日间环境差异。如果跨交易日混杂置换,等于强行把极端暴跌日的波动率特征拼接到平静窄幅震荡日的样本中,不仅完全脱离了真实的评估口径,还会引入不可控的日间分布污染。

因此,合理的做法是在每个交易日内部独立随机打乱特征 \( j \) 的取值,并逐日计算模型预测值与未来真实标签之间的 IC(Information Coefficient,信息系数)或 RankIC(秩相关系数):

$$ \text{IC}_t = \text{Corr}(\hat{y}_t, y_t) $$

随后对所有评估交易日的指标取算术平均,得到基准 Mean Daily IC,以及置换特征 \( j \) 后的 Mean Daily IC:

$$ \text{Importance}_j = \overline{\text{IC}}_{\text{original}} - \overline{\text{IC}}_{\text{permuted}, j} $$

指标下跌得越剧烈,说明特征 \( j \) 对应的置换重要度越高。

破坏的到底是什么?
#

在初接触这个算法时,很容易产生一种想当然的直觉:按日打乱是不是破坏了时序的连续性?

其实并不准确。前文提到过,模型输入是二维表格,每一行都是一个已经包含了历史聚合信息的自足快照,模型前向推理时是逐行独立处理的,并不直接接收连续时间轨迹。

按交易日独立置换,真正带来致命破坏的是两件事:

第一,彻底切断了特征 \( j \) 与未来预测目标 \( y \) 之间的真实映射。 模型原本试图利用该特征捕捉未来收益信号,现在输入变成了无意义的错位噪点,预测能力自然下降。

第二,彻底撕裂了特征 \( j \) 与其他未扰动特征之间的联合分布。

这第二点,正是 Permutation Importance 在理论上经常遭遇诟病的原因,但在工程实践中,它又引发了另一层更深刻的追问:特征重要度高,真的意味着它在系统里不可替代吗?

特征重要度不等于特征筛选
#

在量化开发中,计算特征重要度往往不是终点,而是手段。我们最终的目标通常是做特征筛选(Feature Selection):从上千个候选特征中精简出一组紧凑、稳健、信噪比高的核心特征集合。

我过去参与的工具链中,有一套典型的迭代特征筛选(Recursive Feature Elimination,RFE)闭环:

逐日 Permutation Importance 与迭代特征筛选流程
  1. 使用当前特征集合训练模型。
  2. 逐日执行 Permutation,计算所有特征的置换重要度。
  3. 按照指标下降幅度降序排列,淘汰排名最末尾 5% 的特征。
  4. 使用剩余 95% 的特征,重置模型并重新训练。
  5. 重复上述流程约 25 轮。

如果初始有 1000 个特征,每轮按 95% 保留:

$$ 1000 \times (0.95)^{25} \approx 277 $$

经过 25 轮淘汰后,最终大约会收敛到 277 个核心特征。

在这个流程中,曾经有一个工程现象让我停下来想了很久:为什么在计算工作量如此巨大的情况下,我们非得每轮淘汰后都把模型重新训练一遍?

直接根据第一轮算出来的 1000 个特征重要度,一口气砍掉后 723 个,难道不行吗?

答案是:绝对不行。因为 Feature Importance 与 Feature Selection 根本回答的是两个完全不同的问题。

一个关于相关特征的思维实验
#

为了把这件事说清楚,看一个极度简化的两特征场景。

假设在期货时序预测中,特征工程产出了两个高度相关的量价特征:

  • \( X_1 \):过去 20 日收益率;
  • \( X_2 \):过去 21 日收益率。

由于这两个特征的时间窗口仅仅相差一天,它们携带的信息高度冗余,相关系数高达 0.99。

现在把它们同时喂给一个神经网络进行训练。在优化器的随机初始化和梯度下降过程中,模型可能会因为极细微的数值先验,碰巧优先依赖了 \( X_1 \),给 \( X_1 \) 分配了较大的权重,而分配给 \( X_2 \) 的权重极小。

训练完成后,我们开始跑 Permutation Importance:

  • 打乱 \( X_1 \):模型预测依赖的核心输入被破坏,Mean Daily IC 出现显著下滑。计算结果显示 \( X_1 \) 重要度极高。
  • 打乱 \( X_2 \):由于当前模型原本就几乎没怎么使用 \( X_2 \),打乱它对输出几乎没有任何扰动,Mean Daily IC 分毫不动。计算结果显示 \( X_2 \) 重要度接近于零。

如果仅仅根据这一轮的特征重要度结果做决策,我们会得出结论:\( X_1 \) 是核心特征,而 \( X_2 \) 是毫无价值的垃圾特征。

但如果我们把 \( X_1 \) 直接从数据集里剔除,重新训练一个新模型,奇妙的现象发生了: 失去了 \( X_1 \) 的掩护,优化器在反向传播时会自然而然地转向功能完全等价的 \( X_2 \)。重新训练出的模型,其测试集 IC 可能与最初包含 \( X_1 \) 时完全没有统计差异。

反过来,还存在另一种完全相反的极端情况: 如果模型在训练中把信息平均分配给了两个强相关特征。当我们单独打乱 \( X_1 \) 时,由于 \( X_2 \) 完好无损地提供了 99% 的冗余信息,模型性能可能根本不跌;单独打乱 \( X_2 \) 时也是如此。结果两个特征的 Permutation Importance 都显得平平无奇,但如果你同时把它们俩都删掉,模型性能却会遭遇毁灭性打击。

提炼认知:三个问题的边界
#

这个例子揭示了一个极为关键的洞察:

Feature Importance 衡量的是当前这一个特定参数状态下的模型,对各个输入特征的静态敏感程度; 而 Feature Selection 探寻的,是特定特征在重新优化后对系统整体性能的增量预测价值(Incremental Predictive Value)。

特征重要度、特征筛选与局部归因的三个不同视角

特征重要度从来不是特征本身固有的物理属性。它是当前模型结构、参数收敛点、输入特征组合、数据分布以及评估指标共同作用下的一个派生状态。

一旦删除了某些特征,模型内部的参数会重构,特征之间的替代关系会洗牌,剩余特征在新模型里的重要度也会随之天翻地覆。这就是为什么迭代特征筛选必须每轮重新训练——我们必须让剩余的特征在新的博弈格局下重新证明自己。

全局重要度解释不了单次预测
#

理清了特征重要度与特征筛选的差别后,我在理解可解释性的路上又遇到了下一个断层。

哪怕我们通过极其昂贵的算力,把全局特征重要度估计得非常精准——比如明确知道在全年的测试区间里,动量类特征平均贡献了 40% 的指标波动,波动率类特征贡献了 30%——这依然只能回答宏观层面的问题。

这属于 全局可解释性(Global Interpretability):它描绘的是模型在整个数据集上的平均行为画像。

但在真实的生产场景中,工程师和交易员经常要面对的是微观维度的质询:

“今天上午 10:15,模型给某主力合约输出了一个极高的买入得分(预测未来收益率达到 +0.5%)。为什么模型在这一分钟这么看多?是哪几个特征在推波助澜,有没有特征在反向预警?”

面对这种针对单次推理的审计需求,Permutation Importance 完全无能为力。

我们不可能为了解释某一个样本,去把这个样本的特征打乱重新推理。对单个样本打乱特征,既没有统计方差可言,也算不出相关的 IC 指标。

要解释单次预测,我们需要一套全新的心智模型:局部可解释性(Local Interpretability)。

LIME:局部线性近似的切片视角
#

在局部可解释性领域,最先引起广泛关注的算法之一是 LIME(Local Interpretable Model-agnostic Explanations)。

LIME 的出发点非常巧妙,它没有试图去把全局深不可测的神经网络彻底解析清楚,而是换了一个视角:既然复杂模型在整个高维空间内的非线性曲面无法用简单的数学公式表达,那么只盯着某一个样本点附近极其狭窄的邻域,能不能用一个简单的线性模型去贴合它?

LIME 局部线性代理模型心智模型

这就像高等数学里的微分与泰勒展开:地球表面是一个巨大的球体,在宏观上是高度弯曲的;但在我们站立的方圆几米之内,把地面看成一个平整的切平面,误差是可以忽略的。

LIME 解释单次预测的具体步骤可以拆解为:

  1. 选定待解释的目标样本 \( x_0 \):模型在该样本上给出了预测值 \( \hat{y}_0 = f(x_0) \)。
  2. 在局部生成扰动采样:在 \( x_0 \) 周围撒点,生成数百个微小偏移的扰动样本,并使用原复杂神经网络对这些扰动样本逐一进行推理预测。
  3. 计算空间临近权重:根据扰动样本与原始样本 \( x_0 \) 之间的距离,赋予它们不同的权重——离 \( x_0 \) 越近的样本,权重越高;离得较远的样本,权重迅速衰减。
  4. 训练一个可解释的局部代理模型:使用带权最小二乘法,在这些扰动样本上拟合一个简单的线性回归模型(或浅层决策树):
$$ g(z) = w_0 + \sum_{i=1}^D w_i z_i $$
  1. 提取局部线性系数:线性模型的权重系数 \( w_i \),就直观反映了在 \( x_0 \) 附近,各个特征变动对预测值升降的局部边际影响。

LIME 的优势在于思想极其干净,并且它是完全模型无关的(Model-Agnostic),不需要修改原神经网络的权重,也不要求模型可微。

但稍微深入思考,就会发现它的致命软肋:局部代理模型的质量完全取决于人为定义的扰动机制和邻域范围。

如果扰动范围选得过大,复杂模型的非线性波动就会把线性拟合彻底击穿;如果扰动范围选得过小,由于浮点精度或网络局部饱和,拟合出的系数又可能充满噪声。更令人不安的是,因为内部依赖随机采样,针对同一个样本执行两次 LIME,拟合出来的线性系数很可能并不一致。

我们需要一种更严密、具备确定性数学公理支撑的贡献分配方案。

这就是 SHAP。

SHAP:合作博弈论下的特征贡献分配
#

SHAP(SHapley Additive exPlanations)将视角转向了经典微观经济学中的合作博弈论(Cooperative Game Theory),特别是 1953 年由诺贝尔经济学奖得主 Lloyd Shapley 提出的 Shapley Value。

在学习 SHAP 时,最容易被各类论文中复杂的组合数学公式劝退。但抛开形式化的符号,SHAP 的核心思想其实源于一个非常生活化的分配问题。

一个量化预测的小例子
#

假设我们的模型只有两个输入特征:

  • 特征 \( A \):动量因子(Momentum);
  • 特征 \( B \):波动率因子(Volatility)。

现在针对某个期货时序样本,我们有一套预先约定好的参考基准和特征缺失处理机制,得到如下模型输出(为了方便展示,这里的数值纯属教学设定):

  • 两个特征的信息都不提供时,基准预期输出为:0;
  • 只提供特征 \( A \) 的信息时,模型预测输出为:1;
  • 只提供特征 \( B \) 的信息时,模型预测输出为:2;
  • 同时提供特征 \( A \) 和 \( B \) 时,模型最终预测输出为:5。

现在最终的预测结果是 5。我们要问:这个 5 里面,究竟有多少是特征 \( A \) 的功劳,有多少是特征 \( B \) 的功劳?

初看这道题,直觉马上就会打架: 如果单独看,\( A \) 的边际贡献是 1,\( B \) 的边际贡献是 2。两者直接相加:

$$ 1 + 2 = 3 \neq 5 $$

两个特征联合生效时,产生了强烈的非线性协同效应,凭空多出了 \( 5 - 3 = 2 \) 点额外增量。这多出来的 2 点收益,该归谁?

Shapley Value 给出的解决方案是:考察所有可能的特征加入次序,计算特征在不同联盟中的平均边际贡献。

对于两个特征,只存在两种可能的排列顺序:

情况一:特征 \( A \) 先登场,特征 \( B \) 后加入。

  • 在空集合中加入 \( A \),\( A \) 带来的边际增益为:\( 1 - 0 = 1 \);
  • 紧接着在已有 \( A \) 的基础上加入 \( B \),此时输出从 1 跃升到了 5,因此 \( B \) 带来的边际增益为:\( 5 - 1 = 4 \)。

情况二:特征 \( B \) 先登场,特征 \( A \) 后加入。

  • 在空集合中加入 \( B \),\( B \) 带来的边际增益为:\( 2 - 0 = 2 \);
  • 紧接着在已有 \( B \) 的基础上加入 \( A \),此时输出从 2 跃升到了 5,因此 \( A \) 带来的边际增益为:\( 5 - 2 = 3 \)。

由于在没有先验偏好的情况下,两种特征进入的顺序是完全等可能的,我们对两种情况下的边际贡献取算术平均:

$$ \phi_A = \frac{1 + 3}{2} = 2 $$$$ \phi_B = \frac{2 + 4}{2} = 3 $$

把分配给两个特征的贡献值与最初的基准值相加:

$$ \text{Baseline} + \phi_A + \phi_B = 0 + 2 + 3 = 5 $$

分毫不差。原本在非线性交互中纠缠不清的协同收益,被以一种高度对称、公平的方式拆解归属到了各个输入特征上。

加性特征归因与 Waterfall 分解
#

推广到包含 \( D \) 个特征的通用场景,SHAP 将模型在特定样本 \( x \) 上的预测输出 \( f(x) \),严格表达为基准值与各个特征 Shapley 值之和:

$$ f(x) = \phi_0 + \sum_{i=1}^D \phi_i(x) $$

其中:

  • \( \phi_0 = \mathbb{E}[f(X)] \) 是模型在背景参考数据集上的期望预测值(Baseline);
  • \( \phi_i(x) \) 是第 \( i \) 个特征在当前样本上分配到的贡献值。
SHAP 单次预测的加性瀑布分解示意

这个加性分解公式在工程上极其美妙。无论底层神经网络叠加了多少层残差块、注意力机制或复杂的非线性激活,在某一次具体预测的终点,我们都能像财务报表记账一样,绘制出一张清晰的瀑布图(Waterfall Plot):

从期望基准值出发,哪些特征给出了正向推动,哪些特征在拉低评分,所有分项加合精确等于模型当下的预测输出。

需要说明的是,Baseline 并不是凭空写死的常数 0,它是由解释算法设定的背景参考集所决定的期望输出;同时,SHAP 值的量纲也完全对应于模型当前的输出空间(如果模型输出的是未经过 Sigmoid 的原始 Score,SHAP 值的单位就是 Score;如果输出是收益率百分比,SHAP 值才对应于收益率的加性变动)。

一个极易误解的问题:SHAP 贡献究竟代表什么?
#

在最初学习 SHAP 时,我曾产生过一个非常强烈的直觉误区,这个误区在很多初学者甚至算法工程师中都相当普遍。

看一个具体场景:

在某次期货预测中:

  • 模型输出的基准值 \( \phi_0 = +0.1\% \);
  • 动量特征(Momentum)算出的 SHAP 值为 \( \phi_{\text{mom}} = +0.3\% \);
  • 波动率特征的 SHAP 值为 \( \phi_{\text{vol}} = -0.1\% \);
  • 其余特征合计净贡献为 \( +0.2\% \);
  • 最终模型输出为 \( \hat{y} = +0.5\% \)。

看到这里,有人可能会很自然地下结论: “既然动量特征在这次预测里贡献了 +0.3% 的涨幅,那如果我把动量特征删掉,模型的预测值是不是就会变成 \( 0.5\% - 0.3\% = +0.2\% \)?”

答案是:绝对不一定。

这个直觉之所以会错,是因为它悄悄混淆了三种本质完全不同的操作:

操作一:在当前模型中,把动量特征的输入值篡改成 0
#

神经网络是一个复杂的非线性函数。把某个输入维度的取值从原本的 1.5 改成 0,并不等于把这个特征的信息“从系统里优雅地剥离”。

输入为 0 依然是一个具有明确几何意义的特征向量。它会与第一层权重矩阵的第一列相乘,经过偏置相加后传入激活函数。如果这个特征在训练时均值不是 0,直接设为 0 本身就可能触发严重的非线性扭曲,甚至把隐藏层神经元推入完全未知的激活状态。模型输出的变化完全由网络局部的非线性斜率决定,绝不会恰好等于 0.3%。

操作二:在 SHAP 算法的虚拟定义下,剥离动量特征的信息
#

SHAP 在计算边际贡献时,确实需要评估“没有动量特征时模型的输出”。但在现实中,我们训练好的神经网络是不允许动态减少输入维度的。

为了在数学上模拟“缺失特征”,算法通常采用**边缘化(Marginalization)**的方式:从一个背景参考数据集中采样大量样本,把它们的动量特征取值替换过来,然后计算原模型在这些混合样本上的预测期望值。

换句话说,SHAP 的所谓“去除该特征”,是在固定当前网络权重的前提下,用背景分布对该特征进行期望积分的数学模拟。这是一种针对博弈分配公理量身定做的虚拟测算,并不是物理意义上的切断连接。

操作三:彻底从训练集里删除动量特征,重新训练一个新模型
#

这就是第四章讨论过的特征筛选逻辑。

如果我们把动量特征从特征池里彻底删掉,重新训练网络,模型可能会迅速激活原本被压制的其他相关特征(比如均线发散度、委托订单流不平衡等)。重训后的新模型在面对同一个市场样本时,完全有可能通过其他特征组合,重新给出 +0.5% 的预测。

SHAP 值为 +0.3%,既不代表把特征改为 0 预测就会下降 0.3%,也不代表删除特征重新训练后性能会损失 0.3%。

它唯一的严格含义是:在当前冻结的模型结构与预设的背景参考分布下,按照 Shapley Value 严谨的合作博弈公理,动量特征从当前预测偏离基准的总量中,分摊到了 +0.3% 的解释份额。

把加性分配的会计记账结果,误当成物理世界的因果干预手段,是可解释性应用中最容易翻车的一步。

SHAP 与 Permutation Importance 的对比与联系
#

回到我的量化工程视角,把 SHAP 和 Permutation Importance 放在一起对比,能够帮助我们更清晰地把握两者的定位。

维度Permutation ImportanceLIMESHAPFeature Ablation(特征消融)
核心思想随机打乱特征破坏映射,观察整体指标回撤样本周围扰动采样,拟合局部线性切片代理遍历特征子集,按合作博弈论计算平均边际贡献从特征集中直接剔除特征,评估系统指标变动
解释目标全局模型性能(如 Mean Daily RankIC)单次样本预测(局部线性系数)单次样本预测(加性归因展开)特征集合的增量价值
是否重训原模型否(仅使用冻结模型反复推理)否(仅在局部拟合轻量代理模型)否(仅在背景集上积分或解析求导)是(必须重新训练以检验适应性)
输出形式标量:每个特征对应的性能下降幅度局部权重向量:各特征局部斜率加性贡献向量:\( \sum \phi_i = f(x) - \mathbb{E}[f] \)标量:模型重训后的整体性能差值
主要局限无法解释单次样本;容易构造出破坏联合分布的荒谬输入局部代理未必准确;对扰动范围敏感;采样存在随机方差组合计算复杂度高;不代表因果干预;依赖参考基准设定计算成本极其高昂;特征组合爆炸时无法穷举
适合回答的问题“当前模型整体最依赖谁的破坏?”“这个具体样本附近的大致趋势是什么?”“本次预测为什么偏离均值,各特征分配多少?”“把这个特征彻底删掉,重训后系统会崩吗?”

在实际工程中,很多人会尝试通过对验证集上所有样本的 SHAP 绝对值取平均,来构造一个全局的“SHAP 全局特征重要度”:

$$ \text{Global SHAP}_j = \frac{1}{N} \sum_{k=1}^N |\phi_j(x_k)| $$

虽然这个排名能够很好地反映各个特征在日常推理中参与构建输出的活跃程度,但我曾经产生过的困惑依然需要明确解答:

平均绝对 SHAP 值排第一的特征,能直接替代 Permutation Importance 去做特征筛选吗?

答案依然不能盲目画等号。

SHAP 衡量的是特征对模型输出绝对数值的撬动幅度,而量化特征筛选看重的是特征对**最终评估指标(如 RankIC 排序能力或特定策略盈亏)**的边际支撑。一个特征可能在很多样本上贡献了较大的绝对数值波动,但这些波动如果大多属于无法带来排序增量的噪声,它在 Permutation 检验下的 RankIC 降幅可能非常平庸。

两者衡量的物理量不同,服务的目标不同,在工程上可以互为参照,但绝对不能简单替代。

模型解释不等于现实世界的因果机制
#

在关于可解释性的所有思辨中,最重要的一条边界莫过于:

解释模型的预测行为(Explaining Model Behavior),和解释现实世界的真实机制(Explaining the Real World),是两件完全不同的事。

我们在量化或者各类工业场景中训练机器学习模型,本质上使用的是经验风险最小化(ERM)。模型的目标是在历史训练集给定的损失函数下,寻找一组最能拟合输入特征与标签之间统计相关性的权重。

假设在一个期货时序预测模型中:

  • SHAP 瀑布图显示,动量特征(Momentum)对当前强烈的看多预测提供了 +0.3% 的巨额正向贡献;
  • Permutation Importance 同样证明,打乱动量特征会导致全年的 Mean Daily RankIC 遭遇断崖式下跌。

这是否意味着:在真实的金融市场中,正是因为动量指标的抬升,才直接导致了未来价格的上涨?

答案显然是否定的。

模型所捕获到的,仅仅是历史数据中动量与未来价格在统计上的共变关系。这种关联在现实世界中可能有着截然不同的底层归因:

  • 它可能来源于当时市场整体的宏观资金面宽松或极端风险偏好抬升(共同混杂因子);
  • 它可能来源于同一交易板块内其他关键品种的领先外溢效应;
  • 甚至,它可能仅仅是某一段特定市场微观结构下偶然形成的伪相关(Spurious Correlation)。

模型只能告诉你:“根据我过去调优得到的权重矩阵,看到这个特征取值,我倾向于给出更高的输出预测。”

它完全没有能力证明:“如果在现实世界中主动施加干预,强行改变这个特征的取值,未来的真实收益率就会按照这个幅度同向变动。”

主动干预产生的因果效应(Causal Effect),和被动观察到的条件关联(Observational Correlation),在统计学上横亘着巨大的鸿沟。把模型对特征的重度依赖,盲目附会为现实世界的因果律,是数据科学领域最具诱惑力、也最危险的认知陷阱。

可解释性与泛化、分布偏移的交汇
#

把视线放宽,可解释性并不是一座孤岛。它与我此前在博客里讨论过的两个主题有着非常深层的内在呼应:

  1. 从随机标签实验重新理解深度学习泛化:能记住,为什么还能泛化?
  2. 为什么测试集表现很好,模型上线后仍然可能失败?——从 Distribution Shift 到 Extrapolation

在聊随机标签实验时我们看到,超大容量的神经网络完全具备死记硬背纯随机噪声的能力。这意味着,哪怕模型在真实数据上收敛了,它在局部学到的决策逻辑依然可能夹杂着某些极度脆弱的虚假映射。

紧接着在探讨分布偏移与外推时我们发现:由于高维空间的极端稀疏性,模型一旦遭遇未见过的市场环境(Concept Drift),或者样本落入训练数据缺乏覆盖的外推荒原,它不仅会预测失败,而且还会盲目给出虚妄的高置信度。

把可解释性工具代入到这个语境下,它究竟扮演着什么角色?

可解释性是一个极其优秀的调试探针,但它绝不是模型泛化能力的免死金牌。

我们经常会看到这样的场景: 工程师拉出了某次预测的 SHAP 贡献图,看到模型主要依赖动量、波动率和盘口利差,每个特征的贡献方向似乎都非常“符合常识”、“合乎逻辑”,于是便放心地认为模型已经掌握了稳健的客观规律。

这种自我安慰是极其脆弱的。

首先,符合直觉的解释完全可能来自伪相关。当底层市场机制重构(发生 Concept Drift)时,过去有效的特征关联可能彻底脱钩。模型依然会一本正经地给动量特征打上 +0.3% 的 SHAP 高分,并以极度自信的态势输出看多信号,但真实市场的反馈却可能直接给出一记耳光。

其次,正如我们在探讨高维盲区时提到过的,像 Permutation Importance 这样强行在特征列上进行置换的操作,本身就是在高维空间中强行制造大量现实市场极少出现的“怪异组合”(例如极高的成交量配合死寂的极端低波动)。模型在这些外推样本上的表现,本身就已经脱离了真实数据流形的约束。

最后,在迭代特征筛选(RFE)中还有一个很容易被忽视的隐式风险:如果我们反复使用同一个历史验证区间来跑 25 轮淘汰,模型虽然没有在验证集上更新梯度,但整套特征选择逻辑却在通过“生存淘汰”机制,悄无声息地向该验证集的特定噪声形态逐步过拟合。因此,最终筛选出的精简特征组合,必须在严格隔离的时间外数据(Out-of-Time,OOT)甚至跨周期的不同市场状态下重新接受审视。

可解释性能够帮我们审查模型的思考路径是否合规、定位反常的特征依赖、提出可供检验的假设;

但它永远无法单凭一张漂亮的贡献分配图,直接替模型在未来生产环境中的泛化表现开出保证书。

写在最后
#

从过去在 ML Infra 工作中纯粹关注特征重要度计算的吞吐与延迟,到今天系统梳理可解释性的理论脉络,我脑海中关于“解释”的认知边界经历了三次收拢:

第一层,特征重要度不是特征自身的固有属性,而是与当前模型强绑定的静态敏感度。 高重要度不等于高增量预测价值。两组强冗余的特征可能因为优化器的随机扰动而在重要度上表现得天差地别,但删除之后系统的可替代性却极其从容。做特征筛选必须考虑重训后的博弈重构。

第二层,宏观的全局排名无法代替微观的单次归因。 Permutation Importance 能够告诉我们模型在全局测试集上对哪个维度的破坏最敏感,但面对单次具体的预测输出,我们必须依赖 LIME 的局部切片视角,或者 SHAP 在合作博弈论下对边际贡献的公平加性拆解。更重要的是,加性拆解是一套账目分配规则,绝不能轻率等同于物理干预后的输出变化。

第三层,解释模型的行为,不等于洞察现实的因果。 无论是置换还是 Shapley 分配,所有这些算法都只是在用数学探针描摹冻结在模型权重里的统计关联。它们能向我们坦白神经网络在暗室中抓住了哪些线索,但无法回答现实世界为什么会这样运转。

承认可解释性工具的局限,并不妨碍它们的实用价值。

我们永远无法靠可解释性一揽子解决泛化衰退与因果推断的终极难题;

但至少,在面对那几百万个冰冷的浮点数矩阵乘法时,我们不再是一无所知的局外人。

参考资料
#

  • MIT 6.S191: Introduction to Deep Learning (Lecture 6: New Frontiers) — http://introtodeeplearning.com/
  • Breiman, L. Random Forests, Machine Learning 45, 5–32 (2001) [Permutation Feature Importance 原始思想]
  • Ribeiro, M. T., Singh, S., & Guestrin, C. "Why Should I Trust You?": Explaining the Predictions of Any Classifier, KDD 2016 — https://arxiv.org/abs/1602.04938 [LIME]
  • Lundberg, S. M., & Lee, S.-I. A Unified Approach to Interpreting Model Predictions, NeurIPS 2017 — https://arxiv.org/abs/1705.07874 [SHAP]
  • Shapley, L. S. A Value for n-Person Games, Contributions to the Theory of Games 2.28 (1953): 307-317

Related

从随机标签实验重新理解深度学习泛化:能记住,为什么还能泛化?

起因 # 看 6.S191 的课程内容时,讲到 generalization 相关的话题,提到了一篇 2017 年的论文。 说实话,我以前对"泛化"这件事没有太深入地想过。教科书上的经典说法——模型越复杂越容易过拟合,要用正则化控制复杂度——我一直就这么接受下来了。L1、L2、Dropout 这些方法背后的直觉也说得通:限制模型的有效复杂度,不让它过度拟合训练数据中的噪声。没觉得有什么问题。