# 机器学习个人课程作业需求分析与实现方案

## 1. 文档目的

本文档基于以下材料整理：

- `外教课/原文要求.txt`
- `外教课/课程作业实现方案分析.md`
- `外教课/课程作业整合及任务拆解与时间规划清单.md`
- `资料/DTS304TC_Assessment1_(word)_2026(1).pdf`
- `资料/dataset_final(1).zip` 中的数据文件结构

目标是输出一份面向实际执行的详细需求分析和实现方案，用于指导 `Jupyter Notebook + Theory and Reflection PDF + hidden-test CSV + 补充代码` 的完整完成过程。

---

## 2. 原始任务核心要求

### 2.1 作业目标

需要围绕一个虚构但接近真实场景的健康保险数据集，建立并改进一个多分类模型，用于预测申请人的保费风险等级：

- `Low`
- `Standard`
- `High`

该任务不是单纯追求 leaderboard 排名，而是要求展示完整、规范、可复现的机器学习工作流，包括：

- 数据清理与预处理
- 数据泄露特征识别与删除
- 基线模型建立
- `Random Forest` 与一种 `Boosting` 模型的公平对比
- 至少一个主模型的高级超参数优化
- 按学号末位完成一个必做改进类别，并额外完成至少一个可选改进类别
- `K-Means` 与 `GMM` 的无监督探索
- 基于验证集证据选择最终模型
- 生成规定格式的 hidden-test 预测结果 CSV

### 2.2 提交物

必须提交以下文件：

- 一个 `Jupyter Notebook`，格式为 `.ipynb`
- 一个 `Coursework Answer Sheet / Theory and Reflection PDF`
- 一个 hidden-test 预测结果 `CSV`
- 如使用 notebook 外部的辅助脚本，也必须一并提交

### 2.3 成绩结构

根据 PDF 原文，整份作业分值结构如下：

- `Question 1: Notebook-Based Coding Exercise`：`60` 分
- `Theory and Reflection PDF`：`30` 分
- `Coding Quality / Answer Sheet Quality / Submission Guidelines`：`10` 分

这意味着不能只重模型分数，文档质量、实验组织、结果解释和提交格式同样直接影响成绩。

---

## 3. 从原始 PDF 提炼出的硬性约束

以下内容属于正式要求中的关键硬约束，必须优先满足。

### 3.1 评价指标约束

- 主指标是 `macro-F1`
- `accuracy` 只是辅助指标
- 所有重要模型对比、调参结果、改进结果都应同时报告：
  - `macro-F1`
  - `accuracy`

原因是类别不平衡明显，不能只用准确率判断模型优劣。

### 3.2 数据泄露约束

PDF 明确指出：

- 数据中存在 `1` 个泄露特征
- 必须先识别并移除，再进入后续分析
- 如果没有删除，后续多个部分都会被视为无效或严重失真

这说明“找出泄露特征”不是建议项，而是作业关键检查点。

### 3.3 模型比较约束

Notebook 中必须完成：

- 一个 baseline pipeline
- 一个 `Random Forest`
- 一个 `Boosting` 模型

并且需要满足“受控比较”原则：

- 使用同一套预处理流程
- 使用同一份训练/验证划分
- 使用同一评价指标

否则比较结论不成立。

### 3.4 高级调参约束

至少一个主模型需要使用真正的高级调参方法，例如：

- `Optuna/TPE`
- 贝叶斯优化
- `Hyperopt`
- `Ray Tune`

PDF 明确说明：

- 单独使用 `RandomizedSearchCV` 通常不足以进入高分档

因此建议主方案使用 `Optuna`。

### 3.5 个性化改进约束

必须完成：

- 根据学号末位对应的 `1` 个必做类别
- 额外至少 `1` 个自选类别

推荐但非强制：

- 再额外完成第 `2` 个可选类别，以增强区分度

### 3.6 无监督探索约束

必须完成紧凑版的：

- `K-Means`
- `Gaussian Mixture Model (GMM)`

重点不是聚类分数超过监督学习模型，而是体现：

- 对无监督方法机制的理解
- 对结果的谨慎解释
- 对 `hard assignment` 和 `soft assignment` 区别的认识

### 3.7 hidden-test 导出约束

最终 CSV 必须：

- 文件名为 `test_result_[your_student_id].csv`
- 第一列必须是 `applicant_id`
- 第二列必须是 `customer_key`
- 第三列必须是 `premium_risk`
- 预测标签只能使用：
  - `Standard`
  - `High`
  - `Low`

PDF 明确说明：

- 命名或格式错误会在该部分自动扣 `4` 分
- 不允许在 hidden test 上调参
- 不允许声称 hidden test 性能

### 3.8 PDF 写作约束

`Theory and Reflection PDF` 必须：

- 不超过 `4` 页
- 不超过 `1200` 词
- 不得简单重复 notebook 内容
- 每一个理论问题都必须引用 notebook 中至少一个表、图或指标

超过页数或字数限制会固定扣 `5` 分。

### 3.9 AI 使用约束

PDF 原文给出了比普通课程更严格的 AI 使用边界：

- 不允许直接用 ChatGPT 生成作业答案
- AI 只能作为有限支持工具：
  - 代码理解
  - 调试
  - 语法润色
- AI 不能替代：
  - 方法设计
  - 消融逻辑
  - 定性分析
  - 反思写作

因此最终提交物必须明显体现“你自己做了实验和分析”。

---

## 4. 数据集层面的已知信息

基于对 `dataset_final(1).zip` 的结构和文件头信息检查，目前已确认：

### 4.1 数据文件

压缩包内包含：

- `dataset_final/train.csv`
- `dataset_final/val.csv`
- `dataset_final/test_features.csv`

### 4.2 数据规模

- `train.csv`：`74375 x 33`
- `val.csv`：`13125 x 33`
- `test_features.csv`：`12500 x 32`

说明：

- 训练集和验证集包含标签列 `premium_risk`
- hidden-test 文件不包含标签

### 4.3 字段结构

训练集列名包括：

- 标识类字段：`applicant_id`, `customer_key`, `applicant_ref_code`
- 时间/类别字段：`application_month`, `employment_sector`, `prior_debt_products`, `debt_portfolio_quality`, `account_tenure`, `minimum_payment_only`, `spending_profile`
- 数值特征：收入、负债、额度变化、查询次数、逾期情况、投资金额、余额等
- 明显可疑字段：`bureau_risk_index`
- 噪声字段：`noise_feature_1` 到 `noise_feature_5`
- 标签：`premium_risk`

### 4.4 类别分布

训练集标签分布：

- `Standard`: `39686`
- `High`: `21586`
- `Low`: `13103`

结论：

- 数据明显不平衡
- 使用 `macro-F1` 作为主指标完全合理
- 在个性化改进中，`Category C` 类的重采样、类权重、阈值逻辑会很自然

### 4.5 缺失值概览

当前观察到缺失值较多的字段包括：

- `net_monthly_income_gbp`
- `avg_payment_delay_days`
- `monthly_investment_gbp`
- `prior_debt_products`
- `account_tenure`
- `late_payment_count`
- `credit_limit_change_pct`
- `credit_inquiry_count`
- `end_month_balance_gbp`

这说明预处理部分不能仅做“简单删行”，更适合使用 pipeline 化的缺失值处理方案。

---

## 5. 对任务本质的理解

这份作业本质上考查的不是“谁把模型调得最高”，而是以下四个能力：

- 是否能建立规范的机器学习实验流程
- 是否能识别不合理特征并避免数据泄露
- 是否能做公平比较、合理调参和证据驱动分析
- 是否能把理论概念和自己的实验结果一一对应起来

因此，高分解法必须同时满足：

- 模型结果合理
- 实验过程规范
- 分析论证充分
- notebook 和 PDF 严格互相对应

---

## 6. Notebook 需求拆解

下面按原始评分结构，对 notebook 部分做可执行拆解。

### 6.1 A 部分：清洗、预处理与基线建模

必须完成的内容：

- 读取 `train.csv`、`val.csv`、`test_features.csv`
- 明确 `X_train / y_train / X_val / y_val / X_test`
- 识别并删除泄露特征
- 处理脏值、缺失值、类别变量
- 建立一个基线 pipeline
- 报告 baseline 的：
  - `accuracy`
  - `macro-F1`
  - confusion matrix
- 确保 train、val、test 使用完全一致的预处理规则

建议实现：

- 使用 `ColumnTransformer + Pipeline`
- 数值特征：
  - `SimpleImputer(strategy='median')`
- 类别特征：
  - `SimpleImputer(strategy='most_frequent')`
  - `OneHotEncoder(handle_unknown='ignore')`
- baseline 模型：
  - `LogisticRegression`
  - 或 `HistGradientBoosting` 前的简单基线

更稳妥的推荐是：

- 用 `LogisticRegression(class_weight='balanced')` 作为 baseline

原因：

- 简单
- 可解释
- 适合作为后续树模型的比较起点

### 6.2 泄露特征识别策略

由于 PDF 强调必须自行识别，不建议在正式 notebook 中直接“拍脑袋认定”某列是泄露。

建议采用下面的证据链：

1. 先从业务语义初筛高风险列  
   候选优先检查：
   - `bureau_risk_index`
   - 各类明显后验统计或接近标签定义的字段

2. 做单变量或极简模型筛查  
   例如：
   - 单列训练一个简单模型
   - 比较每列单独带来的验证集 `macro-F1`

3. 检查“异常高”的预测能力  
   若某列单独就能异常接近目标标签，则高度怀疑为 leakage

4. 删除该特征后重新建立基线  
   在 notebook 中明确说明：
   - 删除前风险
   - 删除后原因
   - 为什么后续分析必须基于删除后的数据

注意：

- 从字段命名看，`bureau_risk_index` 是最值得优先怀疑的候选
- 但正式提交中最好写成“通过字段语义 + 验证结果发现其构成泄露或近似泄露”

### 6.3 B 部分：随机森林与 boosting 的受控比较

必须完成：

- 保持同一预处理
- 比较：
  - `RandomForestClassifier`
  - 一个 boosting 模型

推荐 boosting 模型优先级：

1. `XGBoost`
2. `LightGBM`
3. `HistGradientBoostingClassifier`

推荐理由：

- PDF 明确点名推荐 `XGBoost`
- 后续调参空间更丰富
- 更容易做高质量的超参数优化

本节输出建议至少包含：

- 模型对比表：
  - accuracy
  - macro-F1
  - 训练时间
- 每个模型的 confusion matrix
- 分类报告或按类别 F1
- 简短解释 bagging 与 boosting 在本数据集上的差异

重点：

- 不是证明谁永远更强
- 而是说明在当前数据集上，哪种偏差-方差特性更适合

### 6.4 C 部分：高级超参数优化

必须完成：

- 至少选择一个主模型
- 使用高级优化方法进行调参
- 目标函数对准验证集 `macro-F1`

推荐主模型：

- `XGBoost`

推荐优化器：

- `Optuna` 的 `TPESampler`

推荐搜索空间示例：

- `n_estimators`
- `max_depth`
- `learning_rate`
- `min_child_weight`
- `subsample`
- `colsample_bytree`
- `gamma`
- `reg_alpha`
- `reg_lambda`

建议输出：

- 最优参数表
- 前若干 trial 的结果摘要
- 调参前后性能对比表
- 关键超参数的重要性解释

注意：

- 需要简要说明为什么搜索空间这样设
- 需要说明“原本预期哪些参数最关键”
- 需要说明“调参结果是否符合预期”

这部分内容将直接为 PDF 中第 2 题服务。

### 6.5 D 部分：个性化改进

这是 notebook 中占比最高、最容易拉开差距的部分。

#### 学号末位对应关系

- `0-1` -> `Category A`：数据质量与缺失机制
- `2-3` -> `Category B`：特征表示与特征工程
- `4-5` -> `Category C`：类别不平衡与目标设计
- `6-7` -> `Category D`：鲁棒性、校准或集成
- `8-9` -> `Category E`：公平性、诊断或可解释性

#### 每类推荐落地方式

`Category A` 可选实现：

- `IterativeImputer`
- 更细粒度缺失指示器
- 异常值裁剪或 winsorization
- 脏值统一清洗

`Category B` 可选实现：

- 特征交叉
- 类别合并
- 目标无监督编码之外的安全表示
- log 变换、比例特征、债务收入比等衍生变量

`Category C` 可选实现：

- `class_weight`
- `SMOTE` 或其他重采样
- focal-like 思想的替代实现
- 基于验证集的阈值调整

`Category D` 可选实现：

- 概率校准
- soft voting
- stacking
- bootstrap 稳定性测试

`Category E` 可选实现：

- `SHAP`
- permutation importance
- 分组公平性检查
- 错误样本分析
- 高风险误判模式总结

#### 强烈建议的写法

无论学号末位落在哪类，都建议再加一个容易出效果的 optional 类别：

- 若主模型是树模型，优先补：
  - `Category E` 可解释性
  - 或 `Category D` 集成/校准

这是因为：

- PDF 明确欢迎“具体洞见”
- 可解释性和误差分析非常利于写 reflection
- 这些内容能让 PDF 更有证据，不容易空泛

#### 个性化改进部分必须有的证据

- 紧凑版 ablation table
- 改进前后 accuracy / macro-F1 对比
- 必要时增加 class-wise F1
- 简短解释：
  - 做了什么
  - 为什么这样做
  - 结果是否提升
  - 若未提升，为什么仍然有价值

### 6.6 E 部分：K-Means 与 GMM 探索

这一部分应控制篇幅，不宜做成主线。

建议流程：

1. 从清洗后的特征中取适合聚类的数值空间
2. 必要时先做缩放
3. 可以考虑降维到：
   - PCA 2D 用于可视化
4. 对 `k=2~8` 分别跑：
   - `KMeans`
   - `GaussianMixture`

建议输出：

- `K-Means`：
  - inertia / SSE 曲线
  - cluster size
  - silhouette score（可选加强）
- `GMM`：
  - BIC / AIC 或 log-likelihood 趋势
  - component size
  - posterior probability / responsibility 统计

最后做一个对比表或图，回答：

- 为什么 `K-Means` 是 hard assignment
- 为什么 `GMM` 是 soft assignment
- 当前数据是否存在模糊边界
- `GMM` 是否额外揭示了不确定性或重叠结构

### 6.7 F 部分：最终模型与 hidden-test 导出

必须满足的原则：

- 只能依据验证集结果选最终模型
- 不允许根据 hidden-test 结果回头调参

建议流程：

1. 锁定最终 pipeline
2. 用 `train + val` 合并后重新训练
3. 对 `test_features.csv` 预测
4. 生成严格符合格式的 CSV

推荐导出逻辑：

- 从 `test_features.csv` 保留：
  - `applicant_id`
  - `customer_key`
- 新增一列：
  - `premium_risk`

最终列顺序必须是：

1. `applicant_id`
2. `customer_key`
3. `premium_risk`

---

## 7. 推荐的整体实现路线

下面给出一条适合拿分且可操作的实现主线。

### 7.1 技术栈建议

- Python
- `pandas`
- `numpy`
- `scikit-learn`
- `xgboost`
- `optuna`
- `matplotlib`
- `seaborn`
- `shap`（如选择可解释性方向）
- `imbalanced-learn`（如选择重采样方向）

### 7.2 推荐项目结构

```text
coursework_ml/
├─ notebook/
│  └─ insurance_premium_risk.ipynb
├─ src/
│  ├─ data_utils.py
│  ├─ features.py
│  ├─ metrics.py
│  ├─ tuning.py
│  └─ export.py
├─ outputs/
│  ├─ figures/
│  ├─ tables/
│  └─ predictions/
├─ report/
│  └─ theory_and_reflection.pdf
└─ README.md
```

如果想降低复杂度，也可以只保留：

- 一个主 notebook
- 一到两个辅助 `.py` 脚本

关键是要保证复现性，而不是强行复杂化。

### 7.3 Notebook 章节建议

建议 notebook 按下面顺序组织：

1. Introduction and Setup
2. Data Loading
3. Data Cleaning and Leakage Check
4. Baseline Pipeline
5. Controlled Comparison: Random Forest vs Boosting
6. Advanced Hyperparameter Optimisation
7. Personalised Improvement Work
8. K-Means and GMM Exploration
9. Final Model Selection
10. Hidden-Test Export
11. Conclusion

优点：

- 与评分结构高度对齐
- PDF 写作时可以直接反向索引表格和图片

---

## 8. 推荐的模型方案

### 8.1 baseline

推荐：

- `LogisticRegression`

作用：

- 给出最低可比较基线
- 验证预处理链是否稳定
- 提供线性模型与树模型的风格对照

### 8.2 bagging 方案

推荐：

- `RandomForestClassifier`

关注点：

- 对类别变量经 one-hot 后的适应性
- 是否更稳但不够激进
- 是否在少数类上表现一般

### 8.3 boosting 方案

推荐首选：

- `XGBoost`

备选：

- `LightGBM`

若环境依赖受限可退而求其次：

- `HistGradientBoostingClassifier`

### 8.4 最终模型的推荐候选

最可能的优胜路线通常是：

- 删除泄露特征后
- 用稳定的预处理 pipeline
- 以 `XGBoost` 作为主模型
- 叠加一个与你学号类别匹配的必做改进
- 再叠加一个可解释性或校准类的 optional 改进

一个较稳的最终候选组合是：

- 主模型：调参后的 `XGBoost`
- 必做改进：按学号末位选择
- 可选改进：`SHAP + error analysis` 或 `probability calibration`

---

## 9. PDF 的写作映射方案

为了避免 PDF 和 notebook 脱节，建议从 notebook 设计开始就准备好下面这些证据位。

### 9.1 Bagging vs Boosting

PDF 要回答：

- bagging 和 boosting 的定义与性质
- 两个模型的验证结果
- 辅助分析
- 与本数据集的结合解释

Notebook 需要提前准备：

- `RF vs XGB` 对比表
- confusion matrix
- class-wise F1
- 调参前后稳定性或训练/验证表现

### 9.2 Hyperparameter Optimisation

PDF 要回答：

- 优化器为什么合理
- 搜索空间为什么合理
- 哪些参数最重要
- 调参结果是否符合预期

Notebook 需要提前准备：

- Optuna study 结果表
- 最优参数
- 调参前后指标变化
- 若可能，参数重要性图

### 9.3 K-Means vs GMM

PDF 要回答：

- hard vs soft assignment
- 两者假设差异
- 当前数据上的观察结论

Notebook 需要提前准备：

- 一张聚类比较图
- 一张指标对比表
- 一段关于重叠和不确定性的解释

### 9.4 Personalised Reflection

PDF 要回答：

- 必做类别做了什么
- 可选类别做了什么
- 遇到的问题
- 做出的努力
- 学到了什么

Notebook 需要提前准备：

- ablation table
- before/after 结果对比
- 若有失败实验，也保留最关键的一两个作为证据

### 9.5 AI-use Declaration

PDF 中建议采用诚实、克制、可核验的表述，例如：

- 使用 AI 协助理解报错、检查代码逻辑、润色语言
- 所有方法设计、实验执行、结果核验和结论撰写均由本人完成
- 所有表格、图和结论均以 notebook 实验结果为依据

注意：

- 不能写成“AI 帮我完成了模型设计”
- 不能出现与 notebook 证据对不上的泛化陈述

---

## 10. 风险点分析

### 10.1 最大风险：没有先删除泄露特征

后果：

- 分数看似很高
- 但整个分析会被视为失真
- 影响 baseline、比较、调参和最终模型选择

### 10.2 常见风险：比较不公平

表现：

- baseline 和后续模型使用了不同预处理
- 一个模型用 train，一个模型用 train+val
- 某些模型调参后和默认模型直接横比

后果：

- 结论缺乏可信度

### 10.3 常见风险：只报 accuracy

由于类别不平衡：

- 只看 accuracy 会掩盖少数类问题
- 很容易丢掉对 `Low` 或 `High` 类的分析深度

### 10.4 常见风险：个性化改进做成“试很多但没有逻辑”

PDF 原文明确更看重：

- meaningful diagnostic
- concrete insight

而不是：

- 一大堆零散实验截图

### 10.5 常见风险：PDF 空泛

如果 PDF 只是教材知识复述，而没有引用 notebook 的具体图表或指标，会被明显扣分。

### 10.6 常见风险：CSV 格式错误

尤其要避免：

- 文件名错误
- 列顺序错误
- 标签拼写错误
- 导出时丢掉 `applicant_id` 或 `customer_key`

---

## 11. 建议的执行顺序

建议按以下顺序推进，效率最高：

1. 先读取并检查 train / val / test 的列结构
2. 找出并删除泄露特征
3. 建立统一预处理 pipeline
4. 跑 baseline
5. 跑 `Random Forest vs XGBoost` 初始比较
6. 选一个主模型做 `Optuna`
7. 根据学号末位完成必做改进
8. 增加一个 optional 改进
9. 做 `K-Means + GMM` 紧凑探索
10. 选最终模型并重训
11. 导出 `test_result_[student_id].csv`
12. 最后再写 PDF

原因：

- PDF 的每个回答都依赖 notebook 证据
- 先写 PDF 容易出现空泛和证据脱节

---

## 12. 建议的时间分配

如果按一份完整高质量作业来做，建议分配如下：

- 数据清洗与泄露识别：`15%`
- baseline 与模型比较：`20%`
- 高级调参：`20%`
- 个性化改进：`25%`
- K-Means / GMM：`10%`
- 最终导出与提交检查：`5%`
- PDF 写作：`5%`

如果时间紧，最不能压缩的部分是：

- 泄露识别
- 受控比较
- 个性化改进
- PDF 与 notebook 的证据对应

---

## 13. 最推荐的落地方案

在当前要求下，一套相对稳妥、兼顾分数与实现成本的方案如下：

### 13.1 Notebook 主线

- 删除泄露特征
- 建立 `ColumnTransformer + Pipeline`
- baseline 使用 `LogisticRegression`
- 受控比较使用：
  - `RandomForestClassifier`
  - `XGBoost`
- 用 `Optuna` 调 `XGBoost`
- 个性化改进做：
  - 学号对应的必做类别
  - 再补一个 `Category E` 或 `Category D`
- 无监督探索做：
  - `KMeans`
  - `GaussianMixture`
- 最终模型大概率采用：
  - 调参后的 `XGBoost` 或其增强版本

### 13.2 PDF 主线

围绕五个 compulsory prompt 分别写，每一题都强制绑定 notebook 中的至少一个：

- 表
- 图
- 指标结果

写法上坚持：

- 先简短理论
- 再接本次实验数据
- 再给出数据集相关解释

### 13.3 提交前检查清单

- notebook 能从头运行到尾
- 图表和表格在 notebook 中可见
- PDF 中提到的数值和 notebook 完全一致
- hidden-test CSV 命名正确
- hidden-test CSV 列顺序正确
- 标签名称拼写正确
- 所有附加脚本一并提交

---

## 14. 当前仍待确认的信息

以下信息目前仍需你确认，才可以把“最终实现方案”从通用版收束为定制版：

- 你的 `学号末位`
- 你是否打算使用 `XGBoost`
- 你是否希望 optional 改进优先走：
  - 可解释性方向
  - 集成/校准方向
  - 类别不平衡方向

其中最关键的是：

- `学号末位`

因为它直接决定 `Category A/B/C/D/E` 中哪一类是你的必做项。

---

## 15. 结论

这份机器学习作业的最优策略不是“盲目追求最高分模型”，而是：

- 先保证实验规范
- 再确保比较公平
- 再通过高级调参和个性化改进拉开差距
- 最后让 PDF 和 notebook 形成严格的证据闭环

如果后续要真正动手实现，建议直接按照本文档第 `11` 节的执行顺序推进，并优先先确认学号末位，再定制个性化改进方案。
