使用PyTorch的SHAP值- KernelExplainer vs DeepExplainer

5us2dqdw  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(993)

我还没有找到很多关于PyTorch的SHAP值的例子。我使用了两种技术来生成SHAP值,但是,它们的结果似乎并不一致。

使用PyTorch的SHAP KernelExplainer

import torch
from torch.autograd import Variable
import shap
import numpy
import pandas

torch.set_grad_enabled(False)

# Get features
train_features_df = ... # pandas dataframe
test_features_df = ... # pandas dataframe

# Define function to wrap model to transform data to tensor
f = lambda x: model_list[0]( Variable( torch.from_numpy(x) ) ).detach().numpy()

# Convert my pandas dataframe to numpy
data = test_features_df.to_numpy(dtype=np.float32)

# The explainer doesn't like tensors, hence the f function
explainer = shap.KernelExplainer(f, data)

# Get the shap values from my test data
shap_values = explainer.shap_values(data)

# Enable the plots in jupyter
shap.initjs()

feature_names = test_features_df.columns
# Plots
#shap.force_plot(explainer.expected_value, shap_values[0], feature_names)
#shap.dependence_plot("b1_price_avg", shap_values[0], data, feature_names)
shap.summary_plot(shap_values[0], data, feature_names)

使用PyTorch SHAP DeepExplainer

# It wants gradients enabled, and uses the training set
torch.set_grad_enabled(True)
e = shap.DeepExplainer(model, Variable( torch.from_numpy( train_features_df.to_numpy(dtype=np.float32) ) ) )

# Get the shap values from my test data (this explainer likes tensors)
shap_values = e.shap_values( Variable( torch.from_numpy(data) ) )

# Plots
#shap.force_plot(explainer.expected_value, shap_values, feature_names)
#shap.dependence_plot("b1_price_avg", shap_values, data, feature_names)
shap.summary_plot(shap_values, data, feature_names)

对比结果

从汇总图中可以看出,在相同的测试数据下,相同PyTorch模型的特性值明显不同。
例如,特征b1_addresses_avg在KernelExplainer中的值为倒数第一,但在DeepExplainer中的值为倒数第三。
我不知道接下来该怎么办。

ktca8awb

ktca8awb1#

Shapley值很难精确计算。内核SHAP和深度SHAP是两种不同的近似方法,可以有效地计算Shapley值,因此不应该期望它们一定一致。
您可以阅读authors' paper以了解更多详细信息。
虽然Kernel SHAP可以用于任何模型,包括深度模型,但很自然地会问,是否有一种方法可以利用有关深度网络组成性质的额外知识来提高计算性能。[...]这促使我们将DeepLIFT调整为SHAP值的组成近似,从而产生Deep SHAP。
在第5节中,他们比较了Kernel SHAP和Deep SHAP的性能。从他们的例子来看,Kernel SHAP的性能似乎比Deep SHAP更好。所以我想如果你没有遇到计算问题,你可以坚持使用Kernel SHAP。

p.s.只是为了确保,你输入了完全相同的训练模型到SHAP,对吗?你不应该训练单独的模型,因为它们会学习不同的权重。

相关问题