feature_importances_不能直接当“重要性排序”用,因其基于树内不纯度下降的局部统计,受量纲、相关性干扰,易失真;应结合permutation_importance等全局方法验证。

为什么 feature_importances_ 不能直接当“重要性排序”用?
随机森林自带的 feature_importances_ 是基于不纯度下降(Gini 或 entropy)的平均减少量,它反映的是模型内部分裂时的局部贡献,不是全局可解释的“影响大小”。尤其在特征量纲差异大、存在高度相关特征时,重要性会被稀释或错配——比如两个强相关的数值特征,feature_importances_ 可能各分走一半权重,但单独删掉任一个对模型影响都很小。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 先做标准化或归一化(非必须,但能缓解量纲干扰)
- 用
PermutationImportance(来自eli5)或sklearn.inspection.permutation_importance做二次验证——它衡量的是「打乱某列后模型性能下降多少」,更贴近业务直觉 - 若使用
sklearn.ensemble.RandomForestRegressor或RandomForestClassifier,确保训练时设random_state固定,否则每次运行feature_importances_都会浮动
如何用 permutation_importance 获取稳定排序?
sklearn.inspection.permutation_importance 返回的是带标准差的数组,比单次计算可靠得多。关键点在于:它默认用 scoring 参数决定评估指标(如 "neg_mean_squared_error" 或 "accuracy"),且会自动重复多次(n_repeats 默认为 5)。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 传入验证集(
X_val, y_val)而非训练集,避免过拟合导致的虚假重要性 - 设
n_repeats=10提升稳定性;若耗时高,至少保证 ≥5 - 注意返回结果中
importances_mean是按特征顺序排列的,需手动和列名对齐:import pandas as pd<br>importances = permutation_importance(model, X_val, y_val, n_repeats=10)<br>df_imp = pd.DataFrame({<br> "feature": X_val.columns,<br> "importance": importances.importances_mean,<br> "std": importances.importances_std<br>}).sort_values("importance", ascending=False)
遇到分类变量或高基数特征怎么办?
随机森林本身支持类别型输入(只要转成数值编码),但 feature_importances_ 和 permutation_importance 都无法区分“one-hot 后的多个列是否属于同一原始变量”。比如把 city(100 个取值)做 one-hot 得到 99 列,重要性会被拆散到各虚拟列上,总和才有意义。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 对分类变量优先用
TargetEncoder或LeaveOneOutEncoder(来自category_encoders),避免维度爆炸 - 若必须 one-hot,后续聚合重要性时按原始变量名分组求和:
df_imp["original_feature"] = df_imp["feature"].str.split("_").str[0],再groupby("original_feature").sum() - 警惕高基数特征(如用户 ID)——即使重要性数值高,也大概率是过拟合信号,应从特征工程阶段就剔除或降维
为什么画图时横坐标经常“挤在一起”?
特征数一多(>20),用 plt.barh() 直接画所有重要性,y 轴标签会重叠、看不清。这不是代码错误,而是信息密度问题。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 只画 top-k(如 k=15),用
df_imp.head(15).plot.barh(x="feature", y="importance") - 把重要性归一化到 [0, 1] 区间(除以最大值),方便跨模型比较
- 若需保留误差线,用
plt.errorbar替代 barh,并设置fmt="o"避免柱子遮挡
permutation_importance 和 feature_importances_ 排序冲突时,得回溯原始业务逻辑——比如某个时间戳特征重要性极高,先查它是否无意中包含了目标变量的信息。


















