用 Scikit-learn 构建多目标回归模型:ML-For-Beginners 课程 Linnerud 数据集作业实战解析
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
导读
本篇技术指南以 ML-For-Beginners 课程《2-Regression/1-Tools》的课后作业为骨架,围绕 scikit-learn 内置的Linnerud 多目标数据集,完整讲解"如何为一个数据集构建回归模型、并用文字描述变量间关系"的全过程。你将掌握:Linnerud 数据集的结构与变量语义、基于LinearRegression的端到端建模流程(加载数据 → 特征选择 → 数据划分 → 训练 → 预测 → 可视化),以及面对多个目标变量时的逐对建模与多输出回归两种策略,从而高质量完成该作业。
作业背景:它属于哪一课,需要哪些前置能力
本作业位于课程 2-Regression/1-Tools(Get started with Python and Scikit-learn for regression models)的末尾,是"用 Python 与 Scikit-learn 构建回归模型"四课系列的第一课作业。该课要求学习者在动手前先完成以下环境准备:
- 安装 Python,并推荐在[虚拟环境]中工作;
- 安装 Visual Studio Code,并配置 Python 开发环境;
- 安装 Scikit-learn;
- 安装 Jupyter Notebook,学会使用
.ipynb交互式笔记本(notebook 允许在代码块之间穿插 Markdown 说明,非常适合实验型、研究型任务)。
在本课的主体练习中,学习者使用内置的糖尿病数据集(442 个样本、10 个特征)走完了完整的线性回归流程:导入matplotlib、numpy与sklearn的datasets、linear_model、model_selection模块,加载数据、选定单一特征、划分训练/测试集、调用model.fit()训练、model.predict()预测并绘制散点图与回归线。该练习的完整可运行代码保存在 solution/notebook.ipynb,另有使用 tidymodels 框架的 R 语言版本教程。本次作业正是要求把同样的建模思路迁移到一个结构不同——多目标——的数据集上,并用文字把思路描述清楚。
回归系列课程的 sketchnote 总览,帮助理解线性回归在整个机器学习课程中的位置。
Linnerud 数据集:一个经典的多目标(Multi-output)回归样本
作业要求的第一步,是"查看 scikit-learn 中的 Linnerud 数据集"。按 scikit-learn 官方文档对该数据集的描述:它由三个运动(exercise)变量作为数据,三个生理(physiological)变量作为目标变量,数据来自健身俱乐部中二十名中年男性。这 20 个样本、3+3 的变量结构,使它成为一个典型的"多目标回归"(multi-output regression)练习样本——即每一个样本行同时对应多个需要预测的数值目标,而不是像糖尿病数据集那样只有一个y。
从 scikit-learn 数据加载器的结构看,三个运动变量分别对应引体向上(Chins)、仰卧起坐(Situps)与跳跃(Jumps),三个生理变量分别对应体重(Weight)、腰围(Waist)与脉搏(Pulse)。作业中点名的腰围(waistline)正是三个生理目标之一,仰卧起坐(situps)正是三个运动特征之一。
这个数据集之所以适合作为回归入门作业,原因有三:
- 样本量小、维度低:20 行 × 3 特征,肉眼即可观察,便于逐点理解回归的几何含义;
- 变量语义清晰:运动量(数据)与生理指标(目标)之间的关联方向符合常识,便于在建模后做领域层面的解读;
- 多目标结构:迫使学习者思考"一个数据集有多个 y 时该怎么办",为后续进阶的多输出建模打下认知基础。
注意:20 个样本属于极小的数据集,训练出的模型泛化能力有限。作业目的是理解建模流程与变量关系,而不是追求生产级精度——这一点应在描述性段落中有所体现。
作业要求逐条解读
作业(德语版,原文见英文版)包含两项核心任务:
任务一:用自己的话(in your own words)描述,如何创建一个回归模型,用于刻画**腰围(Taillenumfang / waistline)与仰卧起坐次数(Anzahl der durchgeführten Sit-ups / situps)**之间的关系。
任务二:对数据集中的其他数据点(即其余的运动变量与生理变量组合)重复同样的建模思路。
评分标准(Rubric)如下表:
| 标准 | 典范(Vorbildlich) | 适当(Angemessen) | 需改进(Verbesserungswürdig) |
|---|---|---|---|
| 提交一段描述性文字 | 提交一段写得好的段落 | 提交几句话 | 未提供任何描述 |
可见,作业的评分重心在于文字描述的完整性、条理与深度——代码只是辅助,关键是能否把"如何建模"讲清楚。下面给出从建模流程到文字组织的完整攻略。
完整建模思路:从"腰围 vs 仰卧起坐"开始
把本课糖尿病数据集练习的流程(见 solution/notebook.ipynb)迁移到 Linnerud 数据集,可以拆解为五个步骤。每一步既是可运行的代码,也是描述段落中可以对应的"讲解点"。
第一步:加载数据集并观察结构
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model, model_selection # 加载 Linnerud 数据集,X 为三个运动变量,y 为三个生理变量 X, y = datasets.load_linnerud(return_X_y=True) print("运动变量(数据)形状:", X.shape) # (20, 3) print("生理变量(目标)形状:", y.shape) # (20, 3)return_X_y=True表示把数据以X(数据矩阵)和y(回归目标)两个数组返回,这与本课糖尿病练习中datasets.load_diabetes(return_X_y=True)的用法一致。打印形状可以确认:Linnerud 是 20 个样本、3 个特征、3 个目标的数据集。
第二步:选定单一特征并转为二维数组
作业聚焦"腰围与仰卧起坐"这对关系。在健身语境下,通常把运动量(仰卧起坐次数)作为特征 X,生理指标(腰围)作为目标 y——即用"做了多少个仰卧起坐"来解释或预测"腰围"。参照本课练习中"选取第 3 列特征并用reshape转为 2D 数组"的做法(源码见 solution/notebook.ipynb):
# 选取"仰卧起坐"列作为特征、"腰围"列作为目标 # 按特征/目标列表的列顺序定位:Situps 在第 2 列,Waist 在第 2 列 situps = X[:, 1].reshape((-1, 1)) # 转为 (20, 1) 的二维数组 waist = y[:, 1]这里reshape((-1, 1))是关键:sklearn的估计器要求特征矩阵是二维的(样本 × 特征),当只选一个特征时必须显式整形,其中-1表示该维度由 numpy 自动推算(本例即样本数 20)。
第三步:划分训练集与测试集
监督学习必须把数据划分为训练集与"留出"的测试集,前者用于拟合模型,后者用于检验模型的泛化表现。使用model_selection.train_test_split:
X_train, X_test, y_train, y_test = model_selection.train_test_split( situps, waist, test_size=0.33 )test_size=0.33表示约 33% 的数据(约 7 个样本)作为测试集,其余用于训练——与本课糖尿病练习保持一致。由于样本只有 20 个,可考虑适当调大训练比例或使用交叉验证,这可以作为描述段落中"对模型稳健性的思考"加分点。
第四步:训练线性回归模型
model = linear_model.LinearRegression() model.fit(X_train, y_train)model.fit()是几乎贯穿所有主流机器学习库(如 TensorFlow)的统一接口:模型根据训练数据学习出"最佳拟合直线"的系数(斜率与截距),使预测值与实际值之间的整体误差最小。在本课 R 版教程(lesson_1.Rmd)中,对应的 tidymodels 写法是lm_spec %>% fit(y ~ ., data = diabetes_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.xlabel('Situps (count)') plt.ylabel('Waistline') plt.title('Waistline vs Situps') plt.show()用测试集的特征做预测,把真实点(黑色散点)与模型预测线(蓝色直线)画在同一张图上,即可直观判断线性关系是否成立、哪些样本偏离较远。本课糖尿病练习的可视化结果正是这种形式:
本课糖尿病数据集练习的可视化结果,展示了"真实散点 + 回归直线"的标准呈现方式,可迁移到 Linnerud 的"腰围 vs 仰卧起坐"图。
扩展到其他数据点:多目标回归的两条路线
作业任务二要求"对数据集中的其他数据点做同样处理"。Linnerud 的 3 个运动变量(Chins、Situps、Jumps)与 3 个生理目标(Weight、Waist、Pulse)可组成多对关系。处理方式有两种思路:
路线 A:逐对建模(简单、直观,适合描述)对每一对"运动特征 → 生理目标"分别执行上述五步流程,得到 9 个(或按研究需要选定的几组)单变量线性回归模型,逐一描述其斜率方向与拟合效果。优点是与任务一完全同构、易于文字展开;缺点是忽略了目标之间的相关性。
路线 B:多输出回归(一步到位)sklearn的LinearRegression原生支持多目标:当y传入形状为(n_samples, n_targets)的矩阵时,它会为每个目标分别拟合一个模型:
# 一次性建模:3 个运动特征 -> 3 个生理目标 model_multi = linear_model.LinearRegression() model_multi.fit(X, y) # y 形状为 (20, 3) y_pred_multi = model_multi.predict(X)也可以使用sklearn.multioutput.MultiOutputRegressor包装不支持多输出的估计器,把多目标问题分解为多个单目标问题逐一求解。从本课"简单线性回归 vs 多元线性回归"的复习提示(见 README 的 Review & Self Study 部分)可以看出,课程希望学习者主动区分:单变量回归(一个特征)、多元回归(多个特征)与多输出回归(多个目标)是三件不同的事,Linnerud 作业正是练习"多目标"这一维度的契机。
无论选择哪条路线,写进段落里的核心逻辑都应一致:先说明选择了哪些变量组合与建模方向,再给出数据划分与模型训练方式,最后基于可视化结果描述关系的方向(正相关/负相关)、强度与局限性。
如何写出达到"典范"标准的描述性段落
结合评分标准的"典范"档要求,一段好的描述至少应包含以下层次,可作为组织文字的模板:
- 数据集概述:说明 Linnerud 数据集包含 20 名中年男性的 3 个运动变量与 3 个生理变量,是典型的小样本多目标数据。
- 变量与建模方向:明确把仰卧起坐次数作为特征、腰围作为目标,并解释为何选择这个方向(运动量作为解释变量、生理指标作为被解释变量,语义上更自然)。
- 流程陈述:按"加载数据 → 特征整形(
reshape(-1, 1))→train_test_split划分 →LinearRegression().fit()训练 →predict()预测 → 散点图叠加回归线"的顺序,用自然语言串联,不必罗列代码,但要让读者能复现思路。 - 结果解读:描述直线与散点的吻合程度、个别离群样本的可能含义,并强调相关性不等于因果性——即便腰围与仰卧起坐呈现线性趋势,也需要领域知识(健身生理学)辅助判断,而不能仅凭 20 个样本断言因果关系。
- 拓展与反思:说明对 Chins、Jumps 等其余特征与 Weight、Pulse 等其余目标可采取逐对建模或多输出回归,并指出小样本带来的过拟合风险与模型泛化局限。
把以上五层内容组织成一段(或若干段)连贯的文字,即可满足"一段写得好的描述性段落"的典范标准。
相关学习资源
- 本课完整教程 README:环境搭建、notebook 使用、Scikit-learn 入门与糖尿病数据集练习的完整讲解;
- Python 解决方案笔记本:糖尿病数据集线性回归的完整可运行代码与输出;
- R 语言版本教程:使用 tidymodels/parsnip 完成同一练习的对照实现;
- 回归系列 sketchnote:对回归概念的可视化速览;
- 英文版作业原文:与本文对应的英文原始文档。
完成本篇作业后,你不仅掌握了 Linnerud 多目标数据集的建模方法,更具备了把"数据集结构、模型选择、训练流程、结果解读"完整表述出来的能力——这正是后续回归课程(数据可视化、线性回归、逻辑回归)反复复用的一套思维框架。
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考