如何使用 Plotly 复现 SHAP Summary Plot(蜂群图)
本文介绍如何将多个特征的 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()
✅ 优势说明:
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 信息扩展、子图联动),是构建可复现、可部署模型解释仪表盘的关键实践。
如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!
猜您喜欢
我的世界如何使用指令找到地狱堡垒
2026-07-09我的世界游戏里面有很多的指令,今天给大家带来了游戏里面的使用指令找到地狱堡垒方法,还有小伙伴不清楚要怎么使用,那么下面就是相关的内容. 我的世界使用指令找到地狱堡垒方法 方法/步骤1 搭建地狱传送门 使用黑曜石,搭建地狱传送门。 传送至地狱 进入地狱传送门,传送至地狱。 输入指令 输入指令“/locatestructureminecraft:fortress”,查看地狱堡垒坐标。 到达坐标 按下F...
迷你世界工具箱如何使用
2026-06-27迷你世界游戏里面有很多的道具内容,今天给大家带来了游戏里面的工具箱使用方法,还有小伙伴不清楚工具箱如何使用,那么下面就是相关的内容. 迷你世界工具箱使用方法 1、先将工具箱放置到快捷栏上 2、点快捷栏上的图标,将工具箱拿在手里,点击附近的地面,将工具箱放在地上 轻轻一点工具箱,就会打开制作界面,当你身上有材料时,制作界面就会自动显示相关的工具。 迷你世界用工具箱制作木镐的图文攻略: 1、点地面上的...
迷你世界工作台如何使用
2026-06-11迷你世界游戏里面的工作台使用方法:先将工具箱放入快捷物品栏,然后滑动鼠标滚轮或按快捷键将工具箱放置到地面;右击工具箱即可打开制作页面。 详细答案: 工具箱在背包中是无法使用的,先将工具箱放入快捷物品栏,然后滑动鼠标滚轮或按快捷键将工具箱放置到地面。 右击工具箱即可打开制作页面。 工具箱的制作痕材压图标是绿色的,而在背包中制作物品时,制作选项是橘色的。背包可制作的物品工具箱全部可以做,反之则不然。 ...
Blurrr如何使用?Blurrr进阶特效与剪辑实操技巧
2026-06-04Blurrrv3.8.2支持空对象父子绑定、AI补帧与HDR规避导出:空对象需置于被控图层上方并正向绑定;3D粒子须先建摄像机再绑定;果冻帧校正须在补帧后、加滤镜前启用,强度调至65%~75%。 想在Blurrr里做出带3D粒子、关键帧动画和智能抠图的高完成度短视频,又卡在特效叠加顺序、轨道混排逻辑或补帧后果冻帧修复上?官方v3.8.2最新版已支持空对象父子级绑定、AI补帧与HDR规避导出,但多数...
我的世界命令方块如何使用传送指令
2026-06-041.进入游戏,按"T"打开指令输入框;2.输入"/give@Pminecraft:command_block"获得命令方块;3.拿到命令方块有,右键将其放在地上,再右键打开;4.输入"/TPXXXXXXXXX";5.合成红石火把,然后放置在命令方块的右边,将其激活就可以传送了。 详细答案: 进入游戏,按"T"打开指令输入框. 输入"/give@Pminecraft:command_block"获得...
迷你世界蓝图图纸如何使用
2026-06-04迷你世界蓝图图纸使用方法:1、将蓝图图纸放在地面上会出现一个蓝色的立体框架;2、然后将一个开关放在蓝图图纸旁边后并启动开关,接着就会在立体框架中自动复制蓝图上的房子,之后就会呈现出来图纸上面的建筑了。 详细答案: 首先进入游戏房间内,找到自己喜欢的建筑,准备复制(目前只可在非生存、极限模式内可使用) 按照图片内先放这个红色的区域复制方块 在另一边也放区域复制方块,注意,要在下面垫方块,就会出现蓝色...
如何修复Python aiohttp请求时出现的ClientPayloadError?
2026-06-04ClientPayloadError表明服务端提前关闭连接,非客户端代码错误;常见于服务端超时、拒绝大响应或代理截断,需通过抓包、检查响应头、服务端日志及添加读取超时和异常处理来定位解决。 ClientPayloadError通常意味着服务端提前关闭了连接 这个错误不是客户端代码写错了,而是aiohttp在读取响应体时发现服务端已经断开了连接。常见于服务端超时、主动拒绝大响应、或代理/网关(如Ng...
如何使用Python监控服务器CPU温度并邮件告警_通过psutil模块读取系统信息
2026-06-04psutil无法直接读取CPU温度,因其依赖系统硬件接口且Linux需lm_sensors支持、Windows/macOS完全不支持;可靠方式是用subprocess调用sensors命令解析输出,并配合邮件告警与健壮性设计。 psutil本身不提供CPU温度读取功能——它无法直接获取温度传感器数据,强行调用psutil.sensors_temperatures()在多数Linux发行版(尤其是无...
如何在Python中验证文件的MD5校验和以确保数据完整性?
2026-06-04必须分块读取,推荐8192或65536字节块大小,以rb模式打开文件,循环调用update(),最后用hexdigest()获取32位小写十六进制字符串;校验时需strip().lower()统一格式并做长度校验。 用hashlib.md5()读取文件并计算校验和 直接调用hashlib.md5()并传入整个文件内容(比如md5.update(f.read()))在大文件上会爆内存。必须分块读取,...
怎样在Python Tkinter中使用线程池处理高并发的GUI数据更新?
2026-06-04不能直接用ThreadPoolExecutor更新Tkinter控件,因为Tkinter的Tcl解释器只允许主线程操作UI;子线程(包括线程池中的工作线程)调用widget方法会引发TclError或卡死;必须通过queue.Queue+root.after()将结果安全传回主线程更新。 为什么不能直接用concurrent.futures.ThreadPoolExecutor更新Tkinter控...
