使用feature_importances_时需注意:其为归一化相对重要性,对数据分布敏感且高度相关特征会平分得分;应先做相关性分析、及时获取、用argsort排序;selectfrommodel需显式设threshold;线性模型应标准化后取abs(coef_);删特征后须在同一验证集上对比性能。

用 feature_importances_ 提取树模型的特征重要性时要注意什么
树模型(如 RandomForestClassifier、XGBClassifier)自带 feature_importances_ 属性,但它返回的是归一化后的相对重要性,总和为 1。直接按数值排序没问题,但容易忽略两点:一是该值对特征缩放不敏感,但对训练数据分布敏感;二是当存在高度相关的特征时,重要性会被“平分”,导致单个特征得分偏低,误判为冗余。
实操建议:
- 先做相关性分析(如
df.corr().abs()),把abs(correlation) > 0.95的特征对列出来,手动保留业务解释性更强的那个 - 调用
model.fit(X, y)后立刻获取model.feature_importances_,不要在 pipeline 中嵌套后才取——否则可能取到未拟合模型的默认零值 - 用
np.argsort(importances)[::-1]获取降序索引,避免用sort_values(ascending=False)搞混原始列名顺序
用 SelectFromModel 自动剔除低重要性特征的坑
SelectFromModel 看似一键过滤,但默认阈值是 'median',不是 0 或均值。对稀疏重要性分布(比如前 3 个特征占了 90% 分数),它可能只删掉 1 个特征,远达不到“剔除冗余”的目的。
实操建议:
- 显式设
threshold,例如SelectFromModel(model, threshold=0.01),比依赖中位数更可控 - 慎用
prefit=True:如果 model 没调用过fit(),会报AttributeError: 'XXX' object has no attribute 'feature_importances_' - 执行
selector.transform(X)后,务必用selector.get_support()检查哪些列被保留,别假设输出顺序和输入一致
线性模型下不能用 feature_importances_,该换什么指标
逻辑回归、Lasso 等线性模型没有 feature_importances_ 属性。强行用系数绝对值排序虽常见,但未经标准化的 coef_ 会因特征量纲差异产生误导——比如身高(单位 m)和收入(单位 元)系数不可比。
实操建议:
- 必须先 StandardScaler 或 MinMaxScaler,再训练模型,然后取
np.abs(model.coef_[0])排序 - Lasso 的
alpha要调:太小 → 系数全非零;太大 → 过多特征被置零,丢失信息。可用LassoCV自动选alpha - 别忽略截距项——
coef_是数组,intercept_是标量,混淆会导致索引错位
剔除后验证模型性能是否真有提升
单纯看重要性排序删特征,可能让验证集 AUC 下降 0.02,却误以为“更简洁”。关键是要对比删前后在**同一份验证集**上的指标变化,而不是重训重测。
实操建议:
- 用
train_test_split(..., stratify=y)固定划分,确保删特征前后的评估基线一致 - 记录原始特征数、剩余特征数、CV 得分(如
cross_val_score(model, X_selected, y, cv=5, scoring='f1'))三者,缺一不可 - 如果删掉某特征后测试集 recall 突然下降 10%,哪怕它重要性排倒数第二,也得保留——重要性不等于业务敏感度
真正难的不是排序或删除,而是判断“冗余”是否成立:它取决于任务目标、数据分布、下游系统约束,不是单靠一个数字能决定的。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











