shap.TreeExplainer
- class shap.TreeExplainer(model, data=None, model_output='raw', feature_perturbation='interventional', feature_names=None, approximate=False, link=None, linearize_link=None)[源代码]
使用 Tree SHAP 算法来解释集成树模型的输出。
Tree SHAP 是一种快速且精确的方法,用于估计树模型和树集合的 SHAP 值,在几种不同的可能的特征依赖假设下。它依赖于外部模型包内部或本地编译的 C 扩展中的快速 C++ 实现。
示例
参见 树解释器示例。
- __init__(model, data=None, model_output='raw', feature_perturbation='interventional', feature_names=None, approximate=False, link=None, linearize_link=None)[源代码]
为传入的模型构建一个新的树解释器。
- 参数:
- 模型模型对象
我们想要解释的基于树的机器学习模型。支持 XGBoost、LightGBM、CatBoost、Pyspark 以及大多数基于树的 scikit-learn 模型。
- 数据numpy.array 或 pandas.DataFrame
用于整合特征的背景数据集。
当
feature_perturbation="tree_path_dependent"
时,此参数是可选的,因为在这种情况下,我们可以使用沿着每条树路径的训练样本数量作为我们的背景数据集(这些数据记录在model
对象中)。- feature_perturbation“interventional”(默认)或“tree_path_dependent”(当 data=None 时默认)
由于SHAP值依赖于条件期望,我们需要决定如何处理相关(或依赖)的输入特征。
“干预性”方法根据因果推断(Janzing et al. 2019)规定的规则打破特征之间的依赖关系。请注意,“干预性”选项需要一个背景数据集
data
,并且其运行时间与您使用的背景数据集的大小成线性关系。使用100到1000个随机背景样本是一个不错的选择。“tree_path_dependent” 方法就是跟随树的路径,并使用每个叶节点上的训练示例数量来表示背景分布。这种方法不需要背景数据集,因此在未提供背景数据集时默认使用。
- 模型输出“原始”,“概率”,“对数损失”,或模型方法名称
应该解释模型的什么输出。
如果为“raw”,那么我们将解释树的原始输出,这会因模型而异。对于回归模型,“raw”是标准输出。对于XGBoost中的二分类,这是对数几率比。
如果是“概率”,那么我们将解释模型输出转换为概率空间(注意,这意味着SHAP值现在总和为模型的概率输出)。
如果使用“log_loss”,那么我们解释模型损失函数的自然对数,使得SHAP值对每个样本的总和等于模型的对数损失。这对于按特征分解模型性能非常有帮助。
如果
model_output
是model
对象上支持的预测方法的名称,那么我们将解释该模型方法名称的输出。例如,model_output="predict_proba"
解释了调用model.predict_proba
的结果。
目前,“probability”和“log_loss”选项仅在
feature_perturbation="interventional"
时支持。
方法
__init__
(model[, data, model_output, ...])为传入的模型构建一个新的树解释器。
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)确定此解释器是否可以处理给定的模型。
- 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_interaction_values(X, y=None, tree_limit=None)[源代码]
估计一组样本的 SHAP 交互值。
- 参数:
- Xnumpy.array, pandas.DataFrame 或 catboost.Pool (用于 catboost)
一个样本矩阵(样本数量 x 特征数量),用于解释模型的输出。
- ynumpy.array
每个样本的标签值数组。用于解释损失函数(尚未支持)。
- tree_limit无(默认)或整数
限制模型使用的树的数量。默认情况下,使用原始模型的限制(
None
)。-1
表示没有限制。
- 返回:
- np.array
返回一个矩阵。形状取决于模型输出的数量:
一个输出:形状为(#样本数,#特征,#特征)的矩阵。
多输出:形状为 (#样本数, #特征数, #特征数, #输出数) 的矩阵。
每个样本的矩阵(#样本数,#特征,#特征)的总和等于该样本的模型输出与模型输出的期望值(存储在解释器的``expected_value``属性中)之间的差异。该矩阵的每一行的总和等于该样本的该特征的SHAP值。矩阵的对角线元素表示该特征对预测的“主要影响”。对称非对角线元素表示该样本的所有特征对之间的交互效应。对于具有向量输出的模型,这将返回一个张量列表,每个输出一个张量。
在 0.45.0 版本发生变更: 具有多个输出的模型的返回类型已从列表更改为 np.ndarray。
- 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_limit无(默认)或整数
限制模型使用的树的数量。默认情况下,使用原始模型的限制(
None
)。-1
表示没有限制。- 近似布尔
快速运行,但只能大致近似 Tree SHAP 值。这种方法由 Saabas 之前提出,仅考虑单一特征排序。请注意,由于这没有 Shapley 值的一致性保证,并且对树中较低的分裂赋予了过多的权重。
- check_additivity布尔
运行一个验证检查,以确保SHAP值的总和等于模型的输出。此检查只需花费很少的时间,并且可以捕捉到潜在的意外错误。请注意,此检查目前仅在解释模型的边际时运行。
- 返回:
- np.array
估计的 SHAP 值,通常形状为
(# 样本 x # 特征)
。每一行的总和等于该样本的模型输出与模型输出的期望值之间的差异(该期望值存储为解释器的
expected_value
属性)。返回数组的形状取决于模型输出的数量:
一个输出:形状为
(#样本数量, *X.shape[1:])
的数组。多个输出:形状为
(#样本数量, *X.shape[1:], #输出数量)
的数组。
在 0.45.0 版本发生变更: 具有多个输出的模型的返回类型已从列表更改为 np.ndarray。