LightGBM使用pred_contrib = True预测多类:返回数组中SHAP值的顺序

时间:2019-11-05 11:12:55

标签: lightgbm

带有predict的LightGBM pred_contrib=True方法返回shape =(n_samples, (n_features + 1) * n_classes)的数组。

此数组第二维中的数据顺序是什么?

换句话说,有两个问题:

  1. 重塑此数组以使用它的正确方法是什么:shape = (n_samples, n_features + 1, n_classes)shape = (n_samples, n_classes, n_features + 1)
  2. 在要素维度中,有n_features个条目,每个要素一个,而与所有要素无关的贡献的一个(无用)条目。这些条目的顺序是什么:条目1,...,n_features中的要素贡献以它们在数据集中出现的顺序相同,其余(无用)的条目位于索引0处,或其他方式?

1 个答案:

答案 0 :(得分:0)

答案如下:

  1. 正确的形状是(n_samples, n_classes, n_features + 1)
  2. 要素贡献在条目1,...,n_features中的出现顺序与它们在数据集中出现的顺序相同,其余(无用)条目的索引为0。

以下代码令人信服地显示了它:

import lightgbm, pandas, numpy
params = {'objective': 'multiclass', 'num_classes': 4, 'num_iterations': 10000,
          'metric': 'multiclass', 'early_stopping_rounds': 10}
train_df = pandas.DataFrame({'f0': [0, 1, 2, 3] * 50, 'f1': [0, 0, 1] * 66 + [1, 2]}, dtype=float)
val_df = train_df.copy()
train_target = pandas.Series([0, 1, 2, 3] * 50)
val_target = pandas.Series([0, 1, 2, 3] * 50)
train_set = lightgbm.Dataset(train_df, train_target)
val_set = lightgbm.Dataset(val_df, val_target)
model = lightgbm.train(params=params, train_set=train_set, valid_sets=[val_set, train_set])
feature_contribs = model.predict(val_df, pred_contrib=True)
print('Shape of SHAP:', feature_contribs.shape)
# Shape of SHAP: (200, 12)
print('Averages over samples:', numpy.mean(feature_contribs, axis=0))
# Averages over samples: [ 3.99942301e-13 -4.02281771e-13 -4.30029167e+00 -1.90606677e-05
#  1.90606677e-05 -4.04157656e+00  2.24205077e-05 -2.24205077e-05
#  -4.04265615e+00 -3.70370401e-15  5.20335728e-18 -4.30029167e+00]
feature_contribs.shape = (200, 4, 3)
print('Mean feature contribs:', numpy.mean(feature_contribs, axis=(0, 1)))
# Mean feature contribs: [ 8.39960111e-07 -8.39960113e-07 -4.17120401e+00]

(每个输出在下一行中显示为注释。)

说明如下。

我创建了一个数据集,其中包含两个要素,并且标签与其中的第二个要素相同。

我希望仅第二个功能会做出重大贡献。

将样本的SHAP输出平均后,我们得到一个形状(12,)的数组,该数组的位置2、5、8、11(从零开始)具有非零值。

这表明该数组的正确形状是(4,3)。

以这种方式重塑形状并对样本和类进行平均后,我们得到一个形状为(3,)的数组,其末尾为非零值。

这表明该数组的最后一个条目与最后一个特征相对应。这意味着位置0处的条目不对应任何要素,而随后的条目对应于要素。