ML-For-Beginners 回归第一章作业实战:用 Linnerud 数据集描述并构建 Scikit-learn 回归模型
本文围绕 ML-For-Beginners 课程回归(2-Regression)章节第一课的作业 assignment.md 展开,完整解读其核心要求:基于 Scikit-learn 内置的 Linnerud 多目标数据集,用文字描述如何构建一个刻画「腰围(waistline)与仰卧起坐次数(situps)」之间关系的回归模型,并将同样的思路推广到数据集中其余变量。读完本文,你不仅能按作业评分标准组织出合格的描述性答案,还能直接复用本课程配套的标准 Scikit-learn 回归工作流(加载数据、切分训练/测试集、拟合 LinearRegression、预测并绘图)把这份作业真正落地为可运行的代码。
作业出处与学习目标
这份作业隶属于课程第 2 章「Regression」的第 1 课「Tools」(工具准备课),该课的整体目标是:配置本地机器学习环境、熟悉 Jupyter Notebook、掌握 Scikit-learn 的安装与使用,并通过一个动手练习初步接触线性回归。作业文件同时存在英文原文 assignment.md 与阿拉伯语译文 translations/ar/2-Regression/1-Tools/assignment.md,标题均为「Regression with Scikit-learn(使用 Scikit-learn 做回归)」。
值得注意的一个背景是:本课程的回归教学刻意从「最经典、最可解释」的路线入手。第 1 课的 README 先用 Scikit-learn 内置的 diabetes 数据集完整走了一遍单变量线性回归(选一个特征、reshape、train_test_split、fit、predict、matplotlib 绘图),而课后作业则要求学习者换一个数据集、换一组变量,独立完成「描述建模过程」的练习——这正是检验是否真正理解回归工作流的试金石。
作业要求全解读:Linnerud 数据集
数据集是什么
作业原文(英/阿双语内容一致)给出的核心素材是 Scikit-learn 内置的 Linnerud 数据集,并引用了官方描述:
「It consists of three exercise (data) and three physiological (target) variables collected from twenty middle-aged men in a fitness club」——它由从某健身俱乐部 20 名中年男性身上收集的 3 个运动类变量(data,即特征 X) 和 3 个生理类变量(target,即目标 y) 构成。
按 Scikit-learn 对该数据集的公开描述,三组运动变量依次为 chins(引体向上)、situps(仰卧起坐)、jumps(开合跳)的次数;三组生理目标依次为 waist(腰围)、pulses(脉搏)、weight(体重)。也就是说,这个数据集天然是一个 多目标(multiple targets) 结构:每一对「运动量 → 生理指标」都可以独立地立一个回归问题。这与 diabetes 数据集「10 个特征 → 1 个目标」的结构不同,也是作业特意选它的原因——它逼着学习者理解:当 y 有多列时,「选定要建模的变量对」本身就是建模流程的第一步。
作业任务
作业要求(原文):
In your own words, describe how to create a Regression model that would plot the relationship between the waistline and how many situps are accomplished. Do the same for the other datapoints in this dataset.
用中文概括即两个动作:
- 用自己的话描述如何创建一个回归模型,用来绘制 腰围(waist)与仰卧起坐次数(situps) 之间的关系;
- 对数据集中其余变量对做同样的描述(例如 pulses 与 chins、weight 与 jumps 等其余 5 组「运动×生理」配对)。
也就是说,这是一道 概念描述题而非编程题:不要求你交付模型代码,而是要求你用文字清晰讲出「从原始数据到一张关系图」的完整链路。这也解释了为什么评分标准只有一条「提交描述性段落」。
评分标准(Rubric)
作业附带的评分表(继承自原文档,完整保留):
| 评分标准 | 优秀(Exemplary) | 合格(Adequate) | 待改进(Needs Improvement) |
|---|---|---|---|
| 提交一段描述性文字(Submit a descriptive paragraph) | 提交了书写良好、完整的段落 | 只提交了几个句子 | 未提交任何描述 |
对照这份 Rubric,一份「优秀」答案应当是一段逻辑连贯、覆盖全链路的文字,而不是零散的短语。下一节给出的参考写法与代码,正好对应这段话需要覆盖的技术要点。
参考解法:把课程标准回归工作流套用到 Linnerud
虽然作业只要求「描述」,但要写出经得起推敲的描述,最稳妥的办法是先把代码真正跑通。课程 1-Tools 课的答案 notebook 中 diabetes 示例的完整调用链是:
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
X, y = datasets.load_diabetes(return_X_y=True) # X 形状 (442, 10)
X = X[:, 2] # 只取第 3 列特征
X = X.reshape((-1, 1)) # 展平成 2D 数组,绘图与建模都需要
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
model = linear_model.LinearRegression()
model.fit(X_train, y_train) # 用训练集拟合
y_pred = model.predict(X_test) # 用测试集预测,用于画直线
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.show()
上图即该答案 notebook 运行 plt.scatter + plt.plot 后的典型输出形态:黑色散点是测试集的真实样本,蓝色直线是模型 predict 出的拟合关系。作业要求绘制的「waist 对 situps 关系图」最终呈现的正是这种形态。
将同样的六步流程原样迁移到 Linnerud 数据集,核心改动只有两处:换数据源(load_linnerud)、按列索引挑出变量对。参考实现如下(可在本课程的 notebook.ipynb 之外新建本地 notebook 运行,仓库文件请勿修改):
import matplotlib.pyplot as plt
from sklearn import datasets, linear_model, model_selection
# 1. 加载 Linnerud:data 为 (20, 3) 的运动变量,target 为 (20, 3) 的生理指标
linnerud = datasets.load_linnerud()
X_all, y_all = linnerud.data, linnerud.target
# 2. 选定变量对:X 取 situps 列,y 取 waist 列
# 列顺序遵循 Scikit-learn 对 Linnerud 数据集的说明:
# X 依次为 chins / situps / jumps,y 依次为 waist / pulses / weight
X = X_all[:, 1].reshape(-1, 1) # situps,reshape 成 (20, 1) 以匹配建模接口
y = y_all[:, 0] # waist
# 3. 切分训练集与测试集(沿课程惯例,test_size=0.33)
X_train, X_test, y_train, y_test = model_selection.train_test_split(
X, y, test_size=0.33)
# 4. 拟合线性回归
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
# 5. 对测试集做预测
y_pred = model.predict(X_test)
# 6. 绘图:散点为真实点,直线为模型关系
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.xlabel('Situps (count)')
plt.ylabel('Waist (cm)')
plt.title('Waist vs. Situps: Linear Regression on Linnerud')
plt.show()
针对「其余数据点」的第二问,只需把第 2 步的列索引换成其他配对,例如 chins→pulses 取 X_all[:, 0] 对 y_all[:, 1],weight→jumps 取 X_all[:, 2] 对 y_all[:, 2],其余五步完全不变。这个「六步流程不变、只换列索引」的事实,正是描述性答案里最值得写出的结论。
描述段落怎么写才能拿到「优秀」
结合评分标准与上面的实现,一段合格到优秀的描述应当依次覆盖:
- 数据准备:从 Scikit-learn 加载 Linnerud 数据集,确认它有 20 行样本、3 个运动特征列与 3 个生理目标列,属于多目标数据,必须先选定一对变量(situps 作为特征 X,waist 作为目标 y);
- 形状整理:把一维的特征向量用
reshape(-1, 1)变成二维数组,这是 Scikit-learn 估计器(estimator)接口和绘图的共同要求; - 数据切分:用
model_selection.train_test_split将 X 与 y 同步切分为训练集/测试集(课程示例默认test_size=0.33)。从源码结构看,Linnerud 仅有 20 个样本,按 0.33 切分后测试集约 7 个样本,规模很小,描述中应说明小样本下拟合结果只能作定性参考; - 模型拟合与预测:实例化
linear_model.LinearRegression,调用model.fit(X_train, y_train)用训练集学习斜率与截距,再调用model.predict(X_test)得到预测值——fit/predict是 Scikit-learn 各估计器通用的接口约定,课程 README 也提示这一模式在 TensorFlow 等库中同样常见; - 可视化:用 matplotlib 以散点画出测试集真实点,再用
predict的结果画一条直线,直观展示 waist 随 situps 变化的线性趋势; - 推广:对数据集中其余 5 组「运动×生理」变量对,重复 1–5 步,仅替换选列索引即可。
把这段链路用自然语言(而非 API 名称堆砌)写成连贯段落,即符合 Rubric 中「well-written paragraph」的要求。
延伸阅读与仓库内相关资源
- 课程正文(英文/阿拉伯语):2-Regression/1-Tools/README.md、translations/ar/2-Regression/1-Tools/README.md,其中包含环境安装(Python、VS Code、Scikit-learn、Jupyter)、notebook 操作练习与 diabetes 线性回归完整教程;
- 可对照的答案 notebook:2-Regression/1-Tools/solution/notebook.ipynb(Python 版,含每个单元格的真实输出);
- 作业文件:2-Regression/1-Tools/assignment.md(英文)、translations/ar/2-Regression/1-Tools/assignment.md(阿拉伯语,附 Co-op Translator 机器翻译免责声明,原文以英文为准);
- 回归章节后续课程(2-Data、3-Linear、4-Logistic)会在此基础上讲解数据探索、线性回归深化与逻辑回归,本作业的「描述建模过程」能力是它们的直接前置。
综上,这份作业的表面形式是一道文字题,实质考核的是学习者能否把「选变量对 → 整形 → 切分 → 拟合 → 预测 → 绘图」这条经典回归流水线完整、准确地表述出来。跑通一次 Linnerud 的 waist–situps 回归后,再回写描述段落,即可稳定达到评分标准中的「优秀」档。
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
