背景
传统的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
from sklearn.model_selection import train_test_split
df = pd.read_excel('2024-12-26公众号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.2,
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分析的可信度和解释效果。对于不熟悉 SHAP的同学来说,理解这一点尤为重要
shap计算
import shap
# 创建 SHAP 的解释器,使用 TreeExplainer 适用于基于树的模型(如 XGBoost、LightGBM 等)
explainer = shap.TreeExplainer(xgboost)
# 计算测试集的 SHAP 值
# shap_values 是一个数组,表示每个样本中每个特征对预测的贡献(正/负影响)
shap_values = explainer.shap_values(X_test)
这段代码是SHAP分析的核心步骤,能够直接生成解释模型预测的SHAP值,为后续的可视化(如蜂巢图、柱状图等)提供数据支持
标准蜂巢图绘制
plt.figure()
# 绘制 SHAP 的 summary_plot
# - shap_values: 前面计算得到的 SHAP 值
# - X_test: 测试集的特征数据,用于标注每个特征对应的值
# - feature_names=X_test.columns: 特征名称,与测试集列名一一对应,用于图中显示
# - plot_type="dot": 指定图的类型为蜂巢图(点图),每个点代表一个样本对应的 SHAP 值
# - show=False: 不直接显示图像,方便后续保存
shap.summary_plot(shap_values, X_test, feature_names=X_test.columns, plot_type="dot", show=False)
shap.summary_plot(shap_values, X_test, feature_names=X_test.columns, plot_type="dot", show=False)
plt.savefig('1.pdf', format='pdf', bbox_inches='tight', dpi=1200)
调用SHAP提供的summary_plot函数,标准化地绘制特征重要性的蜂巢图(点图),展示每个特征对模型预测的贡献分布
标准 特征重要性柱状图绘制
plt.figure(figsize=(10, 5), dpi=1200)
# 使用 SHAP 提供的 summary_plot 函数绘制特征重要性柱状图
# - shap_values: 由 SHAP 计算得到的 SHAP 值,表示每个特征对预测结果的贡献
# - X_test: 测试集数据,与 shap_values 一一对应
# - plot_type="bar": 指定绘图类型为柱状图,展示特征的平均绝对 SHAP 值,用于排序特征重要性
# - show=False: 不直接显示图像,方便后续添加标题和保存
shap.summary_plot(shap_values, X_test, plot_type="bar", show=False)
plt.title('SHAP_numpy Sorted Feature Importance')
plt.tight_layout()
plt.savefig("2.pdf", format='pdf',bbox_inches='tight')
plt.show()
调用SHAP提供的summary_plot函数,以柱状图的形式标准化地绘制了特征重要性排序图,展示每个特征的平均绝对SHAP值
蜂巢图和 特征重要性柱状图直接组合
# 创建主图(用来画蜂巢图)
fig, ax1 = plt.subplots(figsize=(10, 8), dpi=1200)
# 在主图上绘制蜂巢图,并保留热度条
shap.summary_plot(shap_values, X_test, feature_names=X_test.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, X_test, plot_type="bar", show=False)
plt.gca().set_position([0.2, 0.2, 0.65, 0.65]) # 调整图表位置,与蜂巢图对齐
# 在顶部 X 轴添加一条横线
ax2.axhline(y=9, 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("3.pdf", format='pdf', bbox_inches='tight')
plt.show()
通过手动调整布局和坐标轴,将 SHAP 的蜂巢图与特征重要性柱状图进行组合展示,实现两个可视化图表的融合,而不是单纯调用函数生成单独的图表
改变 特征重要性柱状图形式
不调用现成的函数,将其从传统特征重要性柱状图改为环形图形式,直观展示每个特征对模型输出的贡献比例,其中X_3和X_5是对模型影响最大的特征,其他特征的重要性则按比例依次递减,文案说明是XGBoost模型
蜂巢图和环形 图组合
最后将传统的柱状图改为更直观的环形图形式,并在同一图表中将其与SHAP的蜂巢图组合展示,实现特征重要性和分布关系的双重可视化。这种设计既突出每个特征对模型输出的重要性比例(通过环形图),又保留了蜂巢图中特征对正负影响的分布细节,从而提供了一个更完整和直观的特征解释方案,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
期刊配图:ALE(累积局部效应)模型解释方法解决部分依赖图PDP多重共线性问题
期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考