单个数据点的形状,而不是整个数据集的平均预测

2024-06-16 14:03:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用SHAP解释一个基于LightGBM的回归模型。我使用shap.TreeExplainer().shap_值(X)方法来获取shap值,其中X是整个训练数据集。这些SHAP值使我能够比较单个预测与整个数据集的平均预测

在Christopher Molnar的在线书籍第5.9.4节中,他提到: 您可以将预测与子集甚至单个数据点进行比较,而不是将预测与整个数据集的平均预测进行比较

关于这一点,我有几个问题:

  1. 如果我没有传递整个训练数据集,而是传递了20个观察值的子集,那么返回的SHAP值将与这20个观察值的平均值相对,这一解释正确吗?这将相当于克里斯托弗·莫尔纳在他的书中提到的“子集”
  2. 假设问题1的答案是肯定的,那么如果我不生成相对于20个观测值平均值的SHAP值,而是生成相对于一个特定观测值的SHAP值,该怎么办。克里斯托弗·莫尔纳似乎暗示这是可能的。如果可能的话,我该怎么做

提前感谢您的指导


Tags: 数据方法答案模型子集平均值书籍指导
2条回答
  1. 对。根据原始文件中的数学公式,SHAP值是“特征对实际预测和平均预测之间差异的贡献”。平均预测(有时称为“基准值”或“预期模型输出”)与您提供的背景数据集相关

  2. 对。您可以使用一个示例的背景数据集。背景数据集的常见选择是训练数据、一个样本作为参考样本,甚至是一个全零的数据集。来自author:“我建议使用单个背景数据点、真实背景的一个小随机子集,或者为了获得最佳性能,使用一组k-中值(根据每个中值所代表的训练点的数量加权)来简洁地代表背景。”

下面是支持我对这两个问题的回答以及如何完成2的更多细节。那么,“预期模型输出”为什么依赖于背景数据集?为了回答这些问题,让我们来了解SHAP是如何完成的:

步骤1:我们创建一个shap解释程序,提供两件事:一个经过训练的预测模型和一个背景数据集。shap从背景数据集创建一个联盟的人工数据集。每个联盟是一个二进制向量,表示特征组合的排列,1表示存在的特征,0表示不存在的特征。因此,有2^M个可能的组合用于M个特征

explainer = shap.KernelExplainer(f, background_X)

步骤2:我们提供样品我们要为其计算SHAP值。SHAP填充此人工数据集的值,以便当前特征采用该样本的原始值,缺失特征用背景数据集的值填充。然后为该联盟生成预测。如果背景数据集有n行,则缺失特征为filled n次,n个预测的平均值用作此联盟的预测。如果背景数据集只有一个样本,则缺少的特征将用该样本的值填充

shap_values = explainer.shap_values(test_X)

因此,SHAP值相对于背景数据集的平均预测

  1. 是的,但“平均”的定义很重要。如果您提供一个“背景”数据集,您的解释将根据该背景而不是整个数据集进行计算。就背景的“相对平均值”而言,我们需要理解shap值是所有可能联盟的平均边际贡献。因此,就形状值而言,您修复了多个联盟,其余的是“是”,平均值。这允许对模型拟合一次,然后通过只训练过一次的模型传递不同的联盟(剩余的平均值)。这就是SHAP时间节约的来源。
    如果您对更多内容感兴趣,可以访问原始paper或此blog

  2. 对。对于二进制分类,您提供一个数据行作为背景,例如,提供另一个类的数据行以进行解释,并查看更改的类输出的特征和更改程度

相关问题 更多 >