shap.GPUTreeExplainer
- class shap.GPUTreeExplainer(model, data=None, model_output='raw', feature_perturbation='interventional', feature_names=None, approximate=False, link=None, linearize_link=None)[源代码]
TreeExplainer 的实验性 GPU 加速版本。目前需要使用可用的 cuda 进行源码构建,并且定义了 ‘CUDA_PATH’ 环境变量。
示例
参见 GPUTree 解释器示例。
- __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_limitNone(默认)或 int
限制模型使用的树的数量。默认情况下,None 表示不使用原始模型的限制,-1 表示没有限制。
- 返回:
- 数组或列表
对于具有单一输出的模型,这将返回一个SHAP值的张量(#样本 x #特征 x #特征)。每个样本的矩阵(#特征 x #特征)的总和为该样本的模型输出与模型输出的期望值之间的差异(该值存储在解释器的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 表示没有限制。
- 近似布尔
不支持。
- check_additivity布尔
运行一个验证检查,以确保SHAP值的总和等于模型的输出。这个检查只需要很少的时间,并且会捕捉到潜在的意外错误。请注意,目前这个检查仅在解释模型的边际时运行。
- 返回:
- 数组或列表
对于单输出模型,这将返回一个 SHAP 值矩阵(# 样本 x # 特征)。每一行的总和等于该样本的模型输出与模型输出的期望值(当期望值为常数时,存储在解释器的 expected_value 属性中)之间的差异。对于多输出模型,这将返回一个这样的矩阵列表,每个输出对应一个矩阵。
- static supports_model_with_masker(model, masker)
确定此解释器是否可以处理给定的模型。
这是一个抽象静态方法,旨在由每个子类实现。