使用RandomForestClassifier时,如何确定SelectFromModel()的特征选择阈值?
基于RandomForestClassifier的70维特征筛选方案
嗨,刚好我经常用随机森林做特征筛选,来帮你把这个流程补全并梳理清楚~针对70个特征的场景,我们可以通过随机森林的特征重要性得分快速定位最有价值的特征,下面是完整的实现思路和代码:
1. 核心流程:训练模型并获取特征重要性
首先我们需要训练随机森林模型,然后利用它的feature_importances_属性拿到每个特征的重要性得分,再对得分降序排序:
import numpy as np from sklearn.ensemble import RandomForestClassifier # 假设你的特征列是data中除第一列外的所有列(第一列为标签) feat_labels = data.columns[1:] # 初始化随机森林:设置n_estimators保证模型稳定性,random_state确保结果可复现 clf = RandomForestClassifier(n_estimators=100, random_state=0) # 用训练集拟合模型 clf.fit(X_train, y_train) # 获取每个特征的重要性得分 importances = clf.feature_importances_ # 对得分降序排序,得到特征的索引顺序 indices = np.argsort(importances)[::-1]
2. 按重要性排名输出特征
接下来我们可以循环输出每个特征的排名、名称和具体得分,方便你直观查看:
print("特征重要性排名(从高到低):") for f in range(X_train.shape[1]): # 输出排名、特征名、保留4位小数的得分 print(f"{f+1}. 【{feat_labels[indices[f]]}】 | 重要性得分: {importances[indices[f]]:.4f}")
3. 快速筛选Top N特征
如果想直接提取最核心的N个特征(比如Top20),可以直接通过索引切片获取:
# 定义要筛选的Top数量 top_n = 20 # 获取Top N特征的名称列表 top_features = feat_labels[indices[:top_n]].tolist() print(f"\n筛选出的Top{top_n}核心特征: {top_features}") # 从训练集中提取这些特征,用于后续模型训练 X_train_top = X_train[top_features]
4. 可视化特征重要性(可选但推荐)
用条形图把70个特征的重要性可视化,能更直观地看到哪些特征是“关键玩家”:
import matplotlib.pyplot as plt plt.figure(figsize=(12, 8)) plt.title("70个特征的重要性排序", fontsize=14) # 绘制条形图 plt.bar(range(X_train.shape[1]), importances[indices], color='#1f77b4', align='center') # 设置x轴标签为特征名,旋转90度避免重叠 plt.xticks(range(X_train.shape[1]), feat_labels[indices], rotation=90, fontsize=10) plt.xlabel("特征名称", fontsize=12) plt.ylabel("重要性得分", fontsize=12) # 自动调整布局,防止标签被截断 plt.tight_layout() plt.show()
一些实用小贴士
- 如果你觉得重要性得分不够稳定,可以把
n_estimators调大(比如200或500),树越多,模型的特征重要性评估越可靠; - 随机森林的内置重要性得分对高基数特征、数值范围大的特征有偏向性,如果你的特征里有这类情况,建议先做标准化、编码等预处理;
- 要是需要更严谨的评估,可以用sklearn的
permutation_importance函数(排列重要性),它通过打乱特征值来评估特征对模型的影响,比内置得分更鲁棒。
内容的提问来源于stack exchange,提问作者stone rock
相关产品推荐
相关产品推荐

