Files
rl-atari/强化学习个人课程作业报告/机器学习个人课程作业_需求分析与实现方案.md
T
Serendipity ceddbdd559 Add lecture materials for Model-Free, Control, and Value topics
- Added Lecture4 - ModelFree.pdf (3013 KB)
- Added Lecture5 - Control.pdf (2575 KB)
- Added Lecture6 - Value.pdf (3320 KB)
2026-04-28 20:28:00 +08:00

22 KiB
Raw Blame History

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

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-MeansGMM 的无监督探索
  • 基于验证集证据选择最终模型
  • 生成规定格式的 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 Exercise60
  • Theory and Reflection PDF30
  • Coding Quality / Answer Sheet Quality / Submission Guidelines10

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


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 assignmentsoft 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.csv74375 x 33
  • val.csv13125 x 33
  • test_features.csv12500 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_1noise_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.csvval.csvtest_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

推荐优化器:

  • OptunaTPESampler

推荐搜索空间示例:

  • 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 推荐项目结构

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 analysisprobability 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 会掩盖少数类问题
  • 很容易丢掉对 LowHigh 类的分析深度

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

PDF 原文明确更看重:

  • meaningful diagnostic
  • concrete insight

而不是:

  • 一大堆零散实验截图

10.5 常见风险:PDF 空泛

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

10.6 常见风险:CSV 格式错误

尤其要避免:

  • 文件名错误
  • 列顺序错误
  • 标签拼写错误
  • 导出时丢掉 applicant_idcustomer_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 / GMM10%
  • 最终导出与提交检查:5%
  • PDF 写作:5%

如果时间紧,最不能压缩的部分是:

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

13. 最推荐的落地方案

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

13.1 Notebook 主线

  • 删除泄露特征
  • 建立 ColumnTransformer + Pipeline
  • baseline 使用 LogisticRegression
  • 受控比较使用:
    • RandomForestClassifier
    • XGBoost
  • OptunaXGBoost
  • 个性化改进做:
    • 学号对应的必做类别
    • 再补一个 Category ECategory 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 节的执行顺序推进,并优先先确认学号末位,再定制个性化改进方案。