如何获取LGBM Classifier模型的重要特征列表而非仅绘图
获取LGBM分类器特征重要性列表的实现方法
LightGBM训练完成的分类器内置了特征重要性的原生属性,不需要依赖绘图接口即可直接拿到结构化的列表数据,以下是两种常用实现方案:
方法1:调用模型内置属性获取(推荐)
该方法依赖sklearn接口规范的内置属性,实现最简便:
from lightgbm import LGBMClassifier from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split import pandas as pd # 示例:训练LGBM分类器(替换为你自己的训练逻辑即可) data = load_iris() X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, random_state=42) clf = LGBMClassifier(random_state=42, verbose=-1) clf.fit(X_train, y_train) # 核心逻辑:获取特征重要性+特征名,拼接成排序后的列表 feature_importance = clf.feature_importances_ feature_names = data.feature_names # 替换为你自己的特征名列表 # 转成DataFrame按重要性降序排序,也可以直接转成列表格式 importance_df = pd.DataFrame({ '特征名称': feature_names, '重要性得分': feature_importance }).sort_values(by='重要性得分', ascending=False) # 转纯嵌套列表的写法 importance_list = importance_df.values.tolist()
如果你用的是原生lightgbm的
train()接口训练模型,把上述代码的clf.feature_importances_替换为model.feature_importance()即可。
方法2:从plot_importance接口直接提取数据
如果不想修改现有绘图逻辑,也可以直接从绘图接口返回的对象里提取数据:
import lightgbm as lgb import matplotlib.pyplot as plt # 你原本的绘图代码 ax = lgb.plot_importance(clf, importance_type='split') # 保持你绘图时的importance_type参数不变 plt.close() # 不需要显示图可直接关闭 # 从ax对象提取重要性数据 y_ticks = ax.get_yticklabels() feature_names = [tick.get_text() for tick in y_ticks] importance_scores = ax.patches[::-1] # 绘图时y轴默认倒序,需要反转匹配 importance_scores = [patch.get_width() for patch in importance_scores] # 拼接为列表 importance_list = list(zip(feature_names, importance_scores))
补充说明
- 重要性计算支持两种规则:
split按特征被用于节点分裂的次数统计,gain按特征分裂带来的总增益统计,你可以根据需求调整importance_type参数,上述两种方法都支持该参数配置。 - 如需筛选Top N重要特征,直接取排序后结果的前N行即可,比如取Top5可写
importance_df.head(5)。
内容的提问来源于stack exchange,提问作者M J
相关产品推荐
相关产品推荐

