SHAP值+模型预测概率解读机器学习模型的决策过程

机器学习算法数据库

picture.image

背景

picture.image

picture.image

Shap值是一种强大的工具,用于分析机器学习模型中特征对预测结果的影响。结合模型预测概率的可视化分析,可以更直观地理解模型的决策逻辑以及不同特征的重要性

本文将以R语言 explaineR 包提供的SHAP可视化示例为参考,利用Python实现类似的可视化效果。展示如何结合 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('2025-1-9公众号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需要一个已训练的模型来计算特征对预测结果的贡献,从而帮助理解模型的决策机制

绘图数据准备


          
import shap
          
explainer = shap.TreeExplainer(xgboost)
          
shap_values = explainer.shap_values(X_test)
          

          
shap_values_df = pd.DataFrame(shap_values, columns=X_test.columns)
          

          
# 获取类别的预测概率和预测值
          
y_pred_proba = xgboost.predict_proba(X_test)  # 获取类别 0 和类别 1 的预测概率
          
y_pred = xgboost.predict(X_test)  # 获取预测类别
          

          
# 将预测值和真实值加入 shap_values_df
          
shap_values_df['class_0_proba'] = y_pred_proba[:, 0]  # 类别 0 的预测概率
          
shap_values_df['class_1_proba'] = y_pred_proba[:, 1]  # 类别 1 的预测概率
          
shap_values_df['predicted_class'] = y_pred  # 模型预测类别
          
shap_values_df['true_class'] = y_test.values  # 真实类别
          
shap_values_df['prediction_correct'] = (shap_values_df['predicted_class'] == shap_values_df['true_class'])  # 是否预测正确
          

          
# 查看结果
          
shap_values_df.head()
      

picture.image

通过计算SHAP 值分析每个特征对测试集预测结果的贡献,同时结合模型的预测概率、预测类别和真实类别,生成了一个包含完整预测和解释信息的DataFrame,用于进一步分析模型行为和解释预测结果

SHAP值与预测概率的可视化


          
plt.figure(figsize=(6, 4),dpi=1200)
          
plt.scatter(shap_values_df['X_2'], shap_values_df['class_1_proba'],s=10, color="#6A9ACE")
          
plt.xlabel('SHAP value for X_2', fontsize=12)
          
plt.ylabel('class_1_proba', fontsize=12) 
          
# 添加概率=0.5的横线
          
plt.axhline(y=0.5, color='black', linestyle='-.', linewidth=1)
          
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

以特征 X_2 的 SHAP 值为横轴,模型预测为类别 1 的概率为纵轴,绘制散点图,展示了 X_2 对预测概率的影响关系,并通过一条水平线标注了 0.5 的决策边界,用于分析特征贡献与模型输出之间的关联

区分类别的特征影响力:SHAP值与预测概率的可视化


          
# 使用相同颜色,绘制预测类别为1的点(圆圈)
          
plt.scatter(
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 1, 'X_2'], 
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 1, 'class_1_proba'], 
          
    s=10, color="#6A9ACE", label="Class 1", marker='o'
          
)
          

          
# 使用相同颜色,绘制预测类别为0的点(三角形)
          
plt.scatter(
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 0, 'X_2'], 
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 0, 'class_1_proba'], 
          
    s=10, color="#6A9ACE", label="Class 0", marker='^'
          
)
          
# 添加概率=0.5的横线
          
plt.axhline(y=0.5, color='black', linestyle='-.', linewidth=1)
          
# 添加标签和修饰
          
plt.xlabel('SHAP value for X_2', fontsize=12)
          
plt.ylabel('class_1_proba', fontsize=12)
          
ax = plt.gca()
          
ax.spines['top'].set_visible(False)
          
ax.spines['right'].set_visible(False)
          

          
# 设置图例
          
legend = plt.legend(
          
    title="pred_class",
          
    fontsize=10, loc='center left', bbox_to_anchor=(1.0, 0.5), frameon=False
          
)
          
plt.setp(legend.get_title(), fontsize=10)  # 设置图例标题字体大小
          

          
# 保存并显示图像
          
plt.savefig("2.png", format='png', bbox_inches='tight')
          
plt.show()
      

picture.image

通过将预测类别分别用不同形状的点(圆圈和三角形)绘制在 SHAP 值与预测概率的散点图中,直观展示了特征 X_2 对分类结果(类别 0 和类别 1)的影响关系

LOWESS拟合曲线:揭示SHAP值与预测概率的平滑关系


          
from statsmodels.nonparametric.smoothers_lowess import lowess
          

          
plt.figure(figsize=(6, 4), dpi=1200)
          

          
# 统一颜色
          
color = "#6A9ACE"
          

          
# 绘制预测类别为1的点(圆圈)
          
plt.scatter(
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 1, 'X_2'], 
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 1, 'class_1_proba'], 
          
    s=10, color=color, label="Class 1", marker='o'
          
)
          

          
# 绘制预测类别为0的点(三角形)
          
plt.scatter(
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 0, 'X_2'], 
          
    shap_values_df.loc[shap_values_df['predicted_class'] == 0, 'class_1_proba'], 
          
    s=10, color=color, label="Class 0", marker='^'
          
)
          

          
# 添加概率=0.5的横线
          
plt.axhline(y=0.5, color='black', linestyle='-.', linewidth=1)
          

          
# 计算并绘制 LOWESS 曲线
          
# 对类别 1 进行 LOWESS 拟合
          
class_1_data = shap_values_df.loc[shap_values_df['predicted_class'] == 1]
          
lowess_class_1 = lowess(class_1_data['class_1_proba'], class_1_data['X_2'], frac=0.3)
          
plt.plot(
          
    lowess_class_1[:, 0], lowess_class_1[:, 1],
          
    color=color, linestyle='-', linewidth=1.5
          
)
          

          
# 对类别 0 进行 LOWESS 拟合
          
class_0_data = shap_values_df.loc[shap_values_df['predicted_class'] == 0]
          
lowess_class_0 = lowess(class_0_data['class_1_proba'], class_0_data['X_2'], frac=0.3)
          
plt.plot(
          
    lowess_class_0[:, 0], lowess_class_0[:, 1],
          
    color=color, linestyle='-', linewidth=1.5
          
)
          

          
# 添加标签和修饰
          
plt.xlabel('SHAP value for X_2', fontsize=12)
          
plt.ylabel('class_1_proba', fontsize=12)
          
ax = plt.gca()
          
ax.spines['top'].set_visible(False)
          
ax.spines['right'].set_visible(False)
          

          
# 设置图例
          
legend = plt.legend(
          
    title="pred_class",
          
    fontsize=10, loc='center left', bbox_to_anchor=(1.0, 0.5), frameon=False
          
)
          
plt.setp(legend.get_title(), fontsize=10)  # 设置图例标题字体大小
          

          
# 保存并显示图像
          
plt.savefig("3.png", format='png', bbox_inches='tight')
          
plt.show()
      

picture.image

通过散点图和LOWESS拟合曲线,直观展示特征 X_2 的 SHAP 值与预测概率的平滑关系,并区分不同预测类别,与 R语言 explaineR 包 提供的 SHAP 可视化示例效果一致,实现了特征贡献与模型输出概率的解读

预测正确与错误的对比:SHAP值与概率分布可视化

picture.image

在原有 SHAP 值与预测概率的可视化基础上,新增预测正确与错误的分类因素,通过不同颜色和标注区分预测正确与错误的点,进一步揭示模型在特定特征下的预测表现和错误分布

颜色映射揭示原始特征值分布

picture.image

通过颜色映射展示原始特征值X2的分布,结合SHAP值与预测概率的关系以及不同预测类别(分类0和分类1)的点分布,可以直观观察X2的原始值如何影响SHAP值和模型的预测概率,图中可以看出特征X2的值对模型预测类别的贡献模式,以及SHAP值和概率随X2值的变化趋势,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

往期推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

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