期刊配图:SHAP主效应图绘制解释单个特征在独立作用时对模型预测的贡献

机器学习大数据算法

picture.image

背景

picture.image

picture.image

picture.image

本文提出了一种独特的SHAP可视化方法,与传统的SHAP值依赖图有所不同。传统的SHAP值依赖图通常以单个特征的总SHAP值(即该特征的主效应与所有交互效应的综合贡献)作为Y轴,而本文的方法将Y轴替换为单个特征的 SHAP主效应值 ,即该特征在独立作用时对模型预测的贡献,这种方式剥离了交互效应的影响,更加直观地展现了主效应的变化趋势,为分析特征的独立作用提供了清晰的视角,有助于更深入地理解模型的特征行为,当然这篇文章也提供了特征交互效应下的shap交互图视角参考文章——期刊配图:从SHAP依赖图到交互图优化,解析特征协同作用,接下来从代码的视角去理解SHAP主效应图

代码实现

模型构建


          
import pandas as pd
          
import numpy as np
          
import matplotlib.pyplot as plt 
          
import warnings
          
warnings.filterwarnings("ignore")
          

          
plt.rcParams['font.family'] = 'Times New Roman'
          
plt.rcParams['axes.unicode_minus'] = False
          
df = pd.read_excel('2024-11-26-公众号Python机器学习AI.xlsx')
          
from sklearn.model_selection import train_test_split, KFold
          

          
X = df.drop(['Y'],axis=1)
          
y = df['Y']
          

          
# 划分训练集和测试集
          
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
          
# 然后将训练集进一步划分为训练集和验证集
          
X_train, X_val, y_train, y_val = train_test_split(X_temp, y_temp, test_size=0.125, random_state=42)  # 0.125 x 0.8 = 0.1
          

          
import optuna  
          
from xgboost import XGBRegressor  
          
from sklearn.metrics import mean_squared_error
          
def objective(trial):
          
    params = {
          
        'n_estimators': trial.suggest_categorical('n_estimators', [50, 100, 200, 300]), 
          
        'max_depth': trial.suggest_int('max_depth', 3, 15, step=1), 
          
        'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.3), 
          
        'subsample': trial.suggest_uniform('subsample', 0.5, 1.0), 
          
        'colsample_bytree': trial.suggest_uniform('colsample_bytree', 0.5, 1.0),
          
        'gamma': trial.suggest_uniform('gamma', 0, 5)
          
    }
          

          
    model = XGBRegressor(**params, random_state=42)
          
    model.fit(X_train, y_train)
          
    y_pred = model.predict(X_val)
          
    return mean_squared_error(y_val, y_pred)
          

          
study = optuna.create_study(direction="minimize")
          
study.optimize(objective, n_trials=100)
          
print("Best parameters:", study.best_params)
          
best_model = XGBRegressor(**study.best_params, random_state=42)
          
best_model.fit(X_train, y_train)
      

picture.image

通过Optuna自动调参工具对XGBoost回归模型进行超参数优化,并在训练集上拟合出最佳模型,为后续使用SHAP进行模型解释提供了基础, 在使用SHAP进行特征重要性分析或可解释性分析之前,必须先训练出一个性能良好的模型

交互作用摘要图绘制


          
import shap
          
explainer = shap.TreeExplainer(best_model)
          
# 计算 SHAP 交互值
          
shap_interaction_values = explainer.shap_interaction_values(X_test) 
          
shap.summary_plot(shap_interaction_values, X_test, show=False)
          
plt.savefig("1.pdf", format='pdf', bbox_inches='tight', dpi=1200)
      

picture.image

该shap可视化对角线元素:每个特征的主效应(该特征对模型预测的独立贡献), 非对角线元素:两个特征之间的交互效应(它们对模型预测的协同作用)

提取主效应值


        
            

          main\_effects\_df
        
      

picture.image

提取SHAP交互值矩阵的对角线元素,表示各特征的主效应值,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

X_1SHAP主效应图绘制


          
plt.figure(figsize=(6, 4), dpi=1200)
          
sc = plt.scatter(X_test["X_1"], main_effects_df['X_1'], 
          
                 s=10)
          
plt.axhline(y=0, color='black', linestyle='-.', linewidth=1)  
          
plt.xlabel('X_1', fontsize=12)
          
plt.ylabel('SHAP main effect value', fontsize=12)  
          
ax = plt.gca()
          
ax.spines['top'].set_visible(False)
          
ax.spines['right'].set_visible(False)
          
plt.savefig("2.pdf", format='pdf', bbox_inches='tight', dpi=1200)
          
plt.show()
      

picture.image

可视化特征X_1的 SHAP 主效应值,展示X_1的不同取值如何 独立影响 模型预测。当X_1较小时(如小于10),主效应值为负,表示在这个区间内,X_1对模型预测起到抑制作用;随着X_1增大(如超过10),主效应值逐渐变为正,最终对预测结果产生显著的正向贡献。也就是主效应值的绝对值表示特征对预测结果的影响程度,而正负符号则表示影响的方向(正向或负向)

所有特征SHAP主效应图绘制


          
num_rows, num_cols = 2, 4  # 设置2行4列
          
features = main_effects_df.columns[:num_rows * num_cols]  # 取出需要绘制的特征
          
fig, axes = plt.subplots(nrows=num_rows, ncols=num_cols, figsize=(15, 8), dpi=1200)
          
for i, feature in enumerate(features):
          
    row, col = divmod(i, num_cols)  
          
    ax = axes[row, col]
          
    ax.scatter(X_test[feature], main_effects_df[feature], s=10)  
          
    ax.axhline(y=0, color='black', linestyle='-.', linewidth=1)
          
    ax.set_xlabel(feature, fontsize=10)
          
    ax.set_ylabel('SHAP main effect value', fontsize=10)
          
    ax.spines['top'].set_visible(False)
          
    ax.spines['right'].set_visible(False)
          

          
# 移除多余的子图
          
for i in range(len(features), num_rows * num_cols):
          
    row, col = divmod(i, num_cols)
          
    fig.delaxes(axes[row, col])
          

          
plt.tight_layout()
          
plt.savefig("3.pdf", format='pdf', bbox_inches='tight', dpi=1200)
          
plt.show()
      

picture.image

🎁 赠书活动来啦!🎁

picture.image

picture.image

支持知识分享,畅享学习乐趣!特别感谢清华出版社 对本次赠书活动的鼎力支持!即日起,只需

点赞、在看、转发 此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送清华出版社提供的《动手学PyTorch建模与应用:从深度学习到大模型》这本精彩书籍📚!

💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

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

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

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

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

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

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

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

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

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

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

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

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