Python SHAP summary_plot()方法修改及画出蜂窝图的解决方式

本文介绍了Python SHAP库中summary_plot()函数在8月的更新,导致图表显示从特征的SHAP值变为mean(|SHAP值|)。作者提供了如何通过官方文档找到解决方案,即使用shap.plots.beeswarm()函数恢复原来的行为,展示了调整后的代码及运行结果。文章强调了理解SHAP值在模型解释中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8月上旬使用Python SHAP中 summary_plot()时,画出来的图依然是各特征的shap value,图状为beeswarm,但在中旬重新跑该段代码时,画出来的图为mean(|shap value|),图状为柱状图。

SHAP修改之后:

fig = plt.figure()
shap.summary_plot(shap_values, data[cols], show = False, max_display = 30)
plt.tight_layout()
plt.show()

效果如下图:
在这里插入图片描述

此时画出来的图默认是SHAP value 的mean value。
这是Python SHAP在8月近期对shap.summary_plot()的修改,此前会直接画出模型中各个特征SHAP值,这可以更好地理解整体模式,并允许发现预测异常值。每一行代表一个特征,横坐标为SHAP值。一个点代表一个样本,颜色表示特征值(红色高,蓝色低)。

因此去查询了SHAP的官方文档,发现依然可以通过shap.plots.beeswarm()实现上述功能。

# train XGBoost model
X,y = shap.datasets.adult()
model = xgboost.XGBClassifier().fit(X, y)

# compute SHAP values
explainer = shap.Explainer(model, X)
shap_values = explainer(X)

跑出来的结果如下图:
在这里插入图片描述
至此,问题完美解决。

当使用shap.summary_plot进行分析时,我们可以以一个示例来说明。假设我们正在使用一个二元分类模型来预测房屋是否被购买,而我们的数据集包含房屋的各种特征,如面积、位置、房龄等。 首先,我们可以调用shap.summary_plot来生成特征重要性的直方图,代码如下: ```python import shap shap.initjs() # 计算SHAP值 explainer = shap.Explainer(model, X_train) shap_values = explainer.shap_values(X_test) # 绘制特征重要性图表 shap.summary_plot(shap_values, X_test, feature_names=X_test.columns) ``` 生成的图表将显示每个特征的SHAP值,以及平均SHAP值的竖线。假设我们得到了以下图表: ![shap_summary_plot_example](https://shap.readthedocs.io/en/latest/_images/shap_summary_plot_example.png) 根据图表的观察,我们可以得以下结论: - 特征"面积"(Area)对预测结果的贡献最大,其SHAP值最高。这意味着面积较大的房屋更有可能被购买。 - 特征"位置"(Location)和"房龄"(Age)的SHAP值接近于0,说明它们对预测结果的影响较小。 - 特征"卧室数量"(Bedrooms)和"浴室数量"(Bathrooms)对预测结果的影响也较小,但是"浴室数量"的SHAP值稍高于"卧室数量"。 - 其他特征的贡献也可以通过观察相应的SHAP值来判断。 通过shap.summary_plot的分析,我们可以了解各个特征对预测结果的相对重要性,并根据这些信息进行进一步的解释和决策。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值