带有predict
的LightGBM pred_contrib=True
方法返回shape =(n_samples, (n_features + 1) * n_classes)
的数组。
此数组第二维中的数据顺序是什么?
换句话说,有两个问题:
shape = (n_samples, n_features + 1, n_classes)
或shape = (n_samples, n_classes, n_features + 1)
?n_features
个条目,每个要素一个,而与所有要素无关的贡献的一个(无用)条目。这些条目的顺序是什么:条目1,...,n_features
中的要素贡献以它们在数据集中出现的顺序相同,其余(无用)的条目位于索引0处,或其他方式? 答案 0 :(得分:0)
答案如下:
(n_samples, n_classes, n_features + 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处的条目不对应任何要素,而随后的条目对应于要素。