期刊复现:SHAP配图特征依赖关系、拟合线与频率分布(含置信区间)

机器学习算法推荐算法

picture.image

✨ 欢迎关注Python机器学习AI ✨

本节介绍:SHAP配图特征依赖关系、拟合线与频率分布(含置信区间),数据采用模拟数据无任何现实意义 ,作者根据个人对机器学习的理解进行代码实现与图表输出,仅供参考。 完整 数据和代码将在稍后上传至交流群,成员可在交流群中获取下载。需要的朋友可关注公众文末提供的获取方式。文末提供高效的AI工具~!

✨ 论文信息 ✨

picture.image

picture.image

该配图展示不同区域(Zone A, B, R, M)内,影响陆地表面温度(LST)的特征因素的相对重要性和平均SHAP值的合并结果,通过可视化的方式展示了每个区域特征与LST之间的关系,以及各特征在不同区域中的重要性和影响程度,这种配图形式在很早之前就已实现——用SHAP可视化解读数据特征的重要性:蜂巢图与特征关系图结合展示

picture.image

该配图展示不同区域(Zone A, B, R, M)内,UFZ(单元格特征)形态对陆地表面温度(LST)影响的局部依赖图,每个图中包含样本数据、拟合线(含R²值)以及95%置信区间(CI),显示特征与LST之间的关系,也就是对SHAP依赖图的一个优化

✨ 基础代码 ✨

  
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  
plt.rcParams['font.family'] = 'Times New Roman'  
plt.rcParams['axes.unicode_minus'] = False  
  
df = pd.read_excel('2025-9-23公众号Python机器学习AI.xlsx')  
from sklearn.model_selection import train_test_split  
# 划分特征和目标变量  
X = df.drop(['SR'], axis=1)  
y = df['SR']  
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,   
                                                    random_state=42)  
from xgboost import XGBRegressor  
from sklearn.model_selection import GridSearchCV, KFold  
from sklearn.metrics import mean_squared_error, r2_score  
  
# 定义 XGBoost 回归模型  
model_xgb = XGBRegressor(use_label_encoder=False, eval_metric='rmse', random_state=8)  
  
# 定义参数网格  
param_grid = {  
    'n_estimators': [50, 100, 200],  
    'max_depth': [3, 5, 7],  
    'learning_rate': [0.01, 0.1, 0.2],  
    'subsample': [0.8, 1.0],  
    'colsample_bytree': [0.8, 1.0]  
}  
  
# 使用 K 折交叉验证  
kfold = KFold(n_splits=5, shuffle=True, random_state=8)  
  
# 使用网格搜索寻找最佳参数  
grid_search = GridSearchCV(estimator=model_xgb, param_grid=param_grid, scoring='neg_mean_squared_error',  
                           cv=kfold, verbose=1, n_jobs=-1)  
  
# 拟合模型  
grid_search.fit(X_train, y_train)  
# 使用最优参数训练模型  
xgboost = grid_search.best_estimator_                                                    

使用XGBoost回归模型对数据进行训练,并通过网格搜索和K折交叉验证优化模型参数,为后续对模型进行SHAP解释做好准备

  
import sys  
import os  
# 将标准输出重定向到os.devnull  
sys.stdout = open(os.devnull, 'w')  
import shap  
explainer = shap.TreeExplainer(xgboost)  
# 计算shap值为numpy.array数组  
shap_values_numpy = explainer.shap_values(X_test)  
# 创建主图(用来画蜂巢图)  
fig, ax1 = plt.subplots(figsize=(10, 8))  
# 在主图上绘制蜂巢图,并保留热度条  
shap.summary_plot(shap_values_numpy, X_test, feature_names=X.columns, plot_type="dot", show=False, color_bar=True)  
plt.gca().set_position([0.2, 0.2, 0.65, 0.65])  # 调整图表位置,留出右侧空间放热度条  
# 获取共享的 y 轴  
ax1 = plt.gca()  
# 创建共享 y 轴的另一个图,绘制特征贡献图在顶部x轴  
ax2 = ax1.twiny()  
shap.summary_plot(shap_values_numpy, X_test, plot_type="bar", show=False)  
plt.gca().set_position([0.2, 0.2, 0.65, 0.65])  # 调整图表位置,与蜂巢图对齐  
# 在顶部 X 轴添加一条横线  
ax2.axhline(y=13, color='gray', linestyle='-', linewidth=1)  # 注意y值应该对应顶部  
# 调整透明度  
bars = ax2.patches  # 获取所有的柱状图对象  
for bar in bars:  
    bar.set_alpha(0.2)  # 设置透明度  
# 设置两个x轴的标签  
ax1.set_xlabel('Shapley Value Contribution (Bee Swarm)', fontsize=12)  
ax2.set_xlabel('Mean Shapley Value (Feature Importance)', fontsize=12)  
# 移动顶部的 X 轴,避免与底部 X 轴重叠  
ax2.xaxis.set_label_position('top')  # 将标签移动到顶部  
ax2.xaxis.tick_top()  # 将刻度也移动到顶部  
# 设置y轴标签  
ax1.set_ylabel('Features', fontsize=12)  
plt.tight_layout()  
plt.savefig("SHAP_1.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

绘制特征对模型预测贡献的蜂巢图和特征重要性的柱状图,展示每个特征的SHAP值(贡献值)以及对应的特征重要性,结果生成一个带有两个X轴(一个显示SHAP值贡献蜂巢图,另一个显示特征重要性)的图,如果特征属于不同的特征类型,可以为柱状图添加颜色映射,以区分不同类别的特征

  
# 计算shap值为Explanation格式  
shap_values_Explanation = explainer(X_test)  
feature_name = 'VSS/TSS'  
# 找到指定特征的索引  
feature_index = shap_values_Explanation.feature_names.index(feature_name)  
plt.figure(figsize=(10, 5))  
shap.plots.scatter(shap_values_Explanation[:, feature_index], show=False)  
plt.title(f'SHAP Scatter Plot for Feature: {feature_name}')  
plt.savefig("SHAP_2.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.tight_layout()  
plt.show()

picture.image

在绘制文献中拟合线与频率分布(含置信区间)之前,直接使用shap.plots.scatter函数绘制指定特征的SHAP散点图,展示该特征的SHAP值与预测贡献的关系

每个蓝色点代表数据集中某个样本的 'VSS/TSS' 特征值与其对应的SHAP值,反映该特征对模型预测的贡献,下方的灰色柱状图显示 'VSS/TSS' 特征值的分布,表明不同特征值的样本数量。有助于解数据集中该特征的分布情况,和文献相比只是少了拟合线部分

  
plot\_shap\_lowess('VSS/TSS', X\_test, shap\_values\_df, 'SHAP\_3.pdf', n\_bins=30)

picture.image

调用自定义函数plot_shap_lowess,绘制特征 'VSS/TSS' 的SHAP值与该特征的关系图,函数接受特征名称、测试集数据、SHAP值数据、PDF文件名、柱状图分箱数量,这里相对于前面就添加上了拟合曲线和文献保持一致

  • 拟合线展示 'VSS/TSS' 特征值与SHAP值之间的趋势。该线拟合数据中的变化模式,R²值为0.979,表示拟合线能够很好地解释SHAP值与该特征之间的关系(但其实这里的拟合优度并不是关注重点主要利用拟合线初步观察SHAP值的趋势)
  • SHAP=0的横线代表特征对模型预测的零贡献点。意味着该特征原始值对应的SHAP值为0,它对模型预测结果没有影响,图中标记出这个横线有助于理解哪些 'VSS/TSS' 特征原始值会导致模型预测不受该值的影响
  • 图中的x=0.58代表'VSS/TSS' 特征值的一个关键点,即拟合线和SHAP=0横线的交点。此处特征值为0.58,特征对模型的影响从正向转为负向,且SHAP值接近零,表明该特征在该值附近的影响非常小或者几乎为零

相对于直接通过shap.plots.scatter函数绘制,通过拟合线可视化影响趋势的方法,以及哪些特征值(如0.58)可能导致特征的影响发生显著变化,更好理解特征对模型预测的影响程度

  
plot\_shap\_lowess('infP', X\_test, shap\_values\_df, 'SHAP\_5.pdf', n\_bins=30)

picture.image

当然并不是拟合曲线与SHAP=0只有一个交点,也可能存在多个交点,如这里针对特征infP,为什么说其是非线性影响,即随着特征值的变化,SHAP值的方向和强度会发生变化。通过该图,可以看到不同区间的 'infP' 对预测的影响程度不同,SHAP值的正负表示该特征对预测结果的影响方向(正向或负向),而SHAP值的绝对值则表示影响的强度

  
shap.dependence_plot('VSS/TSS', shap_values_numpy, X_test, interaction_index=None, show=False)  
plt.savefig("SHAP_6.pdf", format='pdf', bbox_inches='tight', dpi=1200)  
plt.show()

picture.image

最后提供一种最基础使用shap.dependence_plot函数绘制特征'VSS/TSS'的SHAP依赖图方法,不包含频率的SHAP依赖图最基础的绘图形式,该函数也可以通过interaction_index=None与其它特征进行交互颜色映射,这里关闭,但是只是单纯意义上的颜色交互显示,对该图添加拟合线可以参考往期文章——ES&T顶刊配图:优化SHAP依赖图通过趋势线与置信区间揭示特征的平均边际效应

当然,公众号中还有更多机器学习期刊实战技巧,您可以通过历史文章进行检索和阅读,关注公众号,点击“发信息”>“历史文章”即可搜索公众号所有文章信息

picture.image

✨ 该文章案例 ✨

picture.image

在上传至交流群的文件中,像往期文章一样,将对案例进行逐步分析,确保读者能够达到最佳的学习效果。内容都经过详细解读,帮助读者深入理解模型的实现过程和数据分析步骤,从而最大化学习成果。

同时,结合提供的免费AI聚合网站进行学习,能够让读者在理论与实践之间实现融会贯通,更加全面地掌握核心概念。

✨ 书籍推荐 ✨

无论你是零编程基础的科研新手,还是想提升机器学习技能的医学科研工作者,这本书都能带你从入门到进阶,掌握Python数据分析+医学AI应用的全流程技能

✨ 介绍 ✨

本节介绍到此结束,有需要学习数据分析和Python机器学习相关的朋友欢迎到淘宝店铺:Python机器学习AI,下方提供淘宝店铺二维码获取作者的公众号合集。截至目前为止,合集已包含近300多篇文章,购买合集的同时,还将提供免费稳定的AI大模型使用。

更新的内容包含数据、代码、注释和参考资料。 作者仅分享案例项目,不提供额外的答疑服务。项目中将提供详细的代码注释和丰富的解读,帮助您理解每个步骤 。 获取 前请咨询,避免不必要的问题。

✨ 群友反馈 ✨

picture.image

✨ 淘宝店铺 ✨

picture.image

请大家打开淘宝扫描上方的二维码,进入店铺,获取更多Python机器学习和AI相关的内容 ,希望能为您的学习之路提供帮助!

✨ AI工具推荐 ✨

picture.image

往期推荐

期刊配图:模型SHAP解释特征类别柱状图、饼图与蜂巢图的组合展示

期刊复现:基于自动机器学习的预测模型构建及其残差和部分依赖分析

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况最优模型的SHAP解释

期刊复现:单变量特征降维与共线性分析结合RFE集成排名进行特征筛选下的组合拳流程

期刊复现:SVM、RF、BDT、DT、Logit五大模型堆叠31种组合情况优化与最优模型选择可视化

期刊复现:基于相关系数与AUC值优化特征选择剔除冗余特征精简模型(附代码)

期刊复现:如何正确使用LASSO进行二分类特征选择?避开常见误区,掌握实用技巧

期刊复现:融合聚类与多分类转二分类的亚型可解释SHAP机器学习模型构建

期刊复现:基于LightGBM、XGBoost与RF的Lasso回归堆叠模型在连续和分类特征上的模型解释

期刊复现:基于LightGBM、XGBoost与RF的堆叠模型贝叶斯优化调参与Lasso回归元模型,结合10倍交叉验证

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论