PermutationImportance-置换重要度
PermutationImportance-置换重要度 的真实核心主要位于:
PermutationImportance-置换重要度
1. 方法概述
PermutationImportance-置换重要度 的真实核心主要位于:
core/calculator.pyui/upload_widget.pyui/results_widget.pyui/results_preview_widget.py
从代码实现看,这个模块并不是读取树模型自带的 feature_importances_,而是直接调用 sklearn 的:
sklearn.inspection.permutation_importance
它的基本流程是:
- 训练一个监督模型;
- 在测试集上计算基准评分;
- 逐个打乱单列特征;
- 观察评分下降或误差上升的幅度;
- 对多次重复结果求均值和标准差。
设测试集评分函数为 \(S(\cdot)\),第 \(j\) 个特征的置换重要度本质上来自
$$ I_j^{(r)} = S(f, X_{\text{test}}, y_{\text{test}}) - S\big(f, \pi_j^{(r)}(X_{\text{test}}), y_{\text{test}}\big) \tag{1} $$
其中 \(\pi_j^{(r)}\) 表示第 \(r\) 次对第 \(j\) 列做随机打乱。
2. 数据约束与模型结构
2.1 特征与目标列约束
代码要求:
- 数据非空;
- 必须显式选择目标列;
- 至少选择 1 个特征列;
- 所有特征列都必须能转成数值;
- 特征列不能有缺失值、
inf、-inf; - 回归目标列必须能转成数值;
- 分类目标列至少有 2 个类别。
设选中后的特征矩阵为
$$ X=\mathcal{D}[S] \tag{2} $$
这套实现不会做缺失值填补,也不会对类别特征做 One-Hot 编码。上传页里“仅数值列可选”只是 UI 约束,底层 _prepare_data() 也再次把特征列强制转成数值并检查合法性。
2.2 分类目标会被编码
分类任务中,代码对目标列做 LabelEncoder:
$$ y^{(\text{enc})}=\mathrm{LabelEncode}(y) \tag{3} $$
但在预测结果表里,若编码器存在,y_true 和 y_pred 又会被逆变换回原始标签文本。
2.3 训练 / 测试划分
模型训练前执行:
$$ \mathcal{D}_{\text{train}}\cup\mathcal{D}_{\text{test}}=\mathcal{D} \tag{4} $$
其中:
test_size取值建议在0.05到0.5之间;- 分类任务使用
stratify=y; - 回归任务不分层。
2.4 支持的模型族
代码支持 5 类 estimator:
random_forestgboostsvmknnlinear
其中 linear 在不同任务下对应:
$$ \text{linear}= \begin{cases} \text{LogisticRegression}, & \text{classification}\\ \text{Ridge}, & \text{regression} \end{cases} \tag{5} $$
2.5 可选标准化管道
若 normalize=True,模型会被包进
$$ \mathcal{P}(x)=\text{model}\big(\mathrm{StandardScaler}(x)\big) \tag{6} $$
否则只使用 model 步骤本身。
所以这里的置换重要度评估对象是“整个 pipeline”,而不是单独某个模型裸输入下的重要度。
3. 评分口径与重要度定义
3.1 可选评分函数
界面允许选择:
- 分类任务:
accuracyf1_macrof1_weightedroc_auc_ovr
- 回归任务:
neg_root_mean_squared_errorneg_mean_absolute_errorr2
因此置换重要度并不是固定针对准确率或 \(R^2\),而是针对用户选定的 scoring。
3.2 基准评分
代码在测试集上用 get_scorer() 先计算一个基准分数:
$$ S_0 = S(f, X_{\text{test}}, y_{\text{test}}) \tag{7} $$
若评分函数以 neg_ 开头,结果页里会把它翻转成正值展示:
$$ S_0^{(\text{display})}= \begin{cases} -S_0, & \text{若 scoring 以 } \texttt{neg\_} \text{ 开头}\\ S_0, & \text{否则} \end{cases} \tag{8} $$
这就是导出参数里的 baseline_score。
3.3 重复置换后的均值与标准差
对每个特征 \(j\),permutation_importance() 会做 n_repeats 次重复,并输出:
$$ \bar I_j=\frac{1}{R}\sum_{r=1}^{R} I_j^{(r)} \tag{9} $$
$$ \sigma_j=\sqrt{\frac{1}{R}\sum_{r=1}^{R}\big(I_j^{(r)}-\bar I_j\big)^2} \tag{10} $$
在导出表里对应:
重要度均值重要度标准差
3.4 负号评分下的重要度解释
一个很容易误写的细节是:对于 neg_root_mean_squared_error、neg_mean_absolute_error 这类负号评分,代码只对 baseline_score 做了翻转显示,而 importance_df["重要度均值"] 保持 permutation_importance() 的原始结果。
由于置换重要度本身是“基准分减置换后分”,所以在负误差评分下:
$$ \bar I_j \approx \text{误差增加量} \tag{11} $$
例如在 neg_root_mean_squared_error 下,正的重要度均值可以理解为“打乱该特征后 RMSE 平均增加了多少”。
4. 测试集指标与结果结构
4.1 分类指标
分类任务在测试集上统一输出:
$$ \mathrm{Accuracy}=\frac{1}{n}\sum_{i=1}^{n}\mathbf{1}(\hat y_i=y_i) \tag{12} $$
并附带:
precision_macrorecall_macrof1_macrof1_weighted
要注意:即使用户选择的置换评分是 roc_auc_ovr,测试集指标表里也不会额外再计算 roc_auc_ovr。
4.2 回归指标
回归任务输出:
$$ \mathrm{RMSE}=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat y_i)^2} \tag{13} $$
$$ \mathrm{MAE}=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat y_i| \tag{14} $$
$$ R^2=1-\frac{\sum_i(y_i-\hat y_i)^2}{\sum_i(y_i-\bar y)^2} \tag{15} $$
预测结果表还会附带:
residual = y_true - y_pred
4.3 processed_data 的真实含义
结果字典里的 processed_data 只是:
- 被选中的原始特征列
- 再加上目标列
它不是标准化后的矩阵,也不是训练 / 测试拆分之后的数据视图。
5. 输出结果、图表与导出
5.1 图表
当前只生成一张条形图:
plots/permutation_importance_top20.png
其内容是前 20 个特征的 重要度均值 水平条形图。
5.2 Excel 工作表
_export_excel() 实际输出:
ParametersRawDataProcessedDataImportanceMetricsPredictionsCharts
其中:
Importance保存特征名、均值、标准差和排名;Charts保存图表名称与路径;Parameters会包含baseline_score。
5.3 结果复制与图表重定向
结果页的“另存为”不是只复制 xlsx 文件,而是会:
- 复制工作簿;
- 复制图表文件到新的
<文件名>_plots/目录; - 用新的图片路径重写
Charts工作表。
这意味着导出的附件包是“工作簿 + 图表资源”一起迁移的。
5.4 输出路径与复现脚本
若未自定义路径,UI 默认输出到:
results/permutation_importance_时间戳/permutation_importance_results.xlsx
结果页还会自动写出:
repro_permutation_importance.py
供后续在相同目录下复跑。
6. 实现说明与注意事项
根据当前真实代码,论文说明中应明确以下边界:
- 这不是树模型自带
feature_importances_,而是测试集上的置换重要度。 - 重要度取决于用户选择的
scoring,并不是“统一的特征贡献分数”。 - 对负号误差评分,
baseline_score会翻正展示,而重要度均值的数值应理解为误差增加量。 - 目录里虽然存在
feature_engineering_panel.py,但主窗口实际走的是UploadWidget + ResultsWidget流程,该面板没有接入当前主分析链路。 - 预测指标表与置换评分不是一回事;例如选择
roc_auc_ovr做置换时,测试集指标表仍主要显示accuracy/F1。
7. 论文写作建议
7.1 方法描述模板
论文正文可写为:本文采用基于测试集特征置换的模型后验解释方法,对各特征进行逐列打乱,并以模型预测性能的下降幅度衡量特征的重要程度。该方法不依赖模型内部结构,属于模型无关的解释分析框架。
7.2 结果解释模板
结果部分可写为:置换重要度均值越大,说明对应特征被打乱后模型性能下降越明显,因此其预测贡献越高;若重要度均值接近 0 或为负,则说明该特征对模型稳定预测帮助有限,甚至可能引入噪声。若采用误差型评分函数,正文中应明确“正的重要度”表示误差平均增加,而不是分数平均上升。
7.3 图表题注模板
- 表题可写为:测试集特征置换重要度均值与标准差结果。
- 图注可写为:特征置换重要度条形图。
- 表题可写为:基准模型测试集性能与置换重要度对照表。
8. 单篇终审补充
8.1 图题与表题对齐建议
Parameters表可写为:表X 置换重要度分析参数设置与评分口径。RawData表可写为:表X 原始输入数据预览。ProcessedData表可写为:表X 置换重要度分析所用处理后数据。Importance表可写为:表X 特征置换重要度均值、标准差与排名结果。Metrics表可写为:表X 基准模型测试集性能指标汇总。Predictions表可写为:表X 测试集真实值与预测值对照。Charts表可写为:表X 图表索引与文件路径清单。Charts中的permutation_importance_top20建议写为:图X 前 20 个特征的置换重要度条形图。
8.2 终审说明
- 当前结果目录的真实主文件为
permutation_importance_results.xlsx,复现输出通常为permutation_importance_repro.xlsx,论文附录若列文件名,应按这组真实名称写,不要泛写成其他算法模板名。 - 真实图文件只有
permutation_importance_top20.png一张,因此结果部分应聚焦“全局特征重要度排序”,不能虚构局部解释图、混淆矩阵图或多图联合面板。 Charts工作表承载的是图名与路径,不是图像嵌入本体;论文里若写“见图X”,应对应结果目录中的实体 png 文件,而不是把Charts表误写成图像页。ProcessedData是经过当前上传页清洗、编码后保留下来的分析数据快照,不等于模型内部所有中间矩阵。正文若说明数据处理过程,应以“用于置换分析的处理后数据表”表述为宜。repro_permutation_importance.py使用INPUT_FILE = 'repro_inputs/permutation_importance_baseline_input.csv'这一路径口径,文档或附录中若展示复现实验命令,应明确其依赖相对路径repro_inputs/...,而不是原始绝对路径。
8.3 全量强化补充
- 本轮按真实磁盘再次核对,算法目录为
具体的算法3/可解释与AutoML/PermutationImportance-置换重要度,代表性结果目录为具体的算法3/可解释与AutoML/PermutationImportance-置换重要度/results/permutation_importance_20260329_170705。 - 该目录实际包含两份工作簿:主运行结果
permutation_importance_results.xlsx与复现输出permutation_importance_repro.xlsx。两份工作簿的真实工作表一致,均为Parameters、RawData、ProcessedData、Importance、Metrics、Predictions、Charts。 - 当前图文件位于
plots/permutation_importance_top20.png,没有单独的局部解释图、PDP 图、SHAP 图或混淆矩阵图。因此这篇在论文中只能把该图解释为“全局置换重要度 Top 20 条形图”。 - 当前输入副本位于
repro_inputs/permutation_importance_baseline_input.csv,repro_permutation_importance.py中明确写有INPUT_FILE = 'repro_inputs/permutation_importance_baseline_input.csv'。这属于标准repro_inputs/...复现结构。 - 需要区分
Importance和Metrics:前者记录置换后性能下降对应的特征重要度,后者记录基准模型指标。论文中不能把baseline_score、测试集指标和置换重要度均值写成同一个指标。 - 当前目录代表的是上传数据后的可解释性分析结果,不是 AutoML 调参结果;若论文另有模型训练过程,应在实验部分单独交代基模型来源。
9. 软件实现核查补充(2026-07)
- 当前主结果目录应写作
具体的算法3/可解释与AutoML/PermutationImportance-置换重要度/results/permutation_importance_20260329_170705。 - 正文应围绕
Parameters、RawData、ProcessedData、Importance、Metrics、Predictions、Charts来写。 - 图证应对应
permutation_importance_top20.png,并把全局置换重要度和基准性能区分开。 - 复现脚本应按
repro_permutation_importance.py + repro_inputs/permutation_importance_baseline_input.csv的口径说明。