# Prompt 06：Python 迁移

## 背景

这是流程的第六阶段：把 R 端已锁定并评价过的流程迁移到 Python 复现。迁移的核心不是"用相同种子尽量复现"，而是 **Python 直接读取 R 导出的成员清单与特征契约**——成员、折、结局编码、预处理与模型类型全部来自 R 的产物，Python 只换实现。对应 Book 3 第 6 章，参考实现见 `Demo_R_Project/python/01_contract_migration_demo.py`（契约导出见 `Demo_R_Project/R/06_export_python_bridge.R`）。

## 数据说明

- R 导出的建模数据：`<R导出数据路径>`（原始尺度，缺失保持 NA，含行 ID 与结局）；
- 成员清单：`results/tables/split_manifest.csv` 与 `results/tables/fold_manifest.csv`（由 R 端唯一生成）；
- 特征契约：`<特征契约路径>`（结局与正类、各预测变量类型、因子水平与参照、缺失处理、标准化方式）；
- 锁定配置：`<锁定配置路径>`（模型类型、超参数、阈值）；
- 行 ID 变量：`<行ID变量>`。

## 当前任务

在 Python 端按契约重建同类型模型：严格按成员清单取训练/测试成员，预处理置于 Pipeline 内，对测试成员预测一次，输出带行 ID 的预测与指标，并如实记录与 R 端的实现差异。

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

## 方法

1. 读取 R 导出数据与 split/fold 成员清单，断言：训练/测试成员无交叠、fold 恰好划分训练集、行数与清单一致；
2. **禁止** `train_test_split`、禁止重建 fold、禁止基于种子的重新抽样；成员严格来自清单；
3. 按特征契约搭建 Pipeline：数值变量按契约插补与标准化，因子变量按契约插补并做参照编码（水平与参照来自契约）；预处理全部在 Pipeline 内完成；
4. 按锁定配置的 `model_type` 训练同类型模型，超参数按契约映射；不另行调参；
5. 仅对测试成员预测一次，用锁定阈值（来自 R）计算 AUC、Brier、Sensitivity/Specificity/Accuracy 与混淆矩阵；
6. 记录实现差异：求解器、惩罚细节、编码列顺序、CI 口径等，写入运行记录；不为追求与 R 完全一致的 AUC 反复修改参数。

## 输出

- `results/tables/python_test_predictions.csv`（或约定目录）：带行 ID 的测试预测；
- `results/tables/python_test_metrics.csv`：Python 端测试指标；
- 运行记录（Markdown 片段）：数据与成员断言结果、Pipeline 构成、模型与超参数映射、测试指标、与 R 的实现差异清单；
- 日志：环境版本、读取的输入文件清单、断言结果。

## 约束

- 必须保持一致：行 ID、结局与正类编码、训练/测试成员、fold 成员、特征契约、指标定义、锁定阈值；
- 允许实现不同：API、求解器、对象结构、包、图形样式；
- Python 端不重新划分、不重新抽样、不独立调参、不重新选阈值；
- 预测只针对测试成员做一次；不为对齐 R 的 AUC 而修改任何参数；
- 全程使用仓库内相对路径。

## 验收

- 断言记录完整：成员无交叠、fold 恰好划分训练集、训练/测试行数与 R 端一致；
- 预处理确实位于 Pipeline 内（无 Pipeline 外手工变换）；
- 预测文件带行 ID 且与测试成员一一对应；
- 指标文件完整，阈值取自 R 端锁定值；
- 运行记录明确列出实现差异，且无"为对齐 AUC 调参"的痕迹。

## 暂停条件

出现以下任一情况，停止并报告，等待人工决定：契约文件缺失或字段不完整；成员清单与数据行 ID 对不上；锁定配置中的模型类型在 Python 端无合理对应；因子水平与契约不一致（出现契约外水平）；必须改变方法才能继续。
