- Added Lecture4 - ModelFree.pdf (3013 KB) - Added Lecture5 - Control.pdf (2575 KB) - Added Lecture6 - Value.pdf (3320 KB)
22 KiB
机器学习个人课程作业需求分析与实现方案
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 作业目标
需要围绕一个虚构但接近真实场景的健康保险数据集,建立并改进一个多分类模型,用于预测申请人的保费风险等级:
LowStandardHigh
该任务不是单纯追求 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-F1accuracy
原因是类别不平衡明显,不能只用准确率判断模型优劣。
3.2 数据泄露约束
PDF 明确指出:
- 数据中存在
1个泄露特征 - 必须先识别并移除,再进入后续分析
- 如果没有删除,后续多个部分都会被视为无效或严重失真
这说明“找出泄露特征”不是建议项,而是作业关键检查点。
3.3 模型比较约束
Notebook 中必须完成:
- 一个 baseline pipeline
- 一个
Random Forest - 一个
Boosting模型
并且需要满足“受控比较”原则:
- 使用同一套预处理流程
- 使用同一份训练/验证划分
- 使用同一评价指标
否则比较结论不成立。
3.4 高级调参约束
至少一个主模型需要使用真正的高级调参方法,例如:
Optuna/TPE- 贝叶斯优化
HyperoptRay Tune
PDF 明确说明:
- 单独使用
RandomizedSearchCV通常不足以进入高分档
因此建议主方案使用 Optuna。
3.5 个性化改进约束
必须完成:
- 根据学号末位对应的
1个必做类别 - 额外至少
1个自选类别
推荐但非强制:
- 再额外完成第
2个可选类别,以增强区分度
3.6 无监督探索约束
必须完成紧凑版的:
K-MeansGaussian Mixture Model (GMM)
重点不是聚类分数超过监督学习模型,而是体现:
- 对无监督方法机制的理解
- 对结果的谨慎解释
- 对
hard assignment和soft assignment区别的认识
3.7 hidden-test 导出约束
最终 CSV 必须:
- 文件名为
test_result_[your_student_id].csv - 第一列必须是
applicant_id - 第二列必须是
customer_key - 第三列必须是
premium_risk - 预测标签只能使用:
StandardHighLow
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.csvdataset_final/val.csvdataset_final/test_features.csv
4.2 数据规模
train.csv:74375 x 33val.csv:13125 x 33test_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:39686High:21586Low:13103
结论:
- 数据明显不平衡
- 使用
macro-F1作为主指标完全合理 - 在个性化改进中,
Category C类的重采样、类权重、阈值逻辑会很自然
4.5 缺失值概览
当前观察到缺失值较多的字段包括:
net_monthly_income_gbpavg_payment_delay_daysmonthly_investment_gbpprior_debt_productsaccount_tenurelate_payment_countcredit_limit_change_pctcredit_inquiry_countend_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 的:
accuracymacro-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 中直接“拍脑袋认定”某列是泄露。
建议采用下面的证据链:
-
先从业务语义初筛高风险列
候选优先检查:bureau_risk_index- 各类明显后验统计或接近标签定义的字段
-
做单变量或极简模型筛查
例如:- 单列训练一个简单模型
- 比较每列单独带来的验证集
macro-F1
-
检查“异常高”的预测能力
若某列单独就能异常接近目标标签,则高度怀疑为 leakage -
删除该特征后重新建立基线
在 notebook 中明确说明:- 删除前风险
- 删除后原因
- 为什么后续分析必须基于删除后的数据
注意:
- 从字段命名看,
bureau_risk_index是最值得优先怀疑的候选 - 但正式提交中最好写成“通过字段语义 + 验证结果发现其构成泄露或近似泄露”
6.3 B 部分:随机森林与 boosting 的受控比较
必须完成:
- 保持同一预处理
- 比较:
RandomForestClassifier- 一个 boosting 模型
推荐 boosting 模型优先级:
XGBoostLightGBMHistGradientBoostingClassifier
推荐理由:
- PDF 明确点名推荐
XGBoost - 后续调参空间更丰富
- 更容易做高质量的超参数优化
本节输出建议至少包含:
- 模型对比表:
- accuracy
- macro-F1
- 训练时间
- 每个模型的 confusion matrix
- 分类报告或按类别 F1
- 简短解释 bagging 与 boosting 在本数据集上的差异
重点:
- 不是证明谁永远更强
- 而是说明在当前数据集上,哪种偏差-方差特性更适合
6.4 C 部分:高级超参数优化
必须完成:
- 至少选择一个主模型
- 使用高级优化方法进行调参
- 目标函数对准验证集
macro-F1
推荐主模型:
XGBoost
推荐优化器:
Optuna的TPESampler
推荐搜索空间示例:
n_estimatorsmax_depthlearning_ratemin_child_weightsubsamplecolsample_bytreegammareg_alphareg_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_weightSMOTE或其他重采样- 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 探索
这一部分应控制篇幅,不宜做成主线。
建议流程:
- 从清洗后的特征中取适合聚类的数值空间
- 必要时先做缩放
- 可以考虑降维到:
- PCA 2D 用于可视化
- 对
k=2~8分别跑:KMeansGaussianMixture
建议输出:
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 结果回头调参
建议流程:
- 锁定最终 pipeline
- 用
train + val合并后重新训练 - 对
test_features.csv预测 - 生成严格符合格式的 CSV
推荐导出逻辑:
- 从
test_features.csv保留:applicant_idcustomer_key
- 新增一列:
premium_risk
最终列顺序必须是:
applicant_idcustomer_keypremium_risk
7. 推荐的整体实现路线
下面给出一条适合拿分且可操作的实现主线。
7.1 技术栈建议
- Python
pandasnumpyscikit-learnxgboostoptunamatplotlibseabornshap(如选择可解释性方向)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 按下面顺序组织:
- Introduction and Setup
- Data Loading
- Data Cleaning and Leakage Check
- Baseline Pipeline
- Controlled Comparison: Random Forest vs Boosting
- Advanced Hyperparameter Optimisation
- Personalised Improvement Work
- K-Means and GMM Exploration
- Final Model Selection
- Hidden-Test Export
- 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. 建议的执行顺序
建议按以下顺序推进,效率最高:
- 先读取并检查 train / val / test 的列结构
- 找出并删除泄露特征
- 建立统一预处理 pipeline
- 跑 baseline
- 跑
Random Forest vs XGBoost初始比较 - 选一个主模型做
Optuna - 根据学号末位完成必做改进
- 增加一个 optional 改进
- 做
K-Means + GMM紧凑探索 - 选最终模型并重训
- 导出
test_result_[student_id].csv - 最后再写 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 - 受控比较使用:
RandomForestClassifierXGBoost
- 用
Optuna调XGBoost - 个性化改进做:
- 学号对应的必做类别
- 再补一个
Category E或Category D
- 无监督探索做:
KMeansGaussianMixture
- 最终模型大概率采用:
- 调参后的
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 节的执行顺序推进,并优先先确认学号末位,再定制个性化改进方案。