本文介绍如何将多个特征的 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 分组),前提是输入数据结构正确。
核心步骤如下:
- 数据融合与重塑:先用 join() 合并 SHAP 值(如 A_shap, B_shap)和训练集 one-hot 列(如 A_train, B_train),再通过 melt() 将所有 _shap 列转为长格式,生成 Feature(特征名)、SHAP Value(数值)两列;
- 关联 one-hot 状态:利用 apply() 和 loc 动态提取每行对应特征的 one-hot 值(如当前行为 Feature='A',则取 merged_df['A_train']),新增 One-hot Value 列;
- 统一绘图:调用 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()
✅ 优势说明:
- 单图呈现全部特征,支持横向比较各特征 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 信息扩展、子图联动),是构建可复现、可部署模型解释仪表盘的关键实践。










