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 和 Kundaje,arXiv 2017)中每个节点的归因规则来近似 Shapley 值。通过对多个背景样本进行积分,Deep 估计近似 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]

用于积分出特征的背景数据集。 Deep 对这些样本进行积分。此处传递的数据必须与第一个参数中给出的输入张量匹配。请注意,由于为每个样本对这些样本进行积分,因此您应该只使用大约 100 或 1000 个随机背景样本,而不是整个训练数据集。

sessionNone 或 tensorflow.Session

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

learning_phase_flagsNone 或张量列表

如果您有自己的自定义学习阶段标志,请在此处传递它们。在解释预测时,我们需要确保我们不在训练模式下,因为这会更改批处理规范化或 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, ...])

从给定的文件流加载 Explainer。

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=<bound method Model.load of <class 'shap.models._model.Model'>>, masker_loader=<bound method Serializable.load of <class 'shap.maskers._masker.Masker'>>, instantiate=True)

从给定的文件流加载 Explainer。

参数:
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 值。

参数:
Xlist,

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

ranked_outputsNone 或 int

如果 ranked_outputs 为 None,则我们解释多输出模型中的所有输出。如果 ranked_outputs 是正整数,那么我们只解释那么多顶部模型输出(其中“顶部”由 output_rank_order 确定)。请注意,这会导致返回一对值 (shap_values, indexes),其中 shap_values 是每个输出等级的 numpy 数组列表,而 indexes 是一个矩阵,指示对于每个样本,哪些输出索引被选为“顶部”。

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

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

返回:
np.array 或 list

估计的 SHAP 值,通常形状为 (# samples x # features)

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

  • 一个输入,一个输出:形状为 (#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 版本中更改: 具有多个输出和一个输入的模型的返回类型从列表更改为 np.ndarray。

static supports_model_with_masker(model, masker)

确定此解释器是否可以处理给定的模型。

这是一个抽象静态方法,旨在由每个子类实现。