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

文摘   2025-01-10 20:00   美国  

背景

Shap值是一种强大的工具,用于分析机器学习模型中特征对预测结果的影响。结合模型预测概率的可视化分析,可以更直观地理解模型的决策逻辑以及不同特征的重要性
本文将以R语言 explaineR 包提供的SHAP可视化示例为参考,利用Python实现类似的可视化效果。展示如何结合 SHAP 值与模型预测概率,生成清晰的可视化图表,帮助深入理解模型的预测行为及特征作用
代码实现
模型构建
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltplt.rcParams['font.family'] = 'Times New Roman'plt.rcParams['axes.unicode_minus'] = Falsefrom sklearn.model_selection import train_test_splitdf = 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 XGBClassifierfrom sklearn.model_selection import GridSearchCV, StratifiedKFoldfrom sklearn.metrics import accuracy_score
# 定义 XGBoost 二分类模型model_xgb = XGBClassifier(use_label_encoder=False, eval_metric='logloss', random_state=8)
# 定义参数网格param_grid = {    'n_estimators': [50100200],    'max_depth': [357],    'learning_rate': [0.010.10.2],    'subsample': [0.81.0],    'colsample_bytree': [0.81.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 shapexplainer = 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_dfshap_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=(64),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.00.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=(64), 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.00.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可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:基于t-sne降维与模型预测概率的分类效果可视化
期刊配图:多种机器学习算法结合SHAP特征贡献在递归特征选择中的运用
置信区间+误差条:机器学习分类评价指标精美呈现
SCI图表:基于相关性和标准差的多模型评价——泰勒图解析
期刊文章配图:基于分组折线图的多机器学习模型表现评估对比
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
SCI图表复现:优化SHAP特征贡献图展示更多模型细节
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
SCI图表复现:特征相关性气泡热图展示
一图胜千言:回归预测模型训练集与测试集的进阶可视化
期刊文章配图:基于雷达图的多机器学习模型表现评估对比

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

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

欢迎关注、点赞、转发~

个人观点,仅供参考

地学韦丰吉司长
绝佳地理学视角,地学韦丰吉司长为您呈现精选“地学”文章,为您提供权威的科普文章、学术资源和地学知识。探索地球之美,解读地理之奥秘。欢迎广大地学科研工作者、爱好者投稿和业务推广。请后台私信或加VX(XWFxwf7)联系韦丰小编!
 最新文章