You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助绘制带回归线与直方图的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:35:14