回归任务下Shap Beeswarm图配色设置及SHAP值信息提取咨询
回归任务下的SHAP Beeswarm图适配与信息提取
一、配色设置(替代分类标签的方案)
回归任务没有离散分类标签,可采用两种实用配色逻辑:
- 用回归预测值作为配色:直观展示SHAP值分布与最终预测结果的关联
- 用原始特征的数值作为配色:分析单个特征取值对其SHAP贡献的影响
修改后的代码示例
import shap import pandas as pd import numpy as np import plotly.express as px # 初始化SHAP解释器(回归任务沿用predict方法) explainer = shap.Explainer(best_model.predict, X_test) shap_values = explainer(X_test) # 构造SHAP数据框:包含预测值、样本ID、各特征SHAP值 shap_df = pd.DataFrame( np.c_[best_model.predict(X_test), shap_values.values], columns = ['predictions'] + list(X_test.columns) ) # 关联样本ID(替换为你的实际ID列) shap_df['transaction_id'] = X_test.index # 按特征SHAP绝对值均值排序(保留原逻辑) values = shap_df.iloc[:,1:-1].abs().mean(axis=0).sort_values().index df_plot = pd.melt(shap_df, id_vars=['transaction_id', 'predictions'], value_vars=values, var_name='Feature', value_name='SHAP') # 配色方案1:用回归预测值做连续色阶 fig = px.strip(df_plot, x='SHAP', y='Feature', color='predictions', stripmode='overlay', height=4000, width=1000, hover_data=['transaction_id', df_plot.index], color_continuous_scale='RdBu') # 配色方案2:用单个关键特征(如'house_area')做颜色 # fig = px.strip(df_plot, x='SHAP', y='Feature', color=X_test['house_area'].values, # stripmode='overlay', height=4000, width=1000, # hover_data=['transaction_id', df_plot.index], # color_continuous_scale='Viridis') # 保留原布局设置 fig.update_layout(xaxis=dict(showgrid=True, gridcolor='WhiteSmoke', zerolinecolor='Gainsboro'), yaxis=dict(showgrid=True, gridcolor='WhiteSmoke', zerolinecolor='Gainsboro'), plot_bgcolor='white', boxgap=0) fig.update_traces(jitter=1) fig.write_html('regression_beeswarm.html')
二、从SHAP值中提取关键信息
1. 全局特征重要性
按特征SHAP值的绝对值均值排序,得到最影响模型预测的特征:
feature_importance = pd.DataFrame({ 'feature': X_test.columns, 'shap_importance': np.abs(shap_values.values).mean(axis=0) }).sort_values('shap_importance', ascending=False)
2. 单个样本的贡献分析
查看单条样本中各特征对预测值的拉抬/压低作用:
# 取第0个样本的SHAP贡献详情 sample_shap = pd.DataFrame({ 'feature': X_test.columns, 'shap_value': shap_values.values[0], 'feature_value': X_test.iloc[0].values }).sort_values('shap_value', ascending=False) # 正SHAP值=拉高预测值,负SHAP值=拉低预测值
3. 特征与SHAP值的关联趋势
分析单个特征取值和其SHAP值的对应关系,判断特征对预测的影响方向:
# 以特征'house_area'为例 feature_name = 'house_area' feature_shap_df = pd.DataFrame({ 'feature_value': X_test[feature_name], 'shap_value': shap_values.values[:, X_test.columns.get_loc(feature_name)] }) # 可视化趋势 fig = px.scatter(feature_shap_df, x='feature_value', y='shap_value') fig.write_html('feature_shap_trend.html')
4. 基准值解读
shap_values.base_values是模型的基准预测值(无特征输入时的平均预测结果),单个样本的预测值=基准值+该样本所有特征的SHAP值之和:
base_value = shap_values.base_values[0] # 所有样本基准值一致
内容的提问来源于stack exchange,提问作者mirix
相关产品推荐
相关产品推荐

