如何用Plotly将多变量SHAP值蜂群图合并为单张综合图?
问题:用Plotly复现SHAP汇总蜂群图(多变量合并展示)
我正在尝试用Plotly复现SHAP库的汇总图,手头有两个数据集:
- 包含各数据点SHAP值的数据集
- 包含特征独热编码(值为0或1)的原始数据集
目标是生成SHAP值的蜂群图,并根据对应独热编码变量的0/1值给每个点上色。目前的代码只能生成单变量的图表,想把所有变量的图表合并成一张综合图。
现有单变量绘图代码:
figures = [] for column in shap_values.columns: fig = px.strip(merged_df, x=merged_df[column+'_shap'], color=merged_df[column+'_train'], orientation='h', stripmode='overlay') fig.update_layout( title=f'Bee swarm plot de la valeur de Shapley pour {column}', xaxis_title='Valeur de Shapley (impact sur la sortie du modèle)', yaxis_title='Caractéristique' ) figures.append(fig)
示例数据:
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')
解决方案
要实现多变量合并的蜂群图,核心是把宽格式数据转换为长格式,让Plotly能在同一个y轴上展示所有特征。
步骤1:重塑数据结构
将每个特征的SHAP值、对应编码值统一整理到三列中:特征名、SHAP值、特征编码值。
步骤2:绘制综合蜂群图
用px.strip()基于长格式数据绘图,将y轴设为特征名,x轴为SHAP值,颜色用编码值区分。
完整代码:
import pandas as pd import plotly.express as px # 1. 处理示例数据(实际使用时替换为你的数据集) 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_long = pd.DataFrame() for col in shap_values.columns: temp_df = pd.DataFrame({ '特征': col, 'SHAP值': shap_values[col], '特征编码': train[col] }) merged_long = pd.concat([merged_long, temp_df], ignore_index=True) # 2. 绘制综合蜂群图 fig = px.strip(merged_long, x='SHAP值', y='特征', color='特征编码', orientation='h', stripmode='overlay', color_discrete_map={0: '#1f77b4', 1: '#ff7f0e'}) # 可自定义0/1对应的颜色 # 调整图表布局 fig.update_layout( title='SHAP值汇总蜂群图', xaxis_title='SHAP值(对模型输出的影响)', yaxis_title='特征', legend_title='特征编码值' ) fig.show()
说明
- 长格式数据让所有特征的SHAP值都能在同一个图表中展示,y轴自动按特征名分类
stripmode='overlay'保持点的重叠效果,更贴近SHAP原生汇总图的样式- 通过
color_discrete_map可以自定义0和1对应的颜色,匹配你的可视化需求
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

