# Prompt 05：机器学习比较与最终测试

## 背景

这是流程的第五阶段：在同一 outer fold 骨架内比较多个模型（Logistic 回归、随机森林 RF、XGBoost、支持向量机 SVM），基于折外（OOF）表现选定模型，**先完整锁定、再对冻结的 Holdout Test 做唯一一次评价**。对应 Book 3 第 5 章，参考实现见 `Demo_R_Project/R/05_ml_compare_final_test.R`。

## 数据说明

- 输入：清理后的分析队列、`results/tables/split_manifest.csv`、`results/tables/fold_manifest.csv`；
- 结局变量：`<结局变量>`；正类：`<正类>`；
- 候选预测变量：`<候选变量清单>`；
- outer 折数：`<折数>`；调参内层折数：`<内层折数>`；种子：`<种子>`；调参网格：`<调参网格>`；
- 阈值规则：`<阈值规则>`（来源为锁定模型在训练集上的 OOF 预测）。

## 当前任务

同成员、同折、同评价规则地比较各模型；记录选模理由；在接触测试集之前落盘全部锁定产物；然后对 Holdout Test 评价一次并结束，不返回选优。

先检查输入并给出简要计划，然后继续执行指定任务；不要在计划后等待用户再次确认。只有输入冲突、字典冲突、必须改变方法或命中暂停条件时停止。

## 方法

1. 比较公平性：所有模型使用相同训练成员与相同 outer folds；每折内重新学习预处理、重新做 LASSO；同一折内所有模型共享该折筛出的原始变量集合；
2. 调参与 outer 评价分离：超参数只在折内训练部分用内层 `<内层折数>` 折交叉验证选择，网格限于 `<调参网格>`；
3. 用各模型的 OOF 预测计算 AUC（含 CI 与方法）与 Brier，并列表比较；
4. 选模：综合 OOF 表现与可解释性/简洁性，写明选择理由；如需模型解释（如 SHAP），注明模型、解释样本、背景/参考数据与输出尺度；
5. **锁定（先于任何测试集访问）**：落盘选模记录、锁定配置（模型类型、变量、预处理、超参数、阈值及其规则与来源、选择理由）与模型文件；锁定阈值按 `<阈值规则>` 从训练集 OOF 预测计算；
6. 锁定完成后，用锁定产物对 Holdout Test 预测一次，计算 AUC（含 CI 与方法）、Brier、校准、阈值下的 Sensitivity/Specificity/Accuracy 与混淆矩阵；
7. 测试评价完成后流程终止：不得返回重新选优、调参或调阈值。

## 输出

- `results/tables/ml_cv_comparison.csv`：各模型 OOF 指标比较；
- `results/models/model_selection_record.csv`：选模记录（含理由）；
- `results/models/locked_model_config.csv`：锁定配置；
- `results/models/locked_model.rds`（或等价模型文件）；
- `results/tables/final_test_predictions.csv`：带行 ID 的测试集预测；
- `results/tables/final_test_metrics.csv`：测试集指标；
- `results/figures/` 下的模型比较图、SHAP 图（如做）、测试 ROC/校准/DCA 图；
- 日志：能证明锁定产物先于测试集访问落盘的顺序记录。

## 约束

- 三个锁定产物必须先于任何测试集读取落盘，日志中顺序可查证；
- 测试集不参与：筛选、预处理学习、调参、阈值选择；仅评价一次；
- 测试后不得返回选优；对结果不满意只能记录局限，不能换模型重测；
- 全部模型共用成员、fold 与评价规则；不得为某个模型单独改变预处理或变量；
- 测试结果明确标记为"Holdout Test"，不与内部验证混淆，不称外部验证；
- 全程使用仓库内相对路径。

## 验收

- 比较表覆盖全部约定模型，均有 OOF AUC（含 CI 与方法）与 Brier；
- 选模记录写明选择模型、变量、预处理、超参数、阈值与理由；
- 日志可验证：三个锁定产物的时间/顺序先于测试集预测；
- `final_test_metrics.csv` 完整（AUC 含 CI、Brier、校准、阈值下三类指标与混淆矩阵）；
- 测试集预测带行 ID 且行数与测试集一致；
- 无任何"测试后重选"的痕迹（产物与日志各一份、无重复版本）。

## 暂停条件

出现以下任一情况，停止并报告，等待人工决定：任一模型训练失败；某折结局类别不完整或折内流程失败；锁定产物未落盘即需要访问测试集；阈值规则无法产生有效阈值；测试指标出现非有限值；成员清单与既有 manifest 不一致。
