You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Seaborn绘制两数据集随机森林特征重要性条形图无重叠方法

双数据集随机森林特征重要性分组条形图实现方案

要实现无重叠的同图分组对比,不要直接连续调用两次sns.barplot叠画,核心流程是先把两个数据集的特征重要性结果合并为长格式(Long-form)DataFrame,再通过seaborn的hue参数指定数据集分组,自动生成并排分组条形效果,完全避免重叠。


完整实现代码

保留原有的随机森林特征重要性计算逻辑,新增数据整合和分组绘图部分,同时修正原Data1代码的缩进问题:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

# ---------------------- Data2特征重要性计算 ----------------------
XData2 = Data2.drop(['Label'], axis=1)
yData2 = Data2['Label']
Xtrain, Xtest, ytrain, ytest = train_test_split(XData2, yData2, test_size = 0.33, random_state = 42)
RF_featuresData2 = RandomForestClassifier(n_estimators=100, random_state=0)
RF_featuresData2.fit(Xtrain, ytrain)
feature_scoresData2 = pd.Series(RF_featuresData2.feature_importances_, index=Xtrain.columns, name='importance')

# ---------------------- Data1特征重要性计算 ----------------------
XData1 = Data1.drop(['Label'], axis=1)
yData1 = Data1['Label']
X_train, X_test, y_train, y_test = train_test_split(XData1, yData1, test_size = 0.33, random_state = 42)
RF_featuresData1 = RandomForestClassifier(n_estimators=100, random_state=0)
RF_featuresData1.fit(X_train, y_train)
feature_scoresData1 = pd.Series(RF_featuresData1.feature_importances_, index=X_train.columns, name='importance')

# ---------------------- 数据整合(核心步骤) ----------------------
# 给两个结果添加数据集标签,转换为统一格式后合并
df_data2 = feature_scoresData2.reset_index().rename(columns={'index':'feature'})
df_data2['dataset'] = 'Data2'

df_data1 = feature_scoresData1.reset_index().rename(columns={'index':'feature'})
df_data1['dataset'] = 'Data1'

# 合并为seaborn支持的长表结构
df_all = pd.concat([df_data1, df_data2], axis=0, ignore_index=True)

# 统一特征排序规则:按两个数据集的平均特征重要性降序排列,避免错位
feature_order = df_all.groupby('feature')['importance'].mean().sort_values(ascending=False).index

# ---------------------- 绘制分组条形图 ----------------------
plt.figure(figsize=(10, 8)) # 可根据特征总数调整画布宽高
sns.barplot(
    data=df_all,
    x='importance',
    y='feature',
    hue='dataset', # 指定分组字段,自动生成并排偏移的条形
    order=feature_order, # 强制使用统一特征排序
    palette='Set2' # 可自定义配色区分两个数据集
)

plt.xlabel('Feature Importance')
plt.ylabel('Feature Name')
plt.title('Random Forest Feature Importance: Data1 vs Data2')
plt.legend(title='Dataset')
plt.tight_layout() # 自动调整布局避免标签截断
plt.show()

关键注意点

  • 直接连续调用两次sns.barplot会把两组条形绘制在同一y轴刻度位置,必然出现重叠;通过hue参数分组后,seaborn会自动为同一特征下的两个条形分配水平偏移,实现无重叠并排效果
  • 必须通过order参数指定全局统一的特征排序,否则如果两个数据集单独计算的特征重要性排序不一致,会出现条形和特征名错位的问题
  • 如果两个数据集存在各自独有的特征,合并后对应缺失的重要性数值会自动留空,不会绘制无效条形

内容的提问来源于stack exchange,提问作者linuxpanther

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:15:45