shap.KernelExplainer

class shap.KernelExplainer(model, data, feature_names=None, link='identity', **kwargs)[源代码]

使用 Kernel SHAP 方法来解释任何函数的输出。

Kernel SHAP 是一种使用特殊加权线性回归来计算每个特征重要性的方法。计算出的重要性值是来自博弈论的Shapley值,同时也是局部线性回归的系数。

参数:
模型函数或 iml.Model

用户提供的函数,该函数接受一个样本矩阵(# 样本数 x # 特征数)并计算这些样本的模型输出。输出可以是一个向量(# 样本数)或一个矩阵(# 样本数 x # 模型输出数)。

数据numpy.array 或 pandas.DataFrame 或 shap.common.DenseData 或任何 scipy.sparse 矩阵

用于整合特征的背景数据集。为了确定某个特征的影响,该特征被设置为“缺失”,并观察模型输出的变化。由于大多数模型在测试时并未设计为处理任意缺失数据,我们通过将特征替换为背景数据集中的值来模拟“缺失”。因此,如果背景数据集是全零的简单样本,那么我们将通过将其设置为零来近似特征的缺失。对于小问题,此背景数据集可以是整个训练集,但对于较大的问题,请考虑使用单个参考值或使用 kmeans 函数来汇总数据集。注意:对于稀疏情况,我们接受任何稀疏矩阵,但为了性能会转换为 lil 格式。

特征名称列表

背景数据集中特征的名称。如果背景数据集以 pandas.DataFrame 的形式提供,那么 feature_names 可以设置为 ``None``(默认),特征名称将作为数据框的列名。

链接“identity” 或 “logit”

一个广义线性模型链接,用于将特征重要性值连接到模型输出。由于特征重要性值 phi 的总和等于模型输出,通常使用一个链接函数将它们与输出连接起来,其中 link(output) = sum(phi)。默认是 “identity”(无操作)。如果模型输出是概率,则可以使用 “logit” 将 SHAP 值转换为对数几率单位。

示例

参见 Kernel Explainer 示例

__init__(model, data, feature_names=None, link='identity', **kwargs)[源代码]

为传递的模型构建一个新的解释器。

参数:
模型对象或函数

用户提供的函数或模型对象,该对象接受样本数据集并计算模型对这些样本的输出。

掩码器函数, numpy.array, pandas.DataFrame, 分词器, None, 或每个模型输入的这些列表

用于“掩码”表单中隐藏特征的函数 masked_args = masker(*model_args, mask=mask)。它以与模型相同的格式接收输入,但对于仅包含二进制掩码的单个样本,然后返回掩码样本的可迭代对象。这些掩码样本随后将使用模型函数进行评估,并平均输出。作为SHAP标准掩码使用的快捷方式,您可以传递一个背景数据矩阵而不是函数,该矩阵将用于掩码。特定领域的掩码函数在shap中可用,例如用于图像的shap.ImageMasker和用于文本的shap.TokenMasker。除了确定如何替换隐藏特征外,掩码器还可以约束用于解释模型的合作游戏的规则。例如,shap.TabularMasker(data, hclustering=”correlation”) 将强制游戏的联盟进行层次聚类(在这种情况下,归因被称为Owen值)。

链接函数

链接函数用于在模型的输出单元和SHAP值单元之间进行映射。默认情况下,它是shap.links.identity,但shap.links.logit可能很有用,这样期望值以概率单位计算,而解释则保持在(更自然地可加的)对数几率单位。有关链接函数如何工作的更多详细信息,请参阅广义线性模型的链接函数概述。

算法“auto”, “permutation”, “partition”, “tree”, 或 “linear”

用于估计Shapley值的算法。有许多不同的算法可以用来估计Shapley值(以及受限游戏的相应值),每种算法都有不同的权衡,并且在不同情况下更可取。默认情况下,“auto”选项会根据传入的模型和掩码器尝试做出最佳选择,但这个选择总是可以通过传递特定算法的名称来覆盖。所使用的算法类型将决定此构造函数返回的子类对象类型,如果您更喜欢或需要对其选项进行更精细的控制,您也可以直接构建这些子类。

输出名称None 或字符串列表

模型输出的名称。例如,如果模型是图像分类器,那么 output_names 将是所有输出类别的名称。此参数是可选的。当 output_names 为 None 时,此解释器生成的解释对象将没有 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, ...])

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

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)

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

参数:
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)”, “auto”(目前默认,但已弃用), “aic”, “bic”, 或浮点数

用于特征选择的l1正则化。估计过程基于去偏的lasso。

  • “num_features(int)” 选择固定数量的顶级特征。

  • aicbic 选项使用 AIC 和 BIC 规则进行正则化。

  • 直接传递一个浮点数会设置用于特征选择的 sklearn.linear_model.Lasso 模型的“alpha”参数。

  • “auto”(目前默认但已弃用):当枚举的样本空间小于可能样本空间的20%时,使用”aic”,否则不使用正则化。

注意:默认行为将在未来版本中更改为 "num_features(10)"。显式传递此值以静默 DeprecationWarning。

silent: bool

如果为 True,隐藏 tqdm 进度条。默认为 False。

gc_collect布尔

在每次解释回合后运行垃圾收集。有时对于内存密集型的解释是必需的(默认 False)。

返回:
np.array 或 list

估计的 SHAP 值,通常形状为 (# 样本 x # 特征)

每一行的总和等于该样本的模型输出与模型输出的期望值之间的差异(该期望值存储为解释器的 expected_value 属性)。

返回值的类型和形状取决于模型输入和输出的数量:

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

  • 一个输入,多个输出:形状为 (#样本数量, *X.shape[1:], #输出数量) 的数组

  • 多个输入:上述对应形状的数组列表。

在 0.45.0 版本发生变更: 对于具有多个输出和一个输入的模型,返回类型从列表更改为 np.ndarray。

static supports_model_with_masker(model, masker)

确定此解释器是否可以处理给定的模型。

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