背景
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()
通过计算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()
以特征 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()
通过将预测类别分别用不同形状的点(圆圈和三角形)绘制在 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()
通过散点图和LOWESS拟合曲线,直观展示特征 X_2 的 SHAP 值与预测概率的平滑关系,并区分不同预测类别,与 R语言 explaineR 包 提供的 SHAP 可视化示例效果一致,实现了特征贡献与模型输出概率的解读
预测正确与错误的对比:SHAP值与概率分布可视化
在原有 SHAP 值与预测概率的可视化基础上,新增预测正确与错误的分类因素,通过不同颜色和标注区分预测正确与错误的点,进一步揭示模型在特定特征下的预测表现和错误分布
颜色映射揭示原始特征值分布
通过颜色映射展示原始特征值X2的分布,结合SHAP值与预测概率的关系以及不同预测类别(分类0和分类1)的点分布,可以直观观察X2的原始值如何影响SHAP值和模型的预测概率,图中可以看出特征X2的值对模型预测类别的贡献模式,以及SHAP值和概率随X2值的变化趋势,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考