shap.GPUTreeExplainer

class shap.GPUTreeExplainer(model: ~typing.Any, data: ~numpy.ndarray[~typing.Any, ~numpy.dtype[~typing.Any]] | ~pandas.core.frame.DataFrame | None = None, model_output: str = 'raw', feature_perturbation: ~typing.Literal['auto', 'interventional', 'tree_path_dependent'] = 'auto', feature_names: list[str] | None = None, approximate: ~typing.Any = <object object>, link: ~typing.Any = None, linearize_link: ~typing.Any = None)

TreeExplainer 的实验性 GPU 加速版本。目前需要使用 CUDA 可用的源代码构建,并定义“CUDA_PATH”环境变量。

示例

请参阅 GPUTree explainer 示例

__init__(model: ~typing.Any, data: ~numpy.ndarray[~typing.Any, ~numpy.dtype[~typing.Any]] | ~pandas.core.frame.DataFrame | None = None, model_output: str = 'raw', feature_perturbation: ~typing.Literal['auto', 'interventional', 'tree_path_dependent'] = 'auto', feature_names: list[str] | None = None, approximate: ~typing.Any = <object object>, link: ~typing.Any = None, linearize_link: ~typing.Any = None) 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 中更改: 默认行为将从 “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 的结果。

目前,“probability”和“log_loss”选项仅在 feature_perturbation="interventional" 时受支持。

approximate布尔值

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

参考文献

[1]

Janzing, Dominik, Lenon Minorics, and Patrick Blöbaum. “可解释人工智能中的特征相关性量化:一个因果问题。” 国际人工智能和统计会议。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, ...])

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

save(out_file[, model_saver, masker_saver])

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

shap_interaction_values(X[, y, tree_limit])

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

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

为一组样本估计 SHAP 值。

supports_model_with_masker(model, masker)

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

属性

数据

data_missing

feature_perturbation

expected_value

model

model_output

data_feature_names

masker

output_names

feature_names

link

linearize_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_interaction_values(X, y=None, tree_limit=None)

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

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

一个样本矩阵(# 样本数 x # 特征数),用于解释模型的输出。

ynumpy.array

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

tree_limitNone(默认)或 int

限制模型使用的树的数量。默认 None 表示不使用原始模型的限制,-1 表示没有限制。

返回:
数组或列表

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

shap_values(X, y=None, tree_limit=None, approximate=False, check_additivity=True, from_call=False)

为一组样本估计 SHAP 值。

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

一个样本矩阵(# 样本数 x # 特征数),用于解释模型的输出。

ynumpy.array

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

tree_limitNone(默认)或 int

限制模型使用的树的数量。默认 None 表示不使用原始模型的限制,-1 表示没有限制。

approximate布尔值

不支持。

check_additivity布尔值

运行验证检查,即 SHAP 值之和等于模型的输出。此检查仅花费少量时间,并将捕获潜在的意外错误。请注意,此检查目前仅在解释模型边际时运行。

返回:
数组或列表

对于具有单个输出的模型,这返回一个 SHAP 值矩阵(# 样本 x # 特征)。每行求和为该样本的模型输出与模型输出的期望值之间的差值(当其为常数时存储在解释器的 expected_value 属性中)。对于具有向量输出的模型,这返回一个此类矩阵的列表,每个输出一个。

static supports_model_with_masker(model: Any, masker: Any) bool

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

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