shap.DeepExplainer

class shap.DeepExplainer(model, data, session=None, learning_phase_flags=None)

旨在为深度学习模型近似 SHAP 值。

这是 DeepLIFT 算法(Deep SHAP)的增强版本,与 Kernel SHAP 类似,我们使用一组背景样本来近似 SHAP 值的条件期望。Lundberg 和 Lee 在 NIPS 2017 的论文中指出,可以选择 DeepLIFT(Shrikumar, Greenside, and Kundaje, arXiv 2017)中的逐节点归因规则来近似 Shapley 值。通过对多个背景样本进行积分,DeepExplainer 估算的 SHAP 值之和近似等于模型在当前输入上的输出与在背景样本上的期望输出之差(f(x) - E[f(x)])。

示例

参见 Deep Explainer 示例

__init__(model, data, session=None, learning_phase_flags=None)

一个用于可微模型并使用给定背景数据集的解释器对象。

请注意,该方法的复杂度与背景数据样本的数量成线性关系。将整个训练数据集作为 data 传入会得到非常准确的期望值,但计算成本会高得不切实际。期望估计的方差大致按 1/sqrt(N) 的比例缩放,其中 N 是背景数据样本的数量。因此,100 个样本可以给出一个不错的估计,而 1000 个样本则可以给出非常好的期望值估计。

参数:
model

如果 framework 是 ‘tensorflow’,则为 (input: [tf.Tensor], output: tf.Tensor)。一对 TensorFlow 张量(或一个列表和一个张量),指定了要解释的模型的输入和输出。请注意,SHAP 值是针对单个输出值的,因此输出的 tf.Tensor 应该是一维输出 (,1)。

如果 framework 是 ‘pytorch’,则为一个 nn.Module 对象(模型),或一个元组 (model, layer),其中两者都是 nn.Module 对象。模型是一个 nn.Module 对象,它接受一个形状为 data 的张量(或张量列表)作为输入,并返回一个一维输出。如果输入是一个元组,返回的 shap 值将是针对 layer 参数的输入。layer 必须是模型中的一个层,例如 model.conv2。

data

如果 framework 是 ‘tensorflow’:[np.array] 或 [pandas.DataFrame] 如果 framework 是 ‘pytorch’:[torch.tensor]

用于积分以消除特征影响的背景数据集。DeepExplainer 会对这些样本进行积分。这里传递的数据必须与第一个参数中给出的输入张量相匹配。请注意,由于需要为每个待解释样本对这些背景样本进行积分,您应该只使用大约 100 或 1000 个随机背景样本,而不是整个训练数据集。

sessionNone 或 tensorflow.Session

包含我们要解释的模型的 TensorFlow 会话。如果传入 None,我们会尽力找到正确的会话,首先查找 Keras 会话,然后回退到默认的 TensorFlow 会话。

learning_phase_flagsNone 或张量列表

如果您有自定义的学习阶段标志,请在此处传入。在解释预测时,我们需要确保模型不处于训练模式,因为这会改变批量归一化(batch norm)或 dropout 等操作的行为。如果传入 None,我们会在计算图中查找看起来像学习阶段标志的张量(这适用于 Keras 模型)。请注意,我们假设在预测(以及解释)期间,所有标志的值都应为 False。

方法

__init__(model, data[, session, ...])

一个用于可微模型并使用给定背景数据集的解释器对象。

explain_row(*row_args, max_evals, ...)

解释单行数据并返回元组 (row_values, row_expected_values, row_mask_shapes, main_effects)。

load(in_file[, model_loader, masker_loader, ...])

从给定的文件流加载一个解释器。

save(out_file[, model_saver, masker_saver])

将解释器写入给定的文件流。

shap_values(X[, ranked_outputs, ...])

为应用于给定数据 X 的模型返回近似的 SHAP 值。

supports_model_with_masker(model, masker)

判断此解释器是否能处理给定的模型。

explain_row(*row_args, max_evals, main_effects, error_bounds, outputs, silent, **kwargs)

解释单行数据并返回元组 (row_values, row_expected_values, row_mask_shapes, main_effects)。

这是一个抽象方法,需要由每个子类实现。

返回:
tuple

一个元组 (row_values, row_expected_values, row_mask_shapes),其中 row_values 是每个样本的归因值数组,row_expected_values 是表示每个样本的模型期望值的数组(或单个值)(除非存在固定的输入,例如解释损失时的标签,否则所有样本的期望值都相同),而 row_mask_shapes 是所有输入形状的列表(因为 row_values 总是被展平的)。

classmethod load(in_file, model_loader=None, masker_loader=None, instantiate=True)

从给定的文件流加载一个解释器。

参数:
in_file用于加载对象的文件流。
save(out_file, model_saver='.save', masker_saver='.save')

将解释器写入给定的文件流。

shap_values(X, ranked_outputs=None, output_rank_order='max', check_additivity=True)

为应用于给定数据 X 的模型返回近似的 SHAP 值。

参数:
X列表,

如果 framework 是 ‘tensorflow’:np.array 或 pandas.DataFrame;如果 framework 是 ‘pytorch’:torch.tensor。一个样本张量(或张量列表),用于解释模型在其上的输出(其中 X.shape[0] == # 样本数)。

ranked_outputsNone 或 int

如果 ranked_outputs 为 None,则解释多输出模型中的所有输出。如果 ranked_outputs 是一个正整数,则仅解释模型输出中排名前 N 的输出(“排名”由 output_rank_order 决定)。注意,这将返回一个值对 (shap_values, indexes),其中 shap_values 是一个 NumPy 数组列表,对应每个输出排名;而 indexes 是一个矩阵,指示每个样本选择了哪些输出索引作为“排名靠前”的输出。

output_rank_order“max”、“min” 或 “max_abs”

在使用 ranked_outputs 时,如何对模型输出进行排序,可以是按最大值、最小值或最大绝对值。

返回:
np.array 或 list

估计的 SHAP 值,通常形状为 (# 样本数 x # 特征数)

返回数组的形状取决于模型输出的数量

  • 单个输入,单个输出:形状为 (#num_samples, *X.shape[1:]) 的矩阵。

  • 单个输入,多个输出:形状为 (#num_samples, *X.shape[1:], #num_outputs) 的矩阵。

  • 多个输入,一个或多个输出:矩阵列表,其形状为上述之一。

如果 ranked_outputs 是 None,则此张量列表的数量与模型输出的数量相匹配。如果 ranked_outputs 是一个正整数,则返回一个值对 (shap_values, indexes),其中 shap_values 是一个长度为 ranked_outputs 的张量列表,而 indexes 是一个矩阵,指示每个样本选择了哪些输出索引作为“排名靠前”的输出。

在 0.45.0 版本发生变更:对于具有多个输出和单个输入的模型,返回类型从 list 更改为 np.ndarray。

static supports_model_with_masker(model, masker)

判断此解释器是否能处理给定的模型。

这是一个抽象的静态方法,需要由每个子类实现。