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
相关产品推荐
相关产品推荐

