背景
在机器学习模型开发和应用过程中,模型的解释性至关重要,尤其是在医疗、金融等领域中,需要深入理解模型对特征的依赖关系和预测机制。本文参考该文献的可视化分析方法,展示如何利用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()
使用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()
绘制一个最基础的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()
相对于前面的基础可视化,添加了特征值(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()
相对于前面的可视化,添加了一条基于LOWESS拟合的平滑曲线,用于揭示特征值X_1与其 SHAP值之间的整体趋势关系,如果不需要展示分组的SHAP分析,到这里就已经是完整的可视化结果了
可视化四
最后相对于前面的可视化,添加了基于分组(如性别 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多重共线性问题
期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考