Python中SHAP生成特征重要性图的显示问题求助
解决SHAP可视化中特征名截断与图像缩放问题
实用解决方法
下面是针对SHAP图特征名截断、缩放不佳问题的具体调整方案:
1. 结合Matplotlib布局与标签旋转
SHAP绘图依赖Matplotlib,通过调整标签角度和自动布局,能有效避免特征名被截断:
- 用
plt.xticks(rotation=45, ha='right')旋转x轴标签并右对齐,适配长特征名 - 调用
plt.tight_layout()自动调整图中元素间距,消除重叠
2. 显式设置图像尺寸
部分SHAP绘图函数(如shap.plots.bar)支持直接传入figsize参数;对于不支持的函数(如旧版本的beeswarm),可提前用plt.figure()指定尺寸。
3. 全局配置Matplotlib默认参数
提前设置全局绘图参数,避免重复调整,确保所有SHAP图的缩放一致性:
import matplotlib.pyplot as plt plt.rcParams['figure.figsize'] = (12, 8) # 默认图尺寸 plt.rcParams['font.size'] = 10 # 统一字体大小
4. 缩短过长的特征名(可选)
如果特征名本身过长,可手动缩短或设置别名,从根源解决截断问题:
# 示例:将特征名截断为前15个字符并添加省略号 shortened_feature_names = [ f"{name[:15]}..." if len(name) > 15 else name for name in selected_feature_names ]
修改后的完整代码示例
import shap import numpy as np import pandas as pd import matplotlib.pyplot as plt # 全局配置Matplotlib参数 plt.rcParams['figure.figsize'] = (12, 8) plt.rcParams['font.size'] = 10 # 原有SHAP计算逻辑不变 explainer = shap.TreeExplainer(trained_model_gbm) shap_values = explainer.shap_values(x_test_selected) shap_importance = np.abs(shap_values).mean(axis=0) importance_df = pd.DataFrame({ 'features': selected_feature_names, 'importance': shap_importance }) importance_df.sort_values(by='importance', ascending=False, inplace=True) print(importance_df) # (可选)使用缩短后的特征名 # shortened_feature_names = [f"{name[:15]}..." if len(name) >15 else name for name in selected_feature_names] shap_exp = shap.Explanation( values=shap_values, base_values=explainer.expected_value, data=x_test_selected, feature_names=selected_feature_names # 替换为shortened_feature_names(如果使用) ) # 调整Beeswarm图 plt.figure(figsize=(14, 10)) # 手动指定尺寸 shap.plots.beeswarm(shap_exp, max_display=len(selected_feature_names)) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show() # 调整Bar图 shap.plots.bar( shap_exp, max_display=len(selected_feature_names), figsize=(12, 8) ) plt.xticks(rotation=45, ha='right') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Lucas F. T. Leonardo
相关产品推荐
相关产品推荐

