shap.LinearExplainer

class shap.LinearExplainer(model, masker, link=CPUDispatcher(<function identity>), nsamples=1000, feature_perturbation=None, **kwargs)

计算线性模型的 SHAP 值,可选择考虑特征间的相关性。

这计算了线性模型的 SHAP 值,并且可以考虑输入特征之间的相关性。假设特征是独立的会导致介入性 SHAP 值,对于线性模型,介入性 SHAP 值是 coef[i] * (x[i] - X.mean(0)[i]) 对于第 i 个特征。 如果我们考虑相关性,那么我们将防止由共线性引起的任何问题,并在相关的特征之间共享功劳。 考虑相关性在计算上可能具有挑战性,但是 LinearExplainer 使用抽样来估计一个变换,然后可以将其应用于解释模型的任何预测。

参数:
model(coef, intercept) 或 sklearn.linear_model.*

用户提供的线性模型,可以是参数对或 sklearn 对象。

masker函数,numpy.array,pandas.DataFrame,(mean, cov) 元组,shap.maskers.Masker

一个可调用的 Python 对象,用于“掩盖”隐藏特征,形式为 masker(binary_mask, x)。 它接受单个输入样本和二进制掩码,并返回掩盖样本的矩阵。 这些掩盖的样本将使用模型函数进行评估,然后对输出进行平均。

作为 SHAP 标准掩盖的快捷方式,您可以传递背景数据矩阵而不是函数,该矩阵将用于掩盖。

您还可以提供 (mean, covariance) 元组,或者直接传入用于表格数据的掩码器(即,maskers.Independent, maskers.Impute, 或 maskers.Partition)。

data(mean, cov), numpy.array, pandas.DataFrame, iml.DenseData 或 scipy.csr_matrix

用于计算条件期望的背景数据集。 请注意,仅使用数据集的均值和协方差。 这意味着传递原始数据矩阵只是直接传递均值和协方差的便捷替代方法。

nsamplesint

在估计用于考虑特征相关性的变换矩阵时要使用的样本数。

feature_perturbationNone (默认), “interventional” 或 “correlation_dependent”

已弃用:此选项现在已被弃用,建议使用适当的表格掩码器,并将在未来的版本中删除。

我们可能希望通过两种方式计算 SHAP 值,即完全条件 SHAP 值或介入性 SHAP 值。

  • 对于介入性 SHAP 值,我们打破模型中特征之间的任何依赖结构,从而揭示如果我们介入并更改某些输入,模型将如何表现。 Independent 和 Partition 掩码器使用此方法。

  • 对于完全条件 SHAP 值,我们尊重输入特征之间的相关性,因此,如果模型依赖于一个输入,但该输入与另一个输入相关,那么两者都会因模型的行为而获得一些功劳。 Impute 掩码器使用此方法。

介入性选项“忠实于模型”,这意味着它只会将功劳归于模型实际使用的特征,而相关性选项“忠实于数据”,因为它仅考虑在尊重输入数据中的相关性时模型的行为方式。 对于稀疏情况,仅支持介入性选项。

示例

请参阅 线性解释器示例

__init__(model, masker, link=CPUDispatcher(<function identity>), nsamples=1000, feature_perturbation=None, **kwargs)

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

参数:
model对象或函数

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

masker函数,numpy.array,pandas.DataFrame,分词器,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 可能很有用,这样期望以概率单位计算,而解释保持在(更自然的加性)对数 odds 单位。 有关链接函数如何工作的更多详细信息,请参阅广义线性模型的链接函数的任何概述。

algorithm“auto”、“permutation”、“partition”、“tree” 或 “linear”

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

output_namesNone 或字符串列表

模型输出的名称。 例如,如果模型是图像分类器,则 output_names 将是所有输出类别的名称。 此参数是可选的。 当 output_names 为 None 时,此解释器生成的 Explanation 对象将没有任何 output_names,这可能会影响下游绘图。

seed: None 或 int

用于重现性的种子

方法

__init__(model, masker[, link, nsamples, ...])

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

explain_row(*row_args, max_evals, ...)

解释单行并返回元组 (row_values, row_expected_values, row_mask_shapes)。

load(in_file[, model_loader, masker_loader, ...])

从给定的文件流加载 Explainer。

save(out_file[, model_saver, masker_saver])

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

shap_values(X)

估计一组样本的 SHAP 值。

supports_model_with_masker(model, masker)

确定我们是否可以解析给定的模型。

explain_row(*row_args, max_evals, main_effects, error_bounds, batch_size, outputs, silent)

解释单行并返回元组 (row_values, row_expected_values, row_mask_shapes)。

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)

估计一组样本的 SHAP 值。

参数:
Xnumpy.array,pandas.DataFrame 或 scipy.csr_matrix

要解释模型输出的样本矩阵(# 样本 x # 特征)。

返回值:
np.array

估计的 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)

确定我们是否可以解析给定的模型。