RandomForest.feature_importances_ 返回基于平均不纯度减少量(MDI)计算的各特征相对重要性得分,为未归一化的numpy数组;需模型fit后调用,注意Pipeline中需从named_steps获取,且X_train须为二维数组。

RandomForest.feature_importances_ 返回的是什么
feature_importances_ 是训练完成的 RandomForestClassifier 或 RandomForestRegressor 实例的一个属性,返回一个 numpy.ndarray,每个元素对应一个输入特征的重要性得分。这个值不是统计显著性,也不是归一化后的概率,而是基于「平均不纯度减少量」(mean decrease in impurity, MDI)计算出来的相对贡献度:树在某个特征上做分裂时,加权后的基尼不纯度(分类)或均方误差(回归)下降越多,该特征得分越高。
注意它不反映特征对预测结果的实际影响方向(正/负),也不处理特征间相关性——如果两个高度相关的特征同时存在,它们的 feature_importances_ 可能都被稀释,总和却接近 1。
直接调用 feature_importances_ 的常见错误
最常踩的坑是:模型没 fit 就访问 feature_importances_,会报 AttributeError: 'RandomForestClassifier' object has no attribute 'feature_importances_';或者用了 fit_transform()(比如 Pipeline 中套了 StandardScaler),但忘记确认最终 estimator 是否真的被训练过。
- 必须确保调用前已执行
rf.fit(X_train, y_train) - 如果用
sklearn.pipeline.Pipeline,得从pipeline.named_steps['randomforest'].feature_importances_获取,不能直接写pipeline.feature_importances_ - 传入
fit()的X_train必须是二维数组(shape = (n_samples, n_features)),一维或 Series 会触发ValueError: Expected 2D array, got 1D array instead - 使用
oob_score=True并不会改变feature_importances_的计算逻辑,它仍基于所有树的分裂增益,不是 OOB 样本上的表现变化
怎么让重要性更可信:Permutation Importance 补充验证
feature_importances_ 容易高估冗余特征、低估类别不平衡下的少数类相关特征。更稳健的做法是用 sklearn.inspection.permutation_importance 做后验验证——它通过随机打乱单个特征列,观察模型性能(如 accuracy、r2_score)下降多少来衡量重要性。
立即学习“Python免费学习笔记(深入)”;
示例关键步骤:
from sklearn.inspection import permutation_importance perm_imp = permutation_importance(rf, X_val, y_val, n_repeats=5, random_state=42, scoring='accuracy') # perm_imp.importances_mean 是每个特征的平均下降值,可直接排序对比
注意:permutation_importance 计算成本高(要重跑模型预测多次),只建议在验证集或小样本上运行;它依赖评估指标选择,scoring 必须与任务一致(分类用 'f1' 或 'roc_auc',别默认用 'accuracy' 在极度不平衡时)。
可视化与特征筛选的实操要点
画重要性图本身很简单,但容易忽略坐标轴含义和筛选边界。不要只看 top-5,要结合标准差(feature_importances_.std())判断稳定性;对低重要性但业务强相关的特征,别直接丢弃。
- 用
pd.Series(rf.feature_importances_, index=feature_names).sort_values(ascending=False)快速排序并带名输出 - 绘图时建议用
seaborn.barplot或matplotlib.pyplot.barh,横轴设为重要性值,纵轴为特征名,避免堆叠或 3D 效果干扰判断 - 若要做自动筛选,别硬设阈值如
> 0.01;可用np.percentile(rf.feature_importances_, 75)取上四分位数作为动态基准 - 多棵树下
feature_importances_方差大?说明数据噪声高或树数量不足,可尝试增大n_estimators=200再试
真正难的不是取出来,而是解释为什么某个特征排第 3 却业务上最关键——这时候得回头检查数据泄露、目标编码污染、或特征工程是否掩盖了原始信号。


















