【问题标题】:SHAP for a single data point, instead of average prediction of entire dataset单个数据点的 SHAP,而不是整个数据集的平均预测
【发布时间】:2021-03-25 17:59:34
【问题描述】:

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

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

我对此有几个问题:

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

提前感谢您的指导!

【问题讨论】:

    标签: python shap


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

    2. 是的。您提供单个数据行作为背景,用于二元分类,例如,提供另一个类的数据行进行解释,并查看哪个特征以及改变了多少类输出。

    【讨论】:

    • @Asim 它回答了你的问题吗?有帮助吗?如果是这样,您可能会考虑接受/支持答案。
    【解决方案2】:
    1. 是的。按照原论文中的数学公式,SHAP 值是“一个特征对实际预测与平均预测之间差异的贡献”。平均预测,有时称为“基值”或“预期模型输出”,与您提供的背景数据集相关。

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

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

    第 1 步:我们创建一个形状解释器,提供两件事:一个经过训练的预测模型和一个背景数据集。 SHAP 从背景数据集中创建一个人工联盟数据集。每个联盟都是一个二进制向量,表示特征组合的排列,1 表示存在特征,0 表示不存在。所以 M 个特征有 2^M 种可能的联盟。

    explainer = shap.KernelExplainer(f, background_X)
    

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

    shap_values = explainer.shap_values(test_X)
    

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

    【讨论】:

      猜你喜欢
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 2017-10-28
      • 2019-09-26
      • 2019-06-06
      • 2012-01-23
      相关资源
      最近更新 更多