高斯过程回归的SHAP值为零。

3

我正在尝试使用SHAP库获取高斯过程回归(GPR)模型的SHAP值。但是所有的SHAP值都为零。我正在使用官方文档中的示例。我只将模型更改为GPR。

import sklearn
from sklearn.model_selection import train_test_split
import numpy as np
import shap
import time
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern, WhiteKernel, ConstantKernel

shap.initjs()

X,y = shap.datasets.diabetes()
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# rather than use the whole training set to estimate expected values, we summarize with
# a set of weighted kmeans, each weighted by the number of points they represent.
X_train_summary = shap.kmeans(X_train, 10)


kernel = Matern(length_scale=2, nu=3/2) + WhiteKernel(noise_level=1)   

gp = GaussianProcessRegressor(kernel)
gp.fit(X_train, y_train)

# explain all the predictions in the test set
explainer = shap.KernelExplainer(gp.predict, X_train_summary)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)

运行上述代码会得到以下图表:

enter image description here

当我使用神经网络或线性回归时,上述代码可以正常运行而没有问题。
如果您有任何解决此问题的想法,请告诉我。
2个回答

2

你的模型没有预测任何东西:

plt.scatter(y_test, gp.predict(X_test));

enter image description here

正确地训练您的模型,就像以下代码一样:

plt.scatter(y_test, gp.predict(X_test));

enter image description here

并且你可以开始了:

explainer = shap.KernelExplainer(gp.predict, X_train_summary)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)

enter image description here

完整可复制的示例

import sklearn
from sklearn.model_selection import train_test_split
import numpy as np
import shap
import time
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import WhiteKernel, DotProduct

X,y = shap.datasets.diabetes()
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train_summary = shap.kmeans(X_train, 10)
kernel = DotProduct() + WhiteKernel()

gp = GaussianProcessRegressor(kernel)
gp.fit(X_train, y_train)

explainer = shap.KernelExplainer(gp.predict, X_train_summary)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test)

在页面上来回跳转有点难以看清楚:这里唯一的区别是内核吗? - undefined
@Ben 唯一的区别是模型没有经过训练。证据是:我改变了核函数,然后它“起作用”了。模型的性能仍然不太出色 - 我本来期望回归线是45度 - 但这关乎如何正确地训练GaussianProcessRegressor。从总结图中看,这是我的第一个想法。 - undefined
我的意思是,在你的代码中,唯一的变化就是内核(还有一些注释消失了)? - undefined

0
尝试使用以下代码:
kernel = 1.0 * Matern(length_scale=1.0, nu=2.5) + \
WhiteKernel(noise_level=10**-1,noise_level_bounds=(10**-1, 10**1))

model = GaussianProcessRegressor(kernel=kernel, 
                           optimizer='fmin_l_bfgs_b',random_state=123)              


explainer = shap.Explainer(model.predict,X_train)
shap_values = explainer.shap_values(X_train)
shap.plots.bar(shap_values)                                  ## bar plot
shap.summary_plot(shap_values, X_train,show=False)           ## summary       

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接