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 = cammeoclass2 = osmancik
缺失值 ? 记录
原始来源 UCI Rice (Cammeo and Osmancik)

7 个特征AreaPerimiterMajor_Axis_LengthMinor_Axis_LengthEccentricityConvex_AreaExtent(第 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 RegressionNaïve Bayes

评估方式——固定写法:

cvKFold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)

要报告平均交叉验证准确率

💡 数据是 7 个连续特征,所以朴素贝叶斯要用 GaussianNB(见 Week 04 笔记的高斯朴素贝叶斯部分),不是计数版本。

Part 2:网格搜索调参

分类器(6 个):KNNDecision TreeAdaBoostGradient BoostingRandom ForestSVM

方法GridSearchCV + 10 折分层交叉验证(把 cvKFold 传给 GridSearchCV

数据划分train_test_split,要 stratifyrandom_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 F1weighted average F1

格式:准确率、F1 等保留 4 位小数.4f);kpn_estimatorsmax_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 而不是 floatSimpleImputer 会在任何分类器跑起来之前就报错。

对策:读文件时告诉 pandas ? 就是缺失值(na_values 参数),让它直接解析成浮点数。

陷阱 2:任何写死维度的写法都会挂

不能出现 14007range(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 的公式,全都直接用得上。