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)])。
示例
参见 深度解释器示例
- __init__(model, data, session=None, learning_phase_flags=None)[源代码]
使用给定背景数据集的可微分模型的解释器对象。
请注意,该方法的复杂度与背景数据样本的数量成线性关系。将整个训练数据集作为 data 传递将给出非常准确的期望值,但成本过高。期望估计的方差大致按 1/sqrt(N) 的比例缩放,其中 N 是背景数据样本的数量。因此,100 个样本将给出一个良好的估计,而 1000 个样本将给出一个非常好的期望值估计。
- 参数:
- 模型如果框架 == ‘tensorflow’,(输入)[tf.Tensor], 输出tf.Tensor)
一对 TensorFlow 张量(或一个列表和一个张量),用于指定输入和
模型的输出需要解释。注意,SHAP 值是针对单个输出值的,因此输出 tf.Tensor 应该是一个单维度的输出 (,1)。
- 如果框架是 ‘pytorch’,则是一个 nn.Module 对象(模型),或是一个元组(模型,层)。
两者都是 nn.Module 对象
该模型是一个 nn.Module 对象,它以形状为 data 的张量(或张量列表)作为输入,并返回一个单维输出。如果输入是一个元组,返回的形状值将对应于 layer 参数的输入。layer 必须是模型中的一个层,即 model.conv2
- 数据
如果框架是 ‘tensorflow’:[np.array] 或 [pandas.DataFrame] 如果框架是 ‘pytorch’:[torch.tensor] 用于整合特征的背景数据集。Deep 在这些样本上进行整合。这里传递的数据必须与第一个参数中给出的输入张量匹配。请注意,由于这些样本是针对每个样本进行整合的,因此您应该只使用类似 100 或 1000 个随机背景样本,而不是整个训练数据集。
- 会话None 或 tensorflow.Session
包含我们要解释的模型的 TensorFlow 会话。如果传递了 None,我们会尽力找到正确的会话,首先查找 keras 会话,然后回退到默认的 TensorFlow 会话。
- 学习阶段标志None 或张量列表
如果你有自己的自定义学习阶段标志,请在这里传递它们。在解释预测时,我们需要确保我们不在训练模式下,因为这会改变批量归一化或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)。
这是一个抽象方法,旨在由每个子类实现。
- 返回:
- 元组
一个元组 (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)
从给定的文件流中加载一个解释器。
- 参数:
- 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列表,
如果框架是 ‘tensorflow’:np.array,或者如果是 ‘pytorch’:torch.tensor。一个张量(或张量列表)的样本(其中 X.shape[0] == 样本数),用于解释模型的输出。
- ranked_outputs无或整数
如果 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 值,通常形状为
(# 样本 x # 特征)。返回数组的形状取决于模型输出的数量:
一个输入,一个输出:形状为
(#num_samples, *X.shape[1:])的矩阵。一个输入,多个输出:形状为
(#样本数量, *X.shape[1:], #输出数量)的矩阵多个输入,一个或多个输出:矩阵列表,形状为上述之一。
如果 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)
确定此解释器是否可以处理给定的模型。
这是一个抽象静态方法,旨在由每个子类实现。