ML-For-Beginners 回归入门实战:用 Python 与 Scikit-learn 搭建环境并构建第一个线性回归模型
本篇基于 ML-For-Beginners 课程回归章节(2-Regression)的第一课《Tools of the trade》,系统讲解如何为本地机器学习任务配置 Python、Visual Studio Code、Jupyter Notebook 与 Scikit-learn 环境,并完整复现课程配套的实战练习:加载 Scikit-learn 内置糖尿病数据集、划分训练/测试集、训练 LinearRegression 模型、调用 predict() 生成预测,最后用 Matplotlib 绘制回归直线。读完后你能够从零搭建课程标准开发环境,并独立完成本课程的第一个回归模型。
课程定位:回归四连课的第一步
ML-For-Beginners 是一个为期 12 周、包含 26 个课程与 52 个测验的经典机器学习课程体系。在 回归章节总览 中,本课(Tools of the trade)是四节回归课中的第一节,后续依次为:
- Tools of the trade(本课:工具与首个模型)
- Managing data(数据管理)
- Linear and polynomial regression(线性与多项式回归)
- Logistic regression(逻辑回归)
该章节以北美南瓜价格走势为区域主题(数据取自美国农业部公开报告),但本课的实战部分使用了 Scikit-learn 内置的糖尿病数据集。本节课程的核心学习目标在原文档中列得很明确,读完本课后你应能:
- 配置电脑以完成本地机器学习任务(Configure your computer for local machine learning tasks);
- 掌握 Jupyter Notebook 的基本工作方式;
- 安装并使用 Scikit-learn;
- 通过动手练习探索线性回归。
本课题目强调的正是“先备齐工具”:在动手构建回归模型之前,先把 Python、VS Code、Jupyter 与 Scikit-learn 这套组合装好。
一、安装与配置:四步搭建本地 ML 环境
原文档给出的安装清单共四步,以下按原顺序完整继承并补充注意事项。
1. 安装 Python
确认电脑上已安装 Python。你会用它完成大量数据科学与机器学习任务,多数电脑系统已自带 Python,也可参考官方的 Python Coding Packs 安装器简化配置。
关键点:不同用途可能需要不同版本的 Python,因此建议使用虚拟环境(virtual environment,标准库 venv)隔离依赖。这是后文安装 Scikit-learn 时同样强调的前提。
2. 安装 Visual Studio Code
确认已安装 Visual Studio Code,并按官方指南完成基础安装。本课程全程在 VS Code 中运行 Python,建议提前熟悉 VS Code 的 Python 开发配置(解释器选择、扩展安装等)。课程文档还推荐通过微软 Learn 上的 Python 模块来巩固基础语法。
3. 安装 Scikit-learn
按 Scikit-learn 官方安装说明安装该库。由于必须使用 Python 3,官方推荐在虚拟环境中安装;如果你使用的是 M1 Mac,官方安装页有专门说明,需要注意架构差异。
4. 安装 Jupyter Notebook
需要安装 PyPI 上的 jupyter 包。后续所有练习都在 Jupyter Notebook 环境中完成。
二、你的 ML 创作环境:Jupyter Notebook
你会用**笔记本(Notebook)**来开发 Python 代码并创建机器学习模型。这类文件是数据科学家的常用工具,可通过其文件扩展名 .ipynb 识别。
Notebook 是一种交互式环境:开发者既可以在其中编写代码,也可以穿插添加注释和文档说明,这对实验性、研究性项目非常有帮助。它与网页开发者的工作环境有明显差异——代码单元格可以独立运行、即时查看输出,而不必整体编译或启动服务。
练习:操作一个 Notebook
在课程目录 2-Regression/1-Tools 下可以找到练习文件 notebook.ipynb(初始为空模板,供你亲手填写;完整带输出的版本见 solution/notebook.ipynb)。操作步骤如下:
-
在 Visual Studio Code 中打开
notebook.ipynb。启动后 Jupyter 服务器会以 Python 3+ 运行。Notebook 中可“运行”的区域就是代码单元格,点击形似播放按钮的图标即可执行。 -
选择
md图标新增一个 Markdown 单元格,输入文本# Welcome to your notebook。接着再新增一个 Python 代码单元格。 -
在代码单元格中输入
print('hello notebook')。 -
点击运行箭头执行代码,应看到输出:
hello notebook
你可以自由地在代码之间穿插 Markdown 注释,让 Notebook 具备自我文档化的能力。
三、上手 Scikit-learn:经典机器学习的标准工具
Python 环境就绪、Notebook 使用熟练之后,本课引入 Scikit-learn(发音按 sci,同 science)。Scikit-learn 提供一套覆盖面很广的 API 来帮你完成各类 ML 任务。按其官方说法:“Scikit-learn 是一个开源机器学习库,支持有监督学习与无监督学习,并提供模型拟合并、数据预处理、模型选择与评估等多种工具。”
课程在此刻意聚焦“传统机器学习”(traditional machine learning)任务:神经网络与深度学习被有意排除在本课之外(课程体系将其留给后续的 AI for Beginners 内容)。Scikit-learn 的特点与本课练习直接相关:
- 让模型构建与评估流程简单直接;
- 主要面向数值型数据;
- 内置多组“玩具数据集”(toy datasets)作为教学工具——本课使用的糖尿病数据集即其一;
- 内置一批可直接尝试的现成模型(estimator),本课将使用其中的
linear_model.LinearRegression。
四、实战:你的第一个 Scikit-learn Notebook
该练习的思路取自 Scikit-learn 官方站点的线性回归示例。
在 notebook.ipynb 中先点击“垃圾桶”图标清空所有单元格,然后按以下步骤逐个单元格输入代码。完整可运行的答案(含每步真实输出)保存在 solution/notebook.ipynb 中,可对照验证。
本节业务背景:假设你想为糖尿病病人测试一种疗法,机器学习模型可以帮助判断哪些患者对疗法反应更好(依据变量的组合)。哪怕一个非常基础的回归模型,只要可视化出来,也能揭示哪些变量值得在(假设的)临床试验中优先组织。
✅ 原文档在这里提醒了一个关键的选型判断:回归方法有很多种,选择哪一种取决于你想得到的答案类型。
- 想根据年龄预测某人可能的身高 → 你要的是一个数值 → 用线性回归;
- 想判断某道菜算不算素食 → 你要的是类别归属 → 用逻辑回归。
本课练习属于前者:预测一个连续数值。
4.1 导入库
本练习需要三个库:
- matplotlib:绘图工具,用于创建折线/散点图;
- numpy:处理 Python 数值数据的常用库;
- sklearn:即 Scikit-learn 库。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model, model_selection
上面从 sklearn 中导入了三个子模块:datasets(内置数据集)、linear_model(线性模型)、model_selection(模型选择,这里用于把数据切分为训练集和测试集)。
4.2 糖尿病数据集
Scikit-learn 内置的糖尿病数据集包含 442 个样本、10 个特征变量,其中课程文档点名的包括:
age:年龄(年)bmi:身体质量指数bp:平均血压s1 tc:T 细胞(一类白细胞)
课程配套的 R 语言版讲义 solution/R/lesson_1.Rmd 中给出了完整的 10 个预测变量清单,可作补充参考:
| 变量 | 含义 |
|---|---|
| age | 年龄(年) |
| sex | 性别 |
| bmi | 身体质量指数 |
| bp | 平均血压 |
| s1 tc | 总血清胆固醇 |
| s2 ldl | 低密度脂蛋白 |
| s3 hdl | 高密度脂蛋白 |
| s4 tch | 总胆固醇 / HDL |
| s5 ltg | 血清甘油三酯水平(可能取对数) |
| s6 glu | 血糖水平 |
而回归目标 y 是:基线后一年疾病进展程度的定量测量值(定量回归目标)。这正是监督学习——需要一个带名称的目标 y。
✅ 原文档还附了一个思考点:该数据集包含“性别”这类二元分类特征,许多医学数据集都有这种变量;想一想这类分组方式可能如何把人群中的某些部分排除在治疗之外——这是模型公平性讨论的一个引子。
4.3 加载数据:X 与 y
在新代码单元格中调用 load_diabetes() 加载数据,参数 return_X_y=True 表示 X 是数据矩阵、y 是回归目标:
X, y = datasets.load_diabetes(return_X_y=True)
print(X.shape)
print(X[0])
返回值是一个元组(tuple),你把元组的前两个值分别赋给了 X 和 y。预期输出(见 solution/notebook.ipynb 中的真实运行结果)为:
(442, 10)
[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
可以看到,数据为 442 行 × 10 列。✅ 思考:线性回归预测的是特征 X 与目标变量 y 之间的关系——对照数据集的目标定义,想一想这组数据实际在演示什么问题。
4.4 选取单一特征并重塑形状
本练习只取第 3 列(即 bmi)来画图。用 : 选择所有行,用索引 2 选择第 3 列;再用 reshape(n_rows, n_columns) 把一维数据重塑为二维数组(绘图与 fit() 都要求二维输入)。参数取 -1 时表示该维度由 NumPy 自动推算:
X = X[:, 2]
X = X.reshape((-1,1))
✅ 随时打印 .shape 检查:选列后 X 形状为 (442,),重塑后为 (442, 1)(与 solution notebook 中记录的真实输出一致)。
4.5 划分训练集与测试集
现在有监督学习的基本操作是切分数据:用一个(通常更大的)子集训练模型,用较小的“保留”子集检验模型表现。Scikit-learn 提供了直接的做法——在指定比例处切分测试数据。课程代码将 33% 的数据划为测试集(即 67% 训练、33% 测试):
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.33)
注意:X 和 y 必须同步切分,保证行与行一一对应,这是后文 数据管理课 会进一步展开的主题。
4.6 训练线性回归模型
加载线性回归模型并用训练集训练。model.fit() 是你在 TensorFlow 等众多 ML 库中都会看到的训练接口:
model = linear_model.LinearRegression()
model.fit(X_train, y_train)
4.7 预测与可视化
用测试数据生成预测值——这条预测线将被用来绘制在模型数据分组之间最“合适”的位置:
y_pred = model.predict(X_test)
最后用 Matplotlib 把数据画出来:黑色散点是全部测试数据(X, y),蓝色粗线是模型预测:
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.xlabel('Scaled BMIs')
plt.ylabel('Disease Progression')
plt.title('A Graph Plot Showing Diabetes Progression Against BMI')
plt.show()
预期效果即为文首的散点图:一条直线穿过大量数据点。✅ 原文档要求你用自己的话解释这件事:这条直线具体在做什么?你如何用它预测一个全新的、未见过的数据点相对于 y 轴的位置?试着把模型的实用意义写成一段文字。
走到这里,你已经完成了自己的第一个线性回归模型:训练了它、用它生成了预测,并把结果画了出来。
五、挑战与配套作业
课程挑战(Challenge)
换一个变量来绘图。提示:修改这一行 X = X[:, 2](例如换成列 0 即 age,或列 9 即 glu)。结合该数据集的目标(一年后疾病进展的定量测量),想一想你能对糖尿病作为一种疾病的进展规律发现什么。
书面作业(Assignment)
课程作业见 assignment.md,题目是:研究 Scikit-learn 内置的 Linnerud 数据集——它来自健身俱乐部 20 位中年男性的数据,含 3 个运动指标(数据)和 3 个体征指标(目标)。作业要求你用自己的语言描述:如何构建一个回归模型来刻画**腰围(waistline)与仰卧起坐数量(situps)**之间的关系,并对数据集中其他数据点做同样的分析。评分标准(Rubric)为三档:提交一段描述性段落(优秀)/ 提交几句话(合格)/ 未提供描述(待改进)。
六、跨语言实现:同一练习的 R 版本
本课同时提供 R 语言版本(原英文文档中以 “This lesson is available in R!” 标注)。从仓库文件看,R 版本基于 tidyverse + Tidymodels 生态,完整流程记录在 solution/R/lesson_1.Rmd(渲染后的网页版为 solution/R/lesson_1.html,Jupyter 版为 solution/R/lesson_1-R.ipynb)。Python 与 R 两条实现路径的对应关系如下,可帮助理解各步骤的“库无关”本质:
| 步骤 | Python(Scikit-learn) | R(Tidymodels) |
|---|---|---|
| 加载数据 | datasets.load_diabetes(return_X_y=True) |
read_table2(...) 从 NCSU 镜像 URL 读取 |
| 选列 | X = X[:, 2] |
diabetes %>% select(c(bmi, y)) |
| 切分 67/33 | model_selection.train_test_split(X, y, test_size=0.33) |
initial_split(prop = 0.67) + training() / testing()(set.seed(2056) 保证可复现) |
| 定义模型 | linear_model.LinearRegression() |
linear_reg() %>% set_engine("lm") %>% set_mode("regression")(parsnip 的 type/engine/mode 三要素) |
| 训练 | model.fit(X_train, y_train) |
lm_spec %>% fit(y ~ ., data = diabetes_train) |
| 预测 | model.predict(X_test) |
lm_mod %>% predict(new_data = diabetes_test) |
| 可视化 | plt.scatter(...) + plt.plot(...) |
ggplot(aes(x = bmi)) + geom_point(...) + geom_line(aes(y = .pred)) |
值得注意的是:R 版本从模型输出中可以直接读到训练学到的系数——“这些系数代表使实际值与预测值之间总体误差最小的最佳拟合直线”。这一点与 Python 版中 LinearRegression() 训练后模型内部存储的 coef_ / intercept_ 是同一数学对象。此外 solution/Julia/README.md 目前仅是一个占位文件(“This is a temporary placeholder”),说明 Julia 版本尚未落地。
多语言讲义的完整镜像也维护在 translations/ 目录下,本课的阿拉伯语版即 translations/ar/2-Regression/1-Tools/README.md,各语言版本(含中文 zh-CN 等 51 种语言目录)均可在 translations 目录 同级找到。
七、回顾与自修
原英文文档的 Review & Self Study 部分给出两个延伸方向,这里同样继承:
- 简单 vs 单变量 vs 多元线性回归:本教程操作的是“单特征对单目标”的简单线性回归(simple linear regression),而非单变量或多项/多元回归(multiple regression)。建议阅读这三者的区别,建立“特征个数 → 模型维度”的直觉,这为后续 线性与多项式回归课 做铺垫。
- 回归能回答什么样的问题:回归刻画的是“变量间关系”,可预测长度、温度、年龄等连续量。结合本课的思考点再梳理一遍:数值预测用线性回归、类别归属用逻辑回归(见 逻辑回归课)。
本课关键结论速查
- 环境四件套:Python(+虚拟环境)、VS Code、Scikit-learn、Jupyter;
.ipynbNotebook 是数据科学的标准创作环境,代码与文档可混排、单元格可独立运行;- 完整的 Scikit-learn 最小工作流:
load_diabetes→ 选列/reshape→train_test_split(test_size=0.33)→LinearRegression().fit()→predict()→ Matplotlib 可视化; - 糖尿病数据集:442 样本 × 10 特征,目标
y为一年后疾病进展的定量测量; - 同一练习存在 Python 与 R(Tidymodels)两套完整实现,接口一一对应,便于跨语言迁移。
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

