我可以使用Python SHAP包来获得每个特性对RSquared的边际贡献吗?

2024-04-27 23:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试复制example,我想知道是否有一种方法可以通过Python Shap包实现这一点。我不知道如何使用LinearExplainer()来获得RSquared的边际贡献

到目前为止,我所尝试的:

import sklearn
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
import shap
shap.initjs()

X = pd.DataFrame(columns=['x1','x2','x3'], data=[[7,3,6],[9,4,8],[12,5,9],[10,8,12],[20,9,23]])
Y = pd.Series(data=[23,45,68,59,89],name='y')

model = sklearn.linear_model.LinearRegression()
model.fit(X, Y)

explainer = shap.LinearExplainer(model, X)
shap_values = explainer.shap_values(X)

shap_values的输出为:

array([[-40.0032057 , -23.7588602 ,  33.24345503],
   [-22.61050757, -15.27355298,  21.37079252],
   [  3.47853963,  -6.78824577,  15.43446126],
   [-13.9141585 ,  18.66767587,  -2.3745325 ],
   [ 73.04933215,  27.15298308, -67.67417631]])

还有人能帮我理解/解释这个输出吗

提前谢谢


Tags: 方法importdatamodelexampleassklearnpd
1条回答
网友
1楼 · 发布于 2024-04-27 23:37:44

我假设你已经熟悉SHAPely价值观如何运作的理论方面。我发现thisthis链接有助于实现这一目的

关于输出:

array([[-40.0032057 , -23.7588602 ,  33.24345503],
   [-22.61050757, -15.27355298,  21.37079252],
   [  3.47853963,  -6.78824577,  15.43446126],
   [-13.9141585 ,  18.66767587,  -2.3745325 ],
   [ 73.04933215,  27.15298308, -67.67417631]])

为了正确解释,首先让我使用您的模型生成预测,如下所示:

predictions = model.predict(X)
print (predictions)

>>>
[26.28138914 40.28673197 68.92475512 59.17898486 89.32813891]

数据中有3个特性x1,x2,x3。对于每个数据点,我们得到一组3个shapely值。这些值表示3个特征中的每个特征如何线性影响预测。 现在考虑第一个预测值,即26.28。相应的SHApely值为: [-40.0032057 , -23.7588602 , 33.24345503]

这些值表示x1对预测的影响程度(-40.003)、x2对预测的影响程度(-23.758)和x3对预测的影响程度(33.243)。因此我们可以得出结论,x1和x2对预测有负面影响,x3对预测有正面影响

要进一步验证这一点,请获取预期值,如下所示:

print (explainer.expected_value)
>>> 56.8

这个期望值只是预测的平均值

print (np.mean(predictions))
>>> 56.8

这表明如果不知道x1,x2,x3的值,我们会猜到56.8 SHAPely值[-40.0032057 , -23.7588602 , 33.24345503]将此猜测推为: 56.8 + (-40.0032057) + (-23.7588602) + 33.24345503 = 26.28138914,这是我们最后的预测。因此,重新迭代SHAPely值表示每个特征对预测的线性影响程度偏离平均值(猜测)

您可以通过以下方式进一步验证:

print (shap_values.sum(1) + explainer.expected_value)
>>> [26.28138914 40.28673197 68.92475512 59.17898486 89.32813891]

在这里,我为每一行取shap值,并将其添加到平均值中,这将导致对该行的预测。这与我们的预测是一样的。我希望这有助于你对如何解释SHAPely价值观有一个直观的理解

相关问题 更多 >