ML-For-Beginners 分类练习实战指南:用课程数据集匹配 Scikit-learn 算法完成分类方法探索
本文围绕 ML-For-Beginners 分类模块第一课的作业《Explore classification methods》展开。该作业要求你在 Scikit-learn 监督学习文档中做一场"分类方法寻宝":从课程自带的数据集中挑选一个、为它提出一个可以回答的问题、再匹配一种分类技术,最终产出覆盖 3~5 种算法、解释详尽的对比表格。读完本篇,你将掌握如何盘点仓库中的五个真实数据集、判断它们适合二分类还是多分类、为每个数据集设计可验证的分类问题,并按作业评分标准(Rubric)产出一份完整的算法-数据集匹配表。
作业原始要求:Scavenger Hunt 式的分类方法探索
作业定义在 assignment.md 中,核心指令是一段"寻宝"任务:
In Scikit-learn documentation you'll find a large list of ways to classify data. Do a little scavenger hunt in these docs: your goals is to look for classification methods and match a dataset in this curriculum, a question you can ask of it, and a technique of classification. Create a spreadsheet or table in a .doc file and explain how the dataset would work with the classification algorithm.
拆解开来,交付物包含四个必须齐全的要素:
- 一个分类方法:来自 Scikit-learn 官方文档"Supervised learning(监督学习)"章节中列出的分类技术清单;
- 一个课程数据集:必须是本仓库课程中真实使用过的数据集(而非随意下载的新数据);
- 一个可以问数据集的问题:即该数据集上的具体分类目标,例如"给定一组特征,它属于哪一类?";
- 一份说明文档:用电子表格或 .doc 文件中的表格,解释该数据集是如何与该分类算法配合工作的。
这不是要求你训练出最准确的模型,而是考察**"数据集-问题-算法"三者之间的匹配能力**:能否根据数据形态(类别数、特征类型、样本量)选择合适的分类技术。
分类问题分为二分类(binary)与多分类(multiclass)两大族,这是匹配算法前先要回答的第一个问题。
评分标准:Exemplary 线要求覆盖 5 种算法
作业附带了一张明确的 Rubric 表格,建议直接按其达标线规划工作量:
| Criteria | Exemplary | Adequate | Needs Improvement |
|---|---|---|---|
| 分类方法探索 | 提交一份概览文档,覆盖 5 种算法及其对应分类技术,解释详尽且有深度 | 提交一份概览文档,覆盖 3 种算法及其对应分类技术,解释详尽且有深度 | 覆盖少于 3 种算法,且解释既不详尽也不深入 |
由此得到两条可操作建议:
- 数量底线:至少写满 3 种算法才能达到 Adequate;建议直接按 Exemplary 标准覆盖 5 种以上;
- 质量要求:每种算法不能只报名字,必须"well-explained and detailed"——说明它为什么适合这个数据集、输入输出是什么、预期如何评估效果。
第一步:盘点仓库中的候选数据集
作业限定"match a dataset in this curriculum",所以先把仓库里课程实际使用的数据集全部列出。以下信息均来自仓库中的真实 CSV 文件与对应课程文档。
1. 亚洲与印度菜肴数据集(分类主数据集,多分类)
文件 cuisines.csv,共 2448 行数据、385 列。结构特征:
cuisine列是标签,只有 5 个取值:korean(799)、indian(598)、chinese(442)、japanese(320)、thai`(289);- 其余 383 列全部是 0/1 编码的食材特征(
almond、garlic、ginger、lemongrass…),每行代表一道菜用了哪些食材。
这正是一个典型的多分类、类别不均衡、高维稀疏二值特征问题:给定一组食材,判断这道菜属于哪个菜系。可提的问题例如:"给定一篮子食材,它最可能是一道泰式菜还是韩式菜?" 或降维为二分类:"这份食材清单会不会做出一道印度菜(是/否)?"
cuisines.csv中五个菜系的样本量分布明显不均(korean 799 对 thai 289),这正是分类第一课要求先用 SMOTE 均衡的原因。
该数据集在第一课 1-Introduction/README.md 中完成了清洗与 SMOTE 均衡,产出 3995 行的 cleaned_cuisines.csv(五个菜系各 799 行),后续两节分类课(2-Classifiers-1、3-Classifiers-2)都基于它做模型对比——它是本作业最顺手的主料。
2. 美国南瓜市场价格数据(适合二分类/多分类的改造)
US-pumpkins.csv 共 1756 行,字段包括 Date、Low Price、High Price、Variety、Origin、Item Size、Color 等。它原本用于回归(预测价格),但可以自然改造成分类问题:例如按 Origin(产地州)做多分类,或按"High Price 是否超过某阈值"构造二分类标签"高价/低价"。这演示了"同一数据集可以问不同类别的问题"。
3. UFO 目击报告数据(适合二分类)
ufos.csv 共 80332 行,字段包括 shape、duration (seconds)、comments、latitude、longitude 等。可用的分类问题:按 shape(cylinder、light、sphere、triangle…)做多分类识别目击物形状;或构造二分类"事件时长是否超过 1 小时"。样本量大、类别明确,适合练习文本特征(comments 分词/计数)与数值特征混合的分类场景。
4. 尼日利亚歌曲数据(分类与聚类的交界)
nigerian-songs.csv 共 530 行,含 artist_top_genre、danceability、energy、acousticness、tempo 等音频特征。它原本用于聚类课,但 artist_top_genre 是现成的类别标签,完全可拿来做"给定音频特征向量,预测歌曲流派"的多分类练习。
5. 电网能耗时间序列(适合按日模式分类)
energy.csv 共 26304 行,记录月度能耗。可以构造弱分类问题:按"工作日/周末"或"季节"对样本打标签后,用历史特征做模式分类。这个例子能帮助你说明:并非所有数据集都天然适合分类,有些要先做标签工程——这本身就是 Rubric 要求"解释算法如何与数据集工作"的好素材。
第二步:为数据集设计"问题"——先分清二分类与多分类
作业要求写出"a question you can ask of it"。写问题前,先套用第一课的核心区分(见 README.md 的引入部分):
- 二分类:标签只有两个值。例如"这封邮件是不是垃圾邮件""南瓜价格是不是高价档";
- 多分类:标签有 3 个及以上值。例如"这道菜属于哪个菜系""这个 UFO 目击报告的形状类别是什么"。
一个实用的检验方法:看标签列的取值数。cuisine 有 5 个取值 → 多分类;如果人为把 5 个菜系合并成"含大量香料的菜系 / 其他"两组,就变成了二分类。同一个数据集两种问法,匹配到的算法与评估指标都会不同,写进文档时这种对比会直接体现"well-explained"。
第三步:从 Scikit-learn 分类技术清单中挑选算法
Scavitger hunt 的"宝藏"位于 Scikit-learn 官方文档的 supervised learning 章节。结合本仓库后续课程的真实用法(可以从各课 solution notebook 中确认),建议优先考察以下算法,它们正好满足 Exemplary 的 5 种要求:
| 算法 | 课程中的实际出处 | 适配的数据形态 |
|---|---|---|
LogisticRegression(逻辑回归) |
2-Classifiers-1 课程 import 与 solution notebook | 线性可分性较好、特征数量中等的二/多分类(multinomial 目标);cuisines 的 0/1 食材特征正是典型输入 |
SVC(支持向量机) |
同上课程,与 LogisticRegression 对照训练 |
中高维特征空间、样本量中等;边界复杂时可用核技巧 |
KNeighborsClassifier(K 近邻) |
3-Classifiers-2 solution notebook | 无需训练阶段、直观可解释;特征最好先做尺度统一 |
RandomForestClassifier(随机森林) |
同上课程 solution notebook | 高维稀疏特征、存在噪声列;自带特征重要性输出 |
| 决策树 / Naive Bayes 等(自选补充) | Scikit-learn 监督学习文档清单 | 决策树适合可解释性优先的场景;朴素贝叶斯适合独立假设较强的计数类特征 |
写文档时,每种算法建议固定回答三句话:它属于哪一类分类技术(线性模型/核方法/集成/实例学习…)、它接收什么样的特征与标签、在所选数据集上你预期它会好在哪、差在哪。这第三句是"well-explained"的关键。
第四步:交付物模板——一份可直接套用的匹配表
把上面三步的产出合并,作业的 .doc/电子表格文档可以用如下表格骨架填充(示例行基于仓库真实数据,供参考格式,不代表唯一正确答案):
| Dataset(课程数据集) | Question(分类问题) | Technique(分类技术) | How it works(算法与数据如何配合) |
|---|---|---|---|
| cuisines.csv | 给定 383 个 0/1 食材特征,这道菜属于 5 个菜系中的哪一个?(多分类) | LogisticRegression |
输入是均衡后 cleaned_cuisines.csv 的食材矩阵,标签为 cuisine;线性边界在多分类下按 multinomial 方式输出各类概率,用 train_test_split 留出测试集后以 accuracy / classification_report 评估 |
| 同上 | 给定食材清单,是否为一印度菜?(二分类) | SVC |
二分类下 SVM 找最大间隔超平面;0/1 稀疏特征维度高,核选择影响显著,可与逻辑回归对照准确率 |
| US-pumpkins.csv | 该笔南瓜交易属于哪个产地(Origin)? |
RandomForestClassifier |
日期、价格区间、品种、尺寸等混合特征,树模型可处理缺失值与不同量纲,且能输出产地预测的特征重要性 |
| ufos.csv | 目击报告的 shape 属于哪一类? |
KNeighborsClassifier |
将时长、坐标等数值化特征统一尺度后,以 K 个最近邻投票判定形状类别;样本量大(8 万余条),建议抽样训练 |
| nigerian-songs.csv | 给定音频特征向量,预测 artist_top_genre 流派? |
自选(如决策树或朴素贝叶斯) | 说明所选技术如何消费 danceability/energy/tempo 等特征,并指出与聚类课用法(无标签)的差异 |
填表时注意两点:一是"Question"列要写出具体的预测目标(预测哪一列),而不是泛泛的"分类这个数据";二是"How it works"列要落到特征与标签的衔接方式上,例如 cuisines 场景中 cuisine 列为标签、其余 0/1 列为特征,评估时用 accuracy_score、confusion_matrix、classification_report 等指标(这些 import 可见于 2-Classifiers-1/README.md 的代码段)。
最小可运行验证:在 cuisines 上走通一次分类流程
为了让表格中的"how it works"不流于纸面,可以在课程配套 notebook 中跑通最小流水线。以下代码组件(库 import、标签切分方式)与 2-Classifiers-1 课程的 solution 一致:
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
cuisines_df = pd.read_csv("4-Classification/data/cleaned_cuisines.csv")
labels = cuisines_df["cuisine"] # 标签:5 个菜系
features = cuisines_df.drop("cuisine", axis=1) # 特征:0/1 食材矩阵
X_train, X_test, y_train, y_test = train_test_split(
features, labels, test_size=0.2, random_state=42)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
preds = model.predict(X_test)
print(accuracy_score(y_test, preds))
print(classification_report(y_test, preds))
跑通后,把得到的准确率与报告中各菜系的 precision/recall 填进你的表格"how it works"列,即从"我认为它适合"升级为"它实测如何"。后续课程(2-Classifiers-1、3-Classifiers-2 的 solution notebook)还演示了 SVC、KNeighborsClassifier、RandomForestClassifier 的同类流程,可直接照抄替换 model = ... 一行完成对比实验。
交付前自检清单
- 算法数量:表格是否覆盖 5 种分类技术(Exemplary 线),至少 3 种(Adequate 线)?
- 四要素齐全:每一行是否同时含"课程数据集 + 具体问题 + 分类技术 + 工作方式解释"?
- 数据集合法性:所选数据集是否全部来自本仓库的
data目录(cuisines、US-pumpkins、ufos、nigerian-songs、energy 等),而非外部下载? - 问题类型标注:每个问题是否明确标出了二分类或多分类?
- 深度而非罗列:每种算法是否解释了"为什么这个数据集适合/不适合它",而不是只写算法名?
- 可选加分:是否跑通了最小流水线,用实测指标(accuracy、confusion matrix)佐证了至少一行结论?
完成以上检查,这份作业就从"算法名词清单"变成了"数据集驱动的技术选型文档"——这正是分类模块第一课希望你在进入 More classifiers 与 Yet other classifiers 之前建立起来的思维方式。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00

