如何使用 Plotly 复现 SHAP Summary Plot(蜂群图)

如何使用 Plotly 复现 SHAP Summary Plot(蜂群图)

Python

本文介绍如何将多个特征的 shap 值整合到一张 plotly 蜂群图中,按原始特征分组、按 one-hot 编码值(0/1)着色,实现媲美 shap 原生 summary_plot 的可视化效果。

本文介绍如何将多个特征的 shap 值整合到一张 plotly 蜂群图中,按原始特征分组、按 one-hot 编码值(0/1)着色,实现媲美 shap 原生 summary_plot 的可视化效果。

要复现 SHAP 库中经典的 summary_plot(水平蜂群图),关键在于:将多维 SHAP 值与对应特征状态统一为长格式数据,并在单图中按特征分面、按编码值着色。原代码中对每个特征单独绘图并存入列表,虽可行但无法直观对比特征间影响强度与分布模式。而 Plotly 的 px.strip() 支持多类别 y 轴(即不同特征作为 y 分组),前提是输入数据结构正确。

核心步骤如下:

  1. 数据融合与重塑:先用 join() 合并 SHAP 值(如 A_shap, B_shap)和训练集 one-hot 列(如 A_train, B_train),再通过 melt() 将所有 _shap 列转为长格式,生成 Feature(特征名)、SHAP Value(数值)两列;
  2. 关联 one-hot 状态:利用 apply() 和 loc 动态提取每行对应特征的 one-hot 值(如当前行为 Feature='A',则取 merged_df['A_train']),新增 One-hot Value 列;
  3. 统一绘图:调用 px.strip(),指定 x='SHAP Value', y='Feature', color='One-hot Value',并设置 orientation='h' 实现水平蜂群布局。

以下是完整可运行示例:

import pandas as pd
import plotly.express as px

# 构造示例数据
shap_values = pd.DataFrame({
    "A": [-0.065704, -0.096510, 0.062368, 0.062368, 0.063093],
    "B": [-0.168249, -0.173284, -0.168756, -0.168756, -0.169378]
})
train = pd.DataFrame({
    "A": [0, 1, 1, 0, 0],
    "B": [1, 1, 0, 0, 1]
})

# 合并并重塑
merged_df = shap_values.join(train, lsuffix='_shap', rsuffix='_train')
melted_df = merged_df.melt(
    value_vars=[c for c in merged_df.columns if '_shap' in c],
    var_name='Feature',
    value_name='SHAP Value'
)
melted_df['Feature'] = melted_df['Feature'].str.replace('_shap', '')
melted_df['One-hot Value'] = melted_df.apply(
    lambda row: merged_df.loc[row.name, row['Feature'] + '_train'], axis=1
)

# 绘制综合蜂群图
fig = px.strip(
    melted_df,
    x='SHAP Value',
    y='Feature',
    color='One-hot Value',
    orientation='h',
    stripmode='overlay',
    title='SHAP Bee Swarm Summary Plot',
    color_discrete_map={0: '#636EFA', 1: '#EF553B'},  # 自定义配色提升可读性
    category_orders={'Feature': ['A', 'B']}  # 可选:固定特征顺序
)
fig.update_layout(
    xaxis_title='SHAP Value (Impact on Model Output)',
    yaxis_title='Feature',
    legend_title='One-hot Encoded Value'
)
fig.show()

优势说明

Kaiber

Kaiber是一个视频生成引擎,用户可以根据自己的图片或文字描述创建视频

  • 单图呈现全部特征,支持横向比较各特征 SHAP 值分布范围、偏移趋势及类别差异;
  • stripmode='overlay' 避免点堆叠过密,orientation='h' 符合 SHAP 惯例;
  • color_discrete_map 显式指定 0/1 颜色,避免 Plotly 默认配色混淆语义。

⚠️ 注意事项

  • 若特征数较多,建议添加 height=400 + len(features)*30 控制图表高度;
  • 对于高基数分类特征(one-hot 后列数多),应先聚合或筛选 top-K 特征,避免 y 轴拥挤;
  • 若原始特征含连续变量,需替换 One-hot Value 逻辑为分箱着色(如 pd.qcut())或透明度映射。

该方法完全脱离 SHAP 内置绘图依赖,灵活适配自定义交互(如 hover 信息扩展、子图联动),是构建可复现、可部署模型解释仪表盘的关键实践。

本文地址:https://www.sztg.com.cn/article/666246.html

如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!

猜您喜欢