shap.TreeExplainer

class shap.TreeExplainer(model, data=None, model_output='raw', feature_perturbation='auto', feature_names=None, approximate=<object object>, link=None, linearize_link=None)

使用 Tree SHAP 算法来解释集成树模型的输出。

Tree SHAP 是一种快速且精确的方法,用于估计树模型和树集成模型的 SHAP 值,它基于关于特征依赖性的几种不同的可能假设。它依赖于外部模型包内部或本地编译的 C 扩展中的快速 C++ 实现。

示例

请参阅 Tree explainer 示例

__init__(model, data=None, model_output='raw', feature_perturbation='auto', feature_names=None, approximate=<object object>, link=None, linearize_link=None)

为传递的模型构建一个新的 Tree explainer。

参数:
model模型对象

我们想要解释的基于树的机器学习模型。支持 XGBoost、LightGBM、CatBoost、Pyspark 和大多数基于树的 scikit-learn 模型。

datanumpy.array 或 pandas.DataFrame

用于积分出特征的背景数据集。

feature_perturbation="tree_path_dependent" 时,此参数是可选的,因为在这种情况下,我们可以使用每个树路径的训练样本数作为我们的背景数据集(这记录在 model 对象中)。

feature_perturbation“auto”(默认),“interventional” 或 “tree_path_dependent”

由于 SHAP 值依赖于条件期望,我们需要决定如何处理相关(或以其他方式依赖)的输入特征。

  • 如果 "interventional",则需要背景数据集 data。特征之间的依赖关系根据因果推理 [1] 规定的规则处理。运行时与您使用的背景数据集的大小线性缩放:使用 100 到 1000 个随机背景样本都是不错的选择。

  • 如果 "tree_path_dependent",则不需要背景数据集,并且该方法只是跟踪树并使用每个叶子节点的训练示例数来表示背景分布。

  • 如果 "auto",当提供背景时,将使用“interventional”方法,否则将使用“tree_path_dependent”方法。

0.47 版本新增: 添加了 “auto” 选项。

0.47 版本变更: 默认行为将在 0.47 版本中从 “interventional” 更改为 “auto”。将来,在不提供背景数据集的情况下传递 feature_pertubation=”interventional” 将引发错误。

model_output“raw”、“probability”、“log_loss” 或模型方法名称

应该解释模型的哪个输出。

  • 如果为 “raw”,则我们解释树的原始输出,这因模型而异。对于回归模型,“raw” 是标准输出。对于 XGBoost 中的二元分类,这是对数几率比。

  • 如果为 “probability”,则我们解释模型输出转换为概率空间后的结果(请注意,这意味着 SHAP 值现在总和为模型的概率输出)。

  • 如果为 “log_loss”,则我们解释模型损失函数的自然对数,以便 SHAP 值总和为每个样本的模型对数损失。这有助于按特征分解模型性能。

  • 如果 model_outputmodel 对象上受支持的预测方法的名称,那么我们解释该模型方法名称的输出。例如,model_output="predict_proba" 解释调用 model.predict_proba 的结果。

当前,只有当 feature_perturbation="interventional" 时,才支持 “probability” 和 “log_loss” 选项。

approximatebool

已弃用,将在 v0.47.0 中弃用,并在 v0.49.0 版本中移除。请改用 shap_values()__call__ 方法中的 approximate 参数。

参考

[1]

Janzing, Dominik, Lenon Minorics, 和 Patrick Blöbaum。“Feature relevance quantification in explainable AI: A causal problem.” International Conference on artificial intelligence and statistics. PMLR, 2020.

方法

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

为传递的模型构建一个新的 Tree explainer。

assert_additivity(phi, model_output)

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])

将 explainer 写入给定的文件流。

shap_interaction_values(X[, y, tree_limit])

估计一组样本的 SHAP 交互值。

shap_values(X[, y, tree_limit, approximate, ...])

估计一组样本的 SHAP 值。

supports_model_with_masker(model, masker)

确定此 explainer 是否可以处理给定的模型。

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')

将 explainer 写入给定的文件流。

shap_interaction_values(X, y=None, tree_limit=None)

估计一组样本的 SHAP 交互值。

参数:
Xnumpy.array, pandas.DataFrame 或 catboost.Pool (对于 catboost)

要解释模型输出的样本矩阵(# 样本 x # 特征)。

ynumpy.array

每个样本的标签值数组。用于解释损失函数(尚不支持)。

tree_limitNone(默认)或 int

限制模型使用的树的数量。默认情况下,使用原始模型的限制 (None)。-1 表示没有限制。

返回值:
np.array

返回一个矩阵。形状取决于模型输出的数量

  • 一个输出:形状为 (#num_samples, #features, #features) 的矩阵。

  • 多个输出:形状为 (#num_samples, #features, #features, #num_outputs) 的矩阵。

每个样本的矩阵 (#num_samples, # features, # features) 总和为该样本的模型输出与模型输出的期望值(存储在 explainer 的 expected_value 属性中)之间的差值。该矩阵的每一行都求和为该样本的该特征的 SHAP 值。矩阵的对角线项表示该特征对预测的“主要影响”。对称的非对角线项表示该样本的所有特征对之间的交互影响。对于具有向量输出的模型,这将返回张量列表,每个输出一个张量。

0.45.0 版本变更: 具有多个输出的模型的返回类型从列表更改为 np.ndarray。

shap_values(X: Any, y: ndarray | Series | None = None, tree_limit: int | None = None, approximate: bool = False, check_additivity: bool = True, from_call: bool = False)

估计一组样本的 SHAP 值。

参数:
XAny

可以是类似 dataframe 的对象,例如 numpy.array、pandas.DataFrame 或 catboost.Pool(对于 catboost)。要解释模型输出的样本矩阵(# 样本 x # 特征)。

ynumpy.array

每个样本的标签值数组。用于解释损失函数。

tree_limitNone(默认)或 int

限制模型使用的树的数量。默认情况下,使用原始模型的限制 (None)。-1 表示没有限制。

approximatebool

运行速度快,但仅粗略地近似 Tree SHAP 值。这运行了 Saabas 先前提出的方法,该方法仅考虑单个特征排序。请注意,由于这不具有 Shapley 值的保证一致性,并且在树中较低的拆分中放置了过多的权重。

check_additivitybool

运行验证检查,以确保 SHAP 值的总和等于模型的输出。此检查仅需少量时间,并且可以捕获潜在的意外错误。请注意,此检查目前仅在解释模型的边际时运行。

返回值:
np.array

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

每行总和为该样本的模型输出与模型输出的期望值(存储为 explainer 的 expected_value 属性)之间的差值。

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

  • 一个输出:形状为 (#num_samples, *X.shape[1:]) 的数组。

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

0.45.0 版本变更: 具有多个输出的模型的返回类型从列表更改为 np.ndarray。

static supports_model_with_masker(model, masker)

确定此 explainer 是否可以处理给定的模型。

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