训练后直接访问feature_importances_属性即可获取归一化特征重要性,其值和为1.0、长度等于特征数,需确保已调用fit()且结合原始列名排序解读。

用 feature_importances_ 画柱状图最直接
树模型(如 RandomForestClassifier、XGBClassifier)训练完后,直接取 feature_importances_ 属性就能拿到数值,这是最常用也最稳妥的来源。注意它返回的是 NumPy 数组,顺序严格对应 feature_names_in_(如果用了 fit 且输入是 DataFrame)或你传入的列顺序。
实操建议:
- 务必先检查
model.feature_names_in_是否存在,不存在就用range(len(model.feature_importances_))当标签,但容易搞混特征含义 - 别直接对原始数组排序后画图——要同步重排特征名,否则标签和数值错位
- 用
plt.barh()比plt.bar()更易读,尤其特征多时 - 加
xlim=(0, max_importance * 1.05)避免数值贴边
用 permutation_importance 更可靠但更慢
permutation_importance 不依赖模型内部机制,而是通过打乱单个特征后看评估指标下降多少来衡量重要性,结果通常比 feature_importances_ 更符合实际预测逻辑,尤其对线性模型或存在强相关特征时。
常见错误现象:
立即学习“Python免费学习笔记(深入)”;
- 忘记传
scoring参数,默认用模型的score()方法,可能和你的业务指标不一致(比如分类默认是 accuracy,但你关心 f1) - 没设
n_repeats,默认只打乱一次,方差大;建议至少n_repeats=5 - 传入的
X和y必须和训练时完全同分布,不能是 scaled 后没 inverse 的数据
示例关键行:
from sklearn.inspection import permutation_importance<br>perm_imp = permutation_importance(model, X_val, y_val, n_repeats=5, scoring='f1_weighted')
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
用 SHAP 解释单样本预测但别滥用全局排序
SHAP 值能给出每个样本每个特征的贡献值,适合调试异常预测或向业务方解释“为什么这个用户被拒贷”。但很多人误把所有样本的 |SHAP| 均值当全局重要性——这在特征量纲差异大、稀疏性高时会严重失真。
使用场景限制:
- 树模型优先用
TreeExplainer,比KernelExplainer快几个数量级且精确 - 计算前必须调用
explainer(X_train[:100])预先拟合,否则explainer(X_test)会极慢 - 画全局图推荐
shap.summary_plot(shap_values, X, plot_type="bar"),别用点图(dot plot)当重要性排序 - 如果
X是 DataFrame,确保列名没空格或特殊字符,否则 SHAP 会静默失败
中文标签、负值、长名导致图表难读怎么办
真实项目里常遇到特征名是中文、带下划线、甚至超长(如 user_last_7d_avg_purchase_amount_log1p),直接塞进图表会重叠或截断。
解决办法很具体:
- 用
plt.yticks(fontsize=8)缩小字号,配合plt.tight_layout() - 长名做截断:
[n[:15] + '...' if len(n) > 15 else n for n in feature_names] - 中文显示需提前设置字体:
plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'] - 如果有负重要性(如某些线性模型系数),柱状图仍可画,但得用
plt.barh()+color=['red' if x
真正麻烦的是不同模型输出的重要性无法直接比较——RandomForest 的 0.12 和 LogisticRegression 的 0.12 含义完全不同。别拼在一起排榜,更别拿它们做特征筛选的唯一依据。

















