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 传递将提供非常准确的期望值,但成本会不合理地高。期望估计的方差大约与 N 个背景数据样本的 1/sqrt(N) 成比例。因此,100 个样本将提供一个良好的估计,而 1000 个样本将提供一个非常好的期望值估计。
- 参数:
- model
如果 framework == ‘tensorflow’,(input : [tf.Tensor], output : tf.Tensor) 一对 TensorFlow 张量(或一个列表和一个张量),指定要解释模型的输入和输出。请注意,SHAP 值是针对单个输出值而定的,因此输出 tf.Tensor 应该是一个一维输出 (1)。
如果 framework == ‘pytorch’,一个 nn.Module 对象 (model),或一个元组 (model, layer),其中两者都是 nn.Module 对象。model 是一个 nn.Module 对象,它接受形状为 data 的张量(或张量列表)作为输入,并返回一个一维输出。如果输入是一个元组,则返回的 shap 值将是 layer 参数的输入。layer 必须是 model 中的一个层,即 model.conv2
- 数据
如果 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, ...])从给定的文件流加载一个解释器。
save(out_file[, model_saver, masker_saver])将解释器写入给定的文件流。
shap_values(X[, ranked_outputs, ...])返回应用于 X 给定数据的模型的近似 SHAP 值。
supports_model_with_masker(model, masker)判断此解释器是否能处理给定的模型。
属性
modelmaskeroutput_namesfeature_nameslinklinearize_link- explain_row(*row_args: Any, max_evals: int | Literal['auto'], main_effects: bool, error_bounds: bool, outputs: Any, silent: bool, **kwargs: Any) dict[str, Any]
解释单行数据并返回元组 (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: Any, model_loader: Callable[..., Any] | None = None, masker_loader: Callable[..., Any] | None = None, instantiate: bool = True) Explainer | dict[str, Any]
从给定的文件流加载一个解释器。
- 参数:
- in_file用于加载对象的文件流。
- save(out_file: Any, model_saver: str | Callable[..., Any] = '.save', masker_saver: str | Callable[..., Any] = '.save') None
将解释器写入给定的文件流。
- 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 为正整数,则我们只解释前 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:])的矩阵。一个输入,多个输出:形状为
(#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: Any, masker: Any) bool
判断此解释器是否能处理给定的模型。
这是一个抽象的静态方法,需要由每个子类实现。