求助绘制带回归线与直方图的SHAP部分依赖图
实现带回归线与分布直方图的SHAP部分依赖图
要实现你需要的这种组合图(主图为SHAP散点+带置信区间的回归线,顶部/右侧分别展示变量值/SHAP值的直方图),关键是用matplotlib.gridspec.GridSpec提前规划布局,而非直接传递ax=ax参数给shap的绘图函数。以下是可直接运行的实现方案:
完整代码示例
import shap import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec import seaborn as sns from sklearn.datasets import load_boston from sklearn.ensemble import RandomForestRegressor # 1. 准备数据与训练模型(可替换为你的数据集和模型) boston = load_boston() X = boston.data y = boston.target model = RandomForestRegressor(n_estimators=100, random_state=42) model.fit(X, y) # 2. 计算SHAP值 explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X) # 3. 构建网格布局 fig = plt.figure(figsize=(10, 8)) # 2行2列网格:宽度比4:1(主图:右侧直方图),高度比1:4(顶部直方图:主图),间距压缩 gs = GridSpec(2, 2, width_ratios=[4, 1], height_ratios=[1, 4], wspace=0.05, hspace=0.05) # 分配子图轴 main_ax = fig.add_subplot(gs[1, 0]) # 主图:右下角(索引从0开始) top_hist_ax = fig.add_subplot(gs[0, 0], sharex=main_ax) # 顶部直方图:左上角,共享主图x轴 right_hist_ax = fig.add_subplot(gs[1, 1], sharey=main_ax) # 右侧直方图:右上角,共享主图y轴 # 4. 绘制主SHAP部分依赖图 shap.partial_dependence_plot( 0, # 要分析的特征索引(此处选波士顿房价的CRIM特征) model.predict, X, feature_names=boston.feature_names, ax=main_ax, show=False, # 禁止自动弹出窗口,避免覆盖自定义布局 ice=False, # 关闭个体条件期望线,仅保留散点和均值参考线 scatter=True, alpha=0.3 # 散点透明度,避免重叠 ) # 5. 添加带置信区间阴影的回归线 sns.regplot( x=X[:, 0], y=shap_values[:, 0], ax=main_ax, scatter=False, # 不重复绘制散点 color='#ff4b4b', ci=95, # 95%置信区间阴影 line_kws={'lw': 2} ) # 6. 绘制顶部变量值分布直方图 sns.histplot(X[:, 0], ax=top_hist_ax, bins=20, kde=True, color='#1f77b4') top_hist_ax.set_xlabel('') top_hist_ax.set_ylabel('') top_hist_ax.tick_params(axis='x', labelbottom=False) # 隐藏x刻度,与主图对齐 # 7. 绘制右侧SHAP值分布直方图 sns.histplot(shap_values[:, 0], ax=right_hist_ax, bins=20, kde=True, color='#ff7f0e', orientation='horizontal') right_hist_ax.set_xlabel('') right_hist_ax.set_ylabel('') right_hist_ax.tick_params(axis='y', labelleft=False) # 隐藏y刻度,与主图对齐 # 调整整体布局 plt.tight_layout() plt.show()
关键实现细节
- 布局控制:用
GridSpec精确分配子图位置和比例,解决直接传递ax=ax无效的问题——shap的绘图函数默认会创建新轴对象,提前构建轴并指定给它才能嵌入自定义布局。 - 回归线与阴影:借助
seaborn.regplot实现带95%置信区间阴影的回归线,无需手动拟合模型。 - 直方图对齐:通过
sharex/sharey参数让直方图与主图共享坐标轴,隐藏冗余刻度提升视觉连贯性。
内容的提问来源于stack exchange,提问作者Junaid Latif
相关产品推荐
相关产品推荐

