期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比

大模型机器学习算法

picture.image

背景

picture.image

picture.image

在机器学习模型开发和应用过程中,模型的解释性至关重要,尤其是在医疗、金融等领域中,需要深入理解模型对特征的依赖关系和预测机制。本文参考该文献的可视化分析方法,展示如何利用SHAP对模型的关键特征进行直观解读

如文献中图 3 所示,采用了以下可视化技术:

  • SHAP值依赖图:散点图结合拟合曲线,展示特征值变化与SHAP值之间的非线性关系
  • 边缘密度分布图:结合不同特征值和SHAP值的分布,反映群体间特征和影响力的差异
  • 分组对比:基于性别(Female 和 Male)的对比,探索特征在不同亚群体中的表现

这些可视化方法在文献中被用于分析如年龄(AGE)、胆固醇比值(Cholesterol ratio)、收缩压(SBP)等特征对模型预测的影响。接下来,通过Python代码复现类似的图形,为您的研究或报告提供借鉴

代码实现

模型构建


          
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
          
from sklearn.model_selection import train_test_split
          
df = pd.read_excel('2025-1-1公众号Python机器学习AI.xlsx')
          
# 划分特征和目标变量
          
X = df.drop(['y'], axis=1)
          
y = df['y']
          
# 划分训练集和测试集
          
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, 
          
                                                    random_state=42, stratify=df['y'])
          
                                                    
          
from xgboost import XGBClassifier
          
from sklearn.model_selection import GridSearchCV, StratifiedKFold
          
from sklearn.metrics import accuracy_score
          

          
# 定义 XGBoost 二分类模型
          
model_xgb = XGBClassifier(use_label_encoder=False, eval_metric='logloss', 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 折交叉验证 (Stratified K-Fold)
          
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=8)
          

          
# 使用网格搜索寻找最佳参数
          
grid_search = GridSearchCV(estimator=model_xgb, param_grid=param_grid, scoring='accuracy',
          
                           cv=kfold, verbose=1, n_jobs=-1)
          

          
# 拟合模型
          
grid_search.fit(X_train, y_train)
          
# 使用最优参数训练模型
          
xgboost = grid_search.best_estimator_
      

通过网格搜索优化一个XGBoost二分类模型的超参数,确保模型性能达到最佳,然后才能进行 SHAP分析以解释模型的预测结果,模型性能良好是进行有意义SHAP解释的前提

SHAP计算


          
import shap
          
explainer = shap.TreeExplainer(xgboost)
          
# 计算shap值为numpy.array数组
          
shap_values_numpy = explainer.shap_values(X)
          
shap_values_df = pd.DataFrame(shap_values_numpy, columns=X.columns)
          
shap_values_df.head()
      

picture.image

使用SHAP的TreeExplainer对已经训练好的 XGBoost 模型进行解释,计算每个特征的SHAP值并以DataFrame格式展示,不同模型需要使用对应的SHAP explainer,例如LinearExplainer 对应线性模型,KernelExplainer对应黑箱模型

可视化一


          
# 绘制散点图,x轴是'age'特征,y轴是SHAP值
          
plt.figure(figsize=(6, 4),dpi=1200)
          
plt.scatter(df['X_1'], shap_values_df['X_1'], s=10, color="#6A9ACE")
          
# 添加shap=0的横线
          
plt.axhline(y=0, color='black', linestyle='-.', linewidth=1)
          
plt.xlabel('X_1', fontsize=12)
          
plt.ylabel('SHAP value for\nX_1', fontsize=12) 
          
ax = plt.gca()
          
ax.spines['top'].set_visible(False)
          
ax.spines['right'].set_visible(False)
          
plt.savefig("1.png", format='png', bbox_inches='tight')
          
plt.show()
      

picture.image

绘制一个最基础的SHAP依赖图,仅展示特征X_1与其SHAP值的关系,没有添加分组对比、拟合曲线或密度分布等额外信息

可视化二


          
import seaborn as sns
          
fig = plt.figure(figsize=(8, 6), dpi=1200)
          
grid = plt.GridSpec(4, 4, hspace=0.3, wspace=0.3)
          

          
# 主散点图
          
main_ax = fig.add_subplot(grid[1:, :-1])
          
main_ax.scatter(df['X_1'], shap_values_df['X_1'], s=10, alpha=0.8, color="#6A9ACE")  # 修改散点颜色
          
main_ax.axhline(y=0, color='black', linestyle='-.', linewidth=1)
          
main_ax.set_xlabel('X_1', fontsize=12)
          
main_ax.set_ylabel('SHAP value for\nX_1', fontsize=12)
          
main_ax.spines['top'].set_visible(False)
          
main_ax.spines['right'].set_visible(False)
          

          
# 顶部X轴边缘分布
          
top_ax = fig.add_subplot(grid[0, :-1], sharex=main_ax)
          
sns.kdeplot(df['X_1'], ax=top_ax, fill=True, color="#6A9ACE")  # 修改KDE填充颜色
          
top_ax.axis('off')
          

          
# 右侧Y轴边缘分布 
          
right_ax = fig.add_subplot(grid[1:, -1], sharey=main_ax)
          
sns.kdeplot(y=shap_values_df['X_1'], ax=right_ax, fill=True, color="#6A9ACE")  # 修改KDE填充颜色
          
right_ax.axis('off')
          

          
# 保存图表
          
plt.savefig("2.png", format='png', bbox_inches='tight')
          
plt.show()
      

picture.image

相对于前面的基础可视化,添加了特征值(X_1)和SHAP值的边缘密度分布图,分别显示在顶部和右侧,增强数据分布的直观性

可视化三


          
fig = plt.figure(figsize=(8, 6), dpi=1200)
          
grid = plt.GridSpec(4, 4, hspace=0.3, wspace=0.3)
          

          
# 主散点图
          
main_ax = fig.add_subplot(grid[1:, :-1])
          
# 绘制散点图
          
main_ax.scatter(df['X_1'], shap_values_df['X_1'], s=10, alpha=0.8, color="#6A9ACE")
          
# 添加拟合线
          
sns.regplot(
          
    x=df['X_1'], 
          
    y=shap_values_df['X_1'], 
          
    scatter=False,  # 不绘制散点,仅绘制拟合线
          
    lowess=True,    # 使用 LOWESS 曲线进行拟合
          
    color="#6A9ACE", 
          
    ax=main_ax
          
)
          
main_ax.axhline(y=0, color='black', linestyle='-.', linewidth=1)
          
main_ax.set_xlabel('X_1', fontsize=12)
          
main_ax.set_ylabel('SHAP value for\nX_1', fontsize=12)
          
main_ax.spines['top'].set_visible(False)
          
main_ax.spines['right'].set_visible(False)
          

          
# 顶部X轴边缘分布
          
top_ax = fig.add_subplot(grid[0, :-1], sharex=main_ax)
          
sns.kdeplot(df['X_1'], ax=top_ax, fill=True, color="#6A9ACE")
          
top_ax.axis('off')
          

          
# 右侧Y轴边缘分布 
          
right_ax = fig.add_subplot(grid[1:, -1], sharey=main_ax)
          
sns.kdeplot(y=shap_values_df['X_1'], ax=right_ax, fill=True, color="#6A9ACE")
          
right_ax.axis('off')
          

          
# 保存图表
          
plt.savefig("3.png", format='png', bbox_inches='tight')
          
plt.show()
      

picture.image

相对于前面的可视化,添加了一条基于LOWESS拟合的平滑曲线,用于揭示特征值X_1与其 SHAP值之间的整体趋势关系,如果不需要展示分组的SHAP分析,到这里就已经是完整的可视化结果了

可视化四

picture.image

最后相对于前面的可视化,添加了基于分组(如性别 Female 和 Male)的散点图、拟合曲线以及边缘密度分布,直观呈现了不同组别特征值与 SHAP 值的关系及分布差异,类似文献中的分层可视化分析方式,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

再见2024,你好2025!感谢每一位读者的支持!

2024年走到了尾声,在这一年里,感谢每一位读者的 点赞、在看、转发和支持 !你们的鼓励和认可,成为了作者坚持创作的最大动力。在这里,衷心祝福每一位朋友 学业有成、科研顺利、工作顺心!

此时此刻,当你读到这篇文章时,已是 2025年的第一天 。为了感谢大家在2024年的陪伴和支持,作者特意准备了一份新年礼物: 聚合网站额度兑换码 !该网站整合了国内外主流大模型,包括 ChatGPT、Claude、Gemini、Kimi、Spark 等等,让你可以免费体验这些强大的 AI 工具,助力你的学习、科研与工作!


          
699231599aeb4c83e5a3808e832bf89f
          
32f344f309f0c8d63318937d8ef18a15
          
0fe0c45cd7dac4c7b0aa9cd6ac4fdb56
          
c9de21360aec80a55c16df45d2b3c785
          
66e7b2b09492b3379174f280028175fd
          
c6c7c5266b5d8bd205017cff6e9986bd
          
b1542a17a94d9b701b0eb5fa67170f30
          
6552e1173e96917145b30062025b9bbc
          
e83d52a91ff3d0f6017c457af33b41dd
          
1eb71b637149d0ab783a98076f1a5f6e
          
c3ac12371be14fdaa7235dcf982b0f80
          
7926c6353bd672b5c1655298a8b6e320
          
372978b7e6bb2b7f9dfdb7b211af15dc
          
c7b02fbe1ffd875efd61f476d3519930
          
ff3d7e39b9448fcf4c64db1415ecb3cb
          
880a6fed97a6d7464fd287d645f9210f
          
624050b09aff479ba9d68adae579fe00
      

👉 兑换网址https://www.gpt-all.chat

请在评论区留言 “新年快乐” 或点赞 在看 转发本篇文章,此外,如果兑换码使用完毕,您还可以添加作者微信 deep_ML (请备注),直接联系获取新的兑换码(最终解释权归作者所有),方便继续体验这些强大的AI工具!感谢支持,祝大家新年快乐!🎉

2025年,新的一年,新的起点,让我们携手向前,继续探索更多有趣的技术与知识!再次感谢大家,祝愿新的一年充满希望与精彩!✨

往期推荐

期刊配图:ALE(累积局部效应)模型解释方法解决部分依赖图PDP多重共线性问题

期刊配图:基于t-sne降维与模型预测概率的分类效果可视化

期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用

置信区间+误差条:机器学习分类评价指标精美呈现

SCI图表:基于相关性和标准差的多模型评价——泰勒图解析

期刊文章配图:基于分组折线图的多机器学习模型表现评估对比

复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展

复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化

SCI图表复现:特征相关性气泡热图展示

一图胜千言:回归预测模型训练集与测试集的进阶可视化

期刊文章配图:基于雷达图的多机器学习模型表现评估对比

期刊文章配图:斯皮尔曼相关系数热图反应非线性变量相关性

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论