【问题标题】:SHAP values for Gaussian Processes Regressor are zero高斯过程回归器的 SHAP 值为零
【发布时间】:2021-03-03 11:49:55
【问题描述】:

我正在尝试使用 SHAP 库获取高斯过程回归 (GPR) 模型的 SHAP 值。但是,所有 SHAP 值都为零。我正在使用official documentation 中的示例。我只是将模型更改为 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)

运行上面的代码会得到如下图:

当我使用神经网络或线性回归时,上面的代码可以正常工作。
如果您知道如何解决此问题,请告诉我。

【问题讨论】:

    标签: scikit-learn shap gaussian-process


    【解决方案1】:

    您的模型无法预测任何内容:

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

    正确训练您的模型,如下所示:

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

    你可以走了:

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

    完全可重现的示例

    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)
    

    【讨论】:

    • 在页面上来回跳转有点难看:这里唯一的区别是内核吗?
    • @Ben 模型没有训练的唯一区别。证明:我改变了内核并且它“工作”了。模型性能仍然不是很出色——我预计回归线 45⁰——但接下来是关于如何正确训练 GaussianProcessRegressor。看着概要情节,这是第一个想法。
    • 我的意思是在你的代码中,唯一的变化是内核(并且一些 cmets 已经消失了)?
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2018-12-06
    • 2021-10-07
    • 2021-03-08
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多