模型的整体分数不错,却不知道它依赖什么输入,可以用置换重要性做一次检查:保留真实标签,把某一列随机打乱,再看模型评分下降多少。下降越大,说明这个模型在这批样本上越依赖这列。
先检查模型,再解释特征
scikit-learn 官方指南强调,先验证模型具有预测能力,再解释重要性;坏模型给某列低重要性,不表示那列对所有好模型也无用。建议在未参与训练的数据上计算,避免把过拟合当有效依赖。

本文使用五列合成分类数据,前两列被生成器设为有用信号,后三列为噪声,没有真实个人信息。这种设定便于检查代码,不意味着真实数据中可以提前知道哪些特征有用。
准备独立 Python 环境
本文使用 Python 3.13。下面命令适用于 Windows PowerShell,在新建练习目录运行;其他系统用对应的 Python 路径。先用 python –version 确认版本,再创建环境。
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install "scikit-learn==1.9.1" "numpy==2.5.3" "pandas==3.0.6"
以下代码和数据只用于教学。本站于 2026-10-01 在 Windows、Python 3.13.14、scikit-learn 1.9.1、NumPy 2.5.3、pandas 3.0.6 环境运行了本文脚本;这只验证示例能执行和断言通过,不代表真实业务效果。
完整代码:在验证集上打乱特征
保存为 importance_demo.py,再运行 .\.venv\Scripts\python.exe importance_demo.py。本例先输出验证集 balanced accuracy,再输出各列的 mean_drop 与 std_drop。每次只打乱一列,重复 15 次,再计算评分下降的平均值和标准差。
import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.inspection import permutation_importance
from sklearn.metrics import balanced_accuracy_score
X, y = make_classification(n_samples=800, n_features=5,
n_informative=2, n_redundant=0,
n_repeated=0, shuffle=False,
class_sep=1.5, random_state=42)
names = ["signal_a", "signal_b", "noise_a", "noise_b", "noise_c"]
X = pd.DataFrame(X, columns=names)
X_train, X_valid, y_train, y_valid = train_test_split(
X, y, test_size=0.3, stratify=y, random_state=42)
model = RandomForestClassifier(n_estimators=120, max_depth=6,
random_state=42, n_jobs=1).fit(X_train, y_train)
score = balanced_accuracy_score(y_valid, model.predict(X_valid))
result = permutation_importance(model, X_valid, y_valid,
scoring="balanced_accuracy", n_repeats=15,
random_state=42, n_jobs=1)
table = pd.DataFrame({"feature": names, "mean_drop": result.importances_mean,
"std_drop": result.importances_std})
table = table.sort_values("mean_drop", ascending=False)
print("validation_balanced_accuracy", round(score, 4))
print(table.round(4).to_string(index=False))
table.to_csv("feature_importance.csv", index=False, encoding="utf-8-sig")
assert len(table) == 5 and np.isfinite(result.importances_mean).all()
assert table.iloc[0]["feature"] in {"signal_a", "signal_b"}
核对与解释结果
validation_balanced_accuracy 0.9875
feature mean_drop std_drop
signal_b 0.4900 0.0289
noise_b 0.0000 0.0000
signal_a -0.0003 0.0024
noise_a -0.0006 0.0014
noise_c -0.0011 0.0018
输出表应有 5 行,mean_drop 是原始验证分数减去打乱该列后的分数。这是评分差,而不是贡献百分比;各列之和无须等于 1。std_drop 反映这些重复置换的波动,不是模型解释准确度。
这是本文合成数据的本地运行输出。先检查 validation_balanced_accuracy 是否优于随机或简单基线,再看排名。重要性接近零且波动覆盖零时,不宜硬分高低;负值表示本次打乱后分数反而略升,可能来自抽样波动、冗余或模型依赖有害信号,不能自动当“反向因果”。
应用到自己的模型时怎么做
保留验证集列名、顺序和训练时的预处理。如果模型是 Pipeline,向 permutation_importance 传完整 Pipeline 和未经重复变换的验证输入,让预处理随模型一同执行。选择与目标一致的 scoring:业务关注不均衡类别时,不应只为获得好看数字改成普通准确率。
把 feature_importance.csv 与业务规则对照。若事后信息列、结果编号或身份标识排名很高,先排查数据泄漏。确定要删列时,重新训练并用另一份独立数据比较性能;不能只凭一张重要性表直接改线上特征。
相关特征与解释边界
置换重要性解释的是当前模型在当前数据上的依赖,不是变量的因果作用。两个高度相关特征互相替代时,只打乱其中一列可能得到很低下降,却不表示这组信息无用。
官方指南给出了相关特征导致误导的例子。可以先检查相关性、按组分析或保留代表特征再重新训练;无论采用哪一种方法,都要重新评估预测质量。若样本太少或分布已变化,重要性也会随之变化,应记录数据时间和模型版本。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30159.html