shap.KernelExplainer
- class shap.KernelExplainer(model, data, feature_names=None, link='identity', **kwargs)
使用 Kernel SHAP 方法来解释任何函数的输出。
Kernel SHAP 是一种使用特殊的加权线性回归来计算每个特征重要性的方法。计算出的重要性值是博弈论中的 Shapley 值,也是局部线性回归的系数。
- 参数:
- model函数或 iml.Model
用户提供的函数,它接受样本矩阵(# 样本 x # 特征)并计算这些样本的模型输出。输出可以是向量(# 样本)或矩阵(# 样本 x # 模型输出)。
- datanumpy.array 或 pandas.DataFrame 或 shap.common.DenseData 或任何 scipy.sparse 矩阵
用于积分出特征的背景数据集。为了确定特征的影响,该特征被设置为“缺失”,并观察模型输出的变化。由于大多数模型并非设计为在测试时处理任意缺失数据,我们通过将特征替换为它在背景数据集中的值来模拟“缺失”。因此,如果背景数据集是所有零的简单样本,那么我们将通过将其设置为零来近似特征缺失。对于小问题,此背景数据集可以是整个训练集,但对于较大的问题,请考虑使用单个参考值或使用
kmeans
函数来汇总数据集。注意:对于稀疏情况,我们接受任何稀疏矩阵,但为了性能而转换为 lil 格式。- feature_nameslist
背景数据集中特征的名称。如果背景数据集以 pandas.DataFrame 的形式提供,则可以将
feature_names
设置为None
(默认值),并且特征名称将取自 dataframe 的列名。- link“identity” 或 “logit”
广义线性模型链接,用于将特征重要性值连接到模型输出。由于特征重要性值 phi 总和为模型输出,因此通常使用链接函数将它们连接到输出是有意义的,其中 link(output) = sum(phi)。默认值为 “identity”(无操作)。如果模型输出是概率,则可以使用 “logit” 将 SHAP 值转换为对数几率单位。
示例
参见 Kernel Explainer 示例。
- __init__(model, data, feature_names=None, link='identity', **kwargs)
为传递的模型构建一个新的解释器。
- 参数:
- model对象或函数
用户提供的函数或模型对象,它接受样本数据集并计算这些样本的模型输出。
- masker函数、numpy.array、pandas.DataFrame、tokenizer、None 或这些的列表,用于每个模型输入
用于“掩盖”隐藏特征的函数,形式为 masked_args = masker(*model_args, mask=mask)。它接受与模型相同形式的输入,但仅适用于具有二进制掩码的单个样本,然后返回掩盖样本的迭代器。然后将使用模型函数评估这些掩盖样本,并对输出进行平均。作为 SHAP 使用的标准掩盖的快捷方式,您可以传递背景数据矩阵而不是函数,并且该矩阵将用于掩盖。特定于领域的掩盖函数在 shap 中可用,例如用于图像的 shap.ImageMasker 和用于文本的 shap.TokenMasker。除了确定如何替换隐藏特征外,掩码器还可以约束用于解释模型的合作博弈规则。例如,shap.TabularMasker(data, hclustering=”correlation”) 将对博弈强制执行联盟的层次聚类(在这种特殊情况下,归因被称为 Owen 值)。
- link函数
用于在模型输出单位和 SHAP 值单位之间映射的链接函数。默认情况下,它是 shap.links.identity,但 shap.links.logit 可能很有用,这样期望以概率单位计算,而解释保持在(更自然地可加的)对数几率单位。有关链接函数如何工作的更多详细信息,请参阅广义线性模型的链接函数的任何概述。
- algorithm“auto”、“permutation”、“partition”、“tree” 或 “linear”
用于估计 Shapley 值的算法。可以使用许多不同的算法来估计 Shapley 值(以及约束博弈的相关值),这些算法中的每一种都有不同的权衡,并且在不同的情况下是优选的。默认情况下,“auto” 选项尝试根据传递的模型和掩码器做出最佳选择,但始终可以通过传递特定算法的名称来覆盖此选择。使用的算法类型将决定此构造函数返回的子类对象的类型,如果您喜欢或需要更精细地控制其选项,您也可以直接构建这些子类。
- output_namesNone 或字符串列表
模型输出的名称。例如,如果模型是图像分类器,则 output_names 将是所有输出类别的名称。此参数是可选的。当 output_names 为 None 时,此解释器生成的 Explanation 对象将没有任何 output_names,这可能会影响下游绘图。
- seed: None 或 int
用于可重复性的种子
方法
__init__
(model, data[, feature_names, link])为传递的模型构建一个新的解释器。
addsample
(x, m, w)allocate
()explain
(incoming_instance, **kwargs)explain_row
(*row_args, max_evals, ...)解释单行并返回元组 (row_values, row_expected_values, row_mask_shapes, main_effects)。
load
(in_file[, model_loader, masker_loader, ...])从给定的文件流加载 Explainer。
not_equal
(i, j)run
()save
(out_file[, model_saver, masker_saver])将解释器写入给定的文件流。
shap_values
(X, **kwargs)估计一组样本的 SHAP 值。
solve
(fraction_evaluated, dim)supports_model_with_masker
(model, masker)确定此解释器是否可以处理给定的模型。
varying_groups
(x)- 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)
从给定的文件流加载 Explainer。
- 参数:
- in_file要从中加载对象的文件流。
- save(out_file, model_saver='.save', masker_saver='.save')
将解释器写入给定的文件流。
- shap_values(X, **kwargs)
估计一组样本的 SHAP 值。
- 参数:
- Xnumpy.array 或 pandas.DataFrame 或任何 scipy.sparse 矩阵
要解释模型输出的样本矩阵(# 样本 x # 特征)。
- nsamples“auto” 或 int
在解释每个预测时重新评估模型的次数。更多样本会导致 SHAP 值的方差估计更低。“auto” 设置使用 nsamples = 2 * X.shape[1] + 2048。
- l1_reg“num_features(int)”、“aic”、“bic” 或 float
用于特征选择的 l1 正则化。估计过程基于去偏 lasso。
“num_features(int)” 选择固定数量的顶部特征。
“aic” 和 “bic” 选项使用 AIC 和 BIC 规则进行正则化。
直接传递浮点数会设置用于特征选择的
sklearn.linear_model.Lasso
模型的 “alpha” 参数。“auto”(已弃用):当枚举的可能样本空间小于 20% 时,使用 “aic”,否则不使用正则化。
在 0.47.0 版本中更改: 默认值从
"auto"
更改为"num_features(10)"
。- silent: bool
如果为 True,则隐藏 tqdm 进度条。默认为 False。
- gc_collectbool
在每个解释轮次后运行垃圾回收。有时对于内存密集型解释是必需的(默认为 False)。
- 返回:
- np.array 或 list
估计的 SHAP 值,通常形状为
(# 样本 x # 特征)
。每行总和为该样本的模型输出与模型输出的期望值(存储为解释器的
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)
确定此解释器是否可以处理给定的模型。
这是一个抽象静态方法,旨在由每个子类实现。