COMP5318 Assignment 1 作业要求梳理:Rice Classification
COMP5318 Assignment 1 作业要求梳理:Rice Classification
课程:COMP5318/COMP4318 — Machine Learning and Data Mining,Semester 2 2026 规格文件:
COMP5318-A1-S22026-final.pdf(4 页) 截止:2026 年 9 月 18 日(周五,Week 7)23:59 分值:15 分 = 期末总评的 15%⚠️ 本文只整理作业要求与方法论,不放解题代码——规格里明确写了「把自己的作业提供给他人抄袭」同样会被处罚。
一、关键信息
提交与迟交
| 项目 | 规定 |
|---|---|
| 截止时间 | 2026-09-18 23:59 |
| 迟交政策 | 最多迟交 3 天,每天扣 5%;超过 3 天记 0 分 |
| 每日截止点 | 23:59 |
评分构成(三部分)
| 部分 | 内容 |
|---|---|
| 代码(占大头) | 按正确性和可运行性评分 |
| 代码风格 | 可读性、有意义的变量名、打印结果、注释 |
| 理解程度 | reflection 与 discussion |
最狠的一条:「我们会运行你的代码。任何跑不起来的部分,那部分直接 0 分。」 所以提交前务必从头到尾重跑一遍(Kernel → Restart & Run All)。
组队
- 2–4 人一组,最多 4 人
- 必须去 Canvas → People → Machine Learning Project Group 加组
- Canvas 上的组名/组号就是你的提交组号,全组必须在同一个 group 里
提交细节(容易扣分)
| 要求 | 说明 |
|---|---|
| 谁提交 | 只需一人代表全组提交,不要各自单独交 |
| 交几个文件 | 两个:.ipynb 和
.pdf |
| 交到哪 | .ipynb → "Submission:
Assignment 1 ipynb".pdf → "Submission:
Assignment 1 pdf" |
| 文件命名 | 含组号,如
ml-project-group1.ipynb(.pdf) |
| notebook 内 | 写组号 + 各成员 SID;不要写姓名(匿名评分) |
⚠️ 交错箱子会有惩罚。
💡 PDF 怎么生成(规格给的方法):
File > Download as > PDF,或Print Preview > Save as PDF,或File > Download as > HTML后打开 html 再存成 PDF。
二、数据集
Rice dataset —— 两个水稻品种的谷粒图像特征。
| 属性 | 值 |
|---|---|
| 文件 | rice-final2.csv(Canvas
提供,比原始版本更小且略有改动) |
| 样本数 | 1400 |
| 特征数 | 7(从谷粒图像中提取) |
| 类别 | class1 = cammeo,class2 = osmancik |
| 缺失值 | 用 ?
记录 |
| 原始来源 | UCI Rice (Cammeo and Osmancik) |
7
个特征:Area、Perimiter、Major_Axis_Length、Minor_Axis_Length、Eccentricity、Convex_Area、Extent(第
8 列是 class)。
💡 注意表头里
Perimiter是数据集自带的拼写(正确拼法应为 Perimeter),别自己「修正」成别的名字。
三、任务一:数据加载、预处理与打印
三步预处理,顺序固定:
| # | 步骤 | 指定工具 |
|---|---|---|
| 1 | 填补缺失值 —— 用该列的均值替换 | sklearn.impute.SimpleImputer |
| 2 | 归一化 —— 每个属性缩放到 [0, 1] | sklearn.preprocessing.MinMaxScaler |
| 3 | 改类别值 —— class1 → 0,class2 → 1 | — |
| 4 | 打印前 10 行 | 模板提供了 print_data
函数 |
打印格式:特征值保留 4
位小数(.4f),类别值是整数。
四、任务二:实现多个分类器
通用要求:所有分类器都用 tutorial 里的 sklearn
模块;所有 random_state 一律设为 0。
Part 1:不调参的交叉验证
分类器:Logistic Regression、Naïve Bayes
评估方式——固定写法:
cvKFold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0) |
要报告:平均交叉验证准确率。
💡 数据是 7 个连续特征,所以朴素贝叶斯要用 GaussianNB(见 Week 04 笔记的高斯朴素贝叶斯部分),不是计数版本。
Part 2:网格搜索调参
分类器(6 个):KNN、Decision Tree、AdaBoost、Gradient Boosting、Random Forest、SVM
方法:GridSearchCV + 10
折分层交叉验证(把 cvKFold 传给
GridSearchCV)
数据划分:train_test_split,要
stratify,random_state=0
⚠️ 规格没给
test_size—— 不传就是 sklearn 默认的 0.25(1050 训练 / 350 测试)。这点建议和 tutor 确认,或在 notebook 里注明你的选择。
模板给出的参数网格
| 分类器 | 参数网格 | 组合数 |
|---|---|---|
| KNN | k = [1, 3, 5, 7]p = [1, 2] |
8 |
| Decision Tree | max_depth = [3, 5, 7, 10]min_samples_split = [2, 5, 10]min_samples_leaf = [1, 2, 4] |
36 |
| AdaBoost | n_estimators = [50, 100, 150]learning_rate = [0.1, 0.2, 0.3, 0.5] |
12 |
| Gradient Boosting | max_depth = [1, 3, 5, 7]n_estimators = [50, 100, 150]learning_rate = [0.1, 0.2, 0.3, 0.5] |
48 |
| Random Forest | n_estimators = [10, 30, 60, 100]max_leaf_nodes = [6, 12] |
8 |
| SVM | C = [0.01, 0.1, 1, 5]gamma = [0.01, 0.1, 1, 10]kernel(可选) |
16 |
Random Forest 有额外硬性要求(模板注释里写着): 用 information gain(即
criterion='entropy')且max_features='sqrt'。⚠️ 决策树的 criterion 规格没指定——只对 RF 明确要求了 information gain。选 entropy(与课程 tutorial 一致)还是 gini(sklearn 默认)都要在 notebook 里注明。
💡 Gradient Boosting 是最慢的一个:48 组 × 10 折 = 480 次模型拟合。整个 Part 2 跑一遍需要两分钟量级,别以为是卡死了。
Part 2 要报告的内容
| 分类器 | 报告项 |
|---|---|
| 全部 6 个 | 最优参数 + 最优交叉验证准确率 + 测试集准确率 |
| Random Forest 额外 | macro average F1 和 weighted average F1 |
格式:准确率、F1 等保留 4
位小数(.4f);k、p、n_estimators、max_leaf_nodes
这些整数不要用 .4f。
五、任务三:Reflection 与 Discussion
在模板最后一个 cell 写一份简短报告,规格点名要覆盖(但不限于):
- 比较并讨论所有分类器的性能
- 讨论超参数调优对模型性能的影响
- ……(省略号是规格里自带的——鼓励你自己补充角度)
💡 可以自己加分的角度(都能挂靠到 Week 3/4 学过的概念): - 交叉验证准确率 vs 测试集准确率为什么不能直接比——测试集只有一次测量,350 个样本在 0.94 附近的标准误约 1.3 个百分点,小于 2~3 点的差距不该当成真实差异 - 预处理顺序造成的数据泄漏——规格要求先对全量数据做插补和归一化,再在 Part 2 里划分训练/测试集。这意味着 imputer 的列均值和 scaler 的 min/max 看过了测试集。本例影响可忽略(全表只有 29 个缺失值),但方法论上更干净的做法是用
sklearn.pipeline.Pipeline把预处理和分类器打包丢给GridSearchCV,让它在每一折内部重新拟合预处理 - 哪些模型对调参敏感、哪些不敏感,以及为什么——集成方法本身就在压制方差,所以调参空间小 - 朴素贝叶斯为什么垫底——检查特征间的相关系数,这直接对应 Week 4 讲的「相关属性削弱朴素贝叶斯,对策是先做特征选择」
六、评分测试与三个实现陷阱
这是整份规格里最容易翻车的一段: 「我们会用 rice 数据集和第二个数据集(
unknown.csv)测试你的程序。」 未知数据集格式相同,但特征数和样本数都不一样。 所以不要硬编码特征数和样本数——不要写死 1400 和 7。可以假设的:类变量在最后一列,且只有两类 class1 / class2。
Canvas 还提供了 test-before.csv
供提交前自测可运行性(不是用来看准确率的)。
⚠️ 提交的 notebook 里只能有 rice 数据集的结果,不要留
test-before 的输出。
陷阱 1:?
会把所有列变成 object
缺失值记作 ?,直接 read_csv
会让每一列都被解析成 object 而不是
float,SimpleImputer
会在任何分类器跑起来之前就报错。
对策:读文件时告诉 pandas ?
就是缺失值(na_values 参数),让它直接解析成浮点数。
陷阱 2:任何写死维度的写法都会挂
不能出现
1400、7、range(7)、按列名取列这类写法。
对策:用位置索引取「除最后一列外的全部」和「最后一列」,特征数和样本数全部从文件本身读出来。
自测方法:拿 test-before.csv 跑一遍——它是
6 个特征、209 行,列名叫
a1~a6,跟 rice 完全不同。跑通了才算过关。
陷阱 3:Part 1 和 Part 2 的数据流不一样
| 用什么数据 | 怎么评估 | |
|---|---|---|
| Part 1 | 全量预处理后的数据集 | 直接 10 折分层交叉验证 |
| Part 2 | 先
train_test_split,在训练集上跑
GridSearchCV |
报最优 CV 准确率 + 在测试集上报准确率 |
搞混了整个 Part 2 都是错的。
七、学术诚信
规格用了整整一页讲这件事,几条要点:
- 允许使用生成式 AI 工具(规格原文明确写了)
- ⚠️ 抄袭和「把自己的作业给别人抄」同样受罚——两边都会被处罚
- 可以和其他同学讨论作业,但你的组必须写自己的代码
- 会使用相似度检测软件
- 惩罚:学术不诚信永久记录 / 扣分到挂科 / 严重者停学并取消学生签证
- ⚠️ 一旦立案,调查可能持续数月,成绩会被冻结——COMP5318 是其他课的先修课,可能影响下学期选课甚至延毕
八、提交前检查清单
九、与课程内容的对应
| 作业环节 | 对应笔记 |
|---|---|
| 缺失值填补、归一化、kNN | Week 02 — 数据预处理与 kNN |
| Logistic Regression、过拟合、正则化 | Week 03 — 线性回归与逻辑回归 |
| 朴素贝叶斯、分层十折交叉验证、网格搜索、混淆矩阵与 F1 | Week 04 — 朴素贝叶斯与模型评估 |
Week 4 那份笔记基本就是这次作业的说明书——分层抽样为什么必要、为什么是十折、网格搜索的完整流程(CV 只在训练集上做、选出最优参数后要在整个训练集上重新训练)、precision/recall/F1 的公式,全都直接用得上。