使用SHAP Explainer计算相同数据得到不同结果该如何解决?
问题原因
你当前使用的是通用shap.Explainer,传入自定义预测函数predict_proba时,SHAP会默认采用带随机抽样的近似算法估算单个特征的SHAP值,抽样过程的随机性导致同一份样本多次计算的单个特征结果存在差异;而SHAP值总和固定是因为该值始终对齐模型预测输出与基准预测值的差,不受抽样拆分过程影响。
解决方案
- 方案1(最优推荐):改用树模型专属的
TreeExplainer
LGBM属于树结构模型,原生支持SHAP的精确计算逻辑,没有随机抽样过程,计算结果完全固定,同时性能远高于通用Explainer。代码修改如下:
# 直接传入训练好的LGBM模型即可,无需传入预测函数和训练数据集 explainerModel = shap.TreeExplainer(my_model)
此时调用explainerModel(X.iloc[:, 0:1]).values多次计算结果完全一致。
- 方案2:固定随机种子(适配通用Explainer场景)
如果因特殊需求必须使用当前的通用Explainer配置,可以在初始化时指定seed参数固定抽样种子,即可保证结果可复现:
explainerModel = shap.Explainer(my_model.predict_proba, X, seed=42)
也可以在计算SHAP值前固定numpy全局随机种子,效果一致:
import numpy as np np.random.seed(42)
- 补充优化:减少随机波动幅度
如果不需要完全固定仅需要降低偏差幅度,可以在初始化Explainer时调大抽样样本数参数nsamples,默认值通常为100,调至200~500可大幅降低单次抽样带来的结果偏差。
内容的提问来源于stack exchange,提问作者Rafa
相关产品推荐
相关产品推荐

