当我遇到以下代码块时,我正在学习使用 SHAP 进行深度学习模型解释的教程:
# select backgroud for shap
background = x_train[np.random.choice(x_train.shape[0], 1000, replace=False)]
# DeepExplainer to explain predictions of the model
explainer = shap.DeepExplainer(model, background)
# compute shap values
shap_values = explainer.shap_values(x_test_each_class)
这个背景数据集的用途是什么?
为了获得 SHAP 值,我们需要计算两个期望之间的差异(参考。https://arxiv.org/pdf/1705.07874.pdf - 方程(8)和(9))。
我们无法通过分析方式计算这些期望,因此使用蒙特卡罗估计。背景数据集用于生成用于计算这些估计值的样本。
当然,如果背景数据集发生变化,估计也会发生变化,因此 SHAP 值也会发生变化。
考虑一个涉及四个特征的场景:A、B、C 和 D。
对于个体i,其特征值分别为4、6、7、-1。
在计算 C 特征的“平均边际贡献”时,将其引入个体 i 的特征 A 和 B 的组合(计算 Shapley 值的关键步骤)时,采用以下过程:
维持个体“i”的固定特征A、B和C的值(A = 4,B = 6,C = 7)。
创建一个人工个体j,其A和B的值与个体i相等。
随机选择一个
donor
。
利用特征 D 的
donor
的值作为个体 i 和 j 的特征 D 的值(例如 donor
的 D 值为 3)。
使用特征 C 的
donor
值作为个体 j 的特征 C 值(例如,donor
的 C 值为 9)。
最终,计算以下之间的差异:
a.对于个体“i”:f(A = 4, B = 5, C = 7, D = 3)
b.对于个体“j”:f(A = 4, B = 5, C = 9, D = 3)
迭代重复步骤 2 到 5。这个迭代过程有效地减轻了特征 D 的影响,允许在假设 A = 4 和 B = 5 的情况下确定特征 C 的孤立影响。
这些
donors
是从背景分布中随机抽取的。