如何用Matplotlib将特征重要性分数按从高到低排序可视化?
解决ExtraTreesClassifier特征重要性排序可视化问题
针对你遇到的特征重要性未按分数排序的问题,我来一步步帮你搞定:
1. 实现按重要性分数从高到低排序并可视化的方法
核心思路是先对特征重要性分数进行降序排序,同时让对应的特征名称同步排序,这样绘图时就能呈现从高到低的顺序。我修改了你的代码,加入了完整的排序逻辑,你可以直接复用:
from pandas import read_excel from sklearn.ensemble import ExtraTreesClassifier import matplotlib.pyplot as plt import numpy as np # 加载数据 names = ['8,oct18', '3,oct18', '4,oct18', '3,sen17', '3,sen17', '4,sen17', '8,sen17', '3,aug17', '8,aug17','4,aug17', '3,apr17', '4,apr17', '8,apr17', '3,jan17', '8,jan17', '4,jan17', 'jan19', 'jan19', 'jan19', 'may18', 'may18', 'may18', '11, sen17', '11, dec2017', '12,dec2017', '11,aug 2017', '12,aug 2017', '11, apr 2017', '12, apr 2017', '30t', 'class'] dataframe = read_excel("/home/qw/myprojects/valuevo/data.xlsx", names=names) array = dataframe.values X = array[:,0:30] Y = array[:,30] # 计算特征重要性 model = ExtraTreesClassifier() model.fit(X, Y) # 准备特征名称和对应分数(去掉最后一个类别列) feature_names = np.array(names[:-1]) importances = np.array(model.feature_importances_) # 关键:按重要性降序排序,同步特征名称顺序 sorted_indices = np.argsort(importances)[::-1] # 获取降序排序的索引 sorted_importances = importances[sorted_indices] sorted_features = feature_names[sorted_indices] # 绘图(换成横向条形图更适配30个特征的展示) plt.figure(figsize=(10, 8)) plt.title("ExtraTrees Feature Importance (Sorted)") plt.barh(sorted_features, sorted_importances) plt.xlabel("Importance Score") plt.ylabel("Feature Names") plt.show()
核心步骤说明:
np.argsort(importances)[::-1]:argsort会生成数组从小到大排序的索引,加上[::-1]就把索引反转成从大到小的顺序,这是实现降序排序的关键。- 用排序后的索引重新提取特征名和分数,就能保证两者一一对应且按分数从高到低排列。
- 换成
barh横向条形图,能避免30个特征的名称因长度过长挤在一起,提升可读性。
2. 控制排序逻辑的变量/工具
排序逻辑是由NumPy来控制的,Matplotlib仅负责绘制已经排好序的数据,本身不处理排序:
- 核心工具是
np.argsort()函数,它生成排序后的索引数组,我们通过这个索引来重新排列特征名和重要性分数。 - 你也可以用Python内置的
sorted()函数配合zip()实现排序,效果一致:
# 另一种排序方式:用Python内置工具 sorted_pairs = sorted(zip(feature_names, importances), key=lambda x: x[1], reverse=True) sorted_features, sorted_importances = zip(*sorted_pairs)
内容的提问来源于stack exchange,提问作者Tyomik_mnemonic
相关产品推荐
相关产品推荐

