ML-For-Beginners:机器学习全流程技术拆解——从数据准备、特征工程到模型训练、评估与预测
本文基于 ML-For-Beginners 课程第 1 章第 4 课 Techniques of Machine Learning 展开,系统梳理经典机器学习(ML)从"提出问题"到"预测"的完整技术流程:数据收集与准备、特征(feature)与目标(target)的划分、特征选择与特征提取的区别、数据集切分、模型训练(fit)、评估与过拟合/欠拟合的识别、超参数调优,以及生产环境的预测环节。读完后你将掌握一套可复用的 ML 工程方法论,并能对照本仓库后续的回归、分类、聚类等课程中真实运行的 Scikit-learn 代码,把每个步骤落地为可复制的实操。
机器学习模型从构建、使用到维护的完整流程,与传统软件开发的工作流差异很大。本课的目标是"祛魅"(demystify)这一过程,并给出你作为 ML 学习者必须掌握的核心技术清单。完成本课学习后,你应当能够:
- 从高层理解支撑机器学习的各个过程(processes);
- 掌握"模型(model)""预测(predictions)""训练数据(training data)"等基础概念。
机器学习的七步流程:全景图
文档将"打造 ML 流程的工艺"(the craft of creating ML processes)概括为七个步骤。这是全篇的方法论骨架,后续章节逐一展开:
- 确定问题(Decide on the question)。大多数 ML 流程始于一个无法用简单的条件分支程序或基于规则的引擎回答的问题。这类问题通常围绕"基于一组数据做出预测"展开。
- 收集并准备数据(Collect and prepare data)。要回答问题,你首先需要数据。数据的质量、有时还有数量,决定了你能多大程度上回答最初的问题。数据可视化是这一阶段的重要环节;该阶段还包括把数据切分为训练集与测试集,以用于构建模型。
- 选择训练方法(Choose a training method)。取决于你的问题和数据特性,你需要选择一种训练模型的方法,使模型最好地反映数据并做出准确预测。这是 ML 流程中最需要专门技术专长、也往往需要大量实验的部分。
- 训练模型(Train the model)。使用训练数据和各种算法,让模型识别数据中的模式。模型可能会借助内部权重(internal weights),通过调整权重让某些部分的数据比其他部分更重要,从而构建更好的模型。
- 评估模型(Evaluate the model)。使用从未见过的数据(即测试数据)来检验模型表现。
- 参数调优(Parameter tuning)。根据模型表现,你可以换用不同的参数(控制训练算法行为的变量)重跑流程。
- 预测(Predict)。用全新的输入测试模型的准确性。
这七步不是"一次性"流水线:第 3、4、5、6 步在实践中会形成反复迭代的循环,直到模型质量满足业务需求。
问对问题:什么任务适合机器学习
计算机尤其擅长发现数据中的隐藏模式(hidden patterns)。这一能力对研究者价值巨大——当领域问题无法通过构造条件式规则引擎(conditionally-based rules engine)轻松回答时,ML 就派上用场。
文档给出了一个精算场景的对比:
- 规则引擎可行:针对某项精算任务,数据科学家可能围绕"吸烟者与非吸烟者的死亡率"手工构造规则;
- ML 模型更优:但当更多变量(如过往健康史)被引入等式后,用 ML 模型基于历史健康数据预测未来死亡率可能更高效。
文档还举了一个更"轻松"的例子:基于经纬度、气候变化、距海洋的距离、急流(jet stream)模式等数据,预测某地 4 月份的天气。这里的关键判断标准是——当变量众多、规则难以穷举、且目标是"从历史数据推断未来取值"时,ML 通常比手写规则更可行。这也正是后续课程全部实验(南瓜价格回归、菜系分类、歌曲聚类)的共同前提。
构建模型前的任务:数据、特征与目标
文档强调,在开始构建模型之前,为了"用模型预测来检验问题并形成假设",你必须先识别并配置好若干要素。
数据的收集与准备
要有一定把握地回答问题,你需要足够数量、正确类型的数据。文档把这一阶段拆为两件事:
1. 收集数据(Collect data)。带着上一课"数据公平性"的视角,谨慎地收集数据:关注数据来源、数据可能携带的固有偏见,并记录(document)其出处。
2. 准备数据(Prepare data)。数据准备包含若干子步骤:
- 整理与归一化:数据若来自多个异构来源,可能需要汇总(collate)并归一化(normalize);
- 提升质量与数量:可以通过多种方法改进数据,例如把字符串转换为数字(本课程的 聚类课程 就做了这件事),也可以基于原始数据生成新数据(分类课程 中就有这种操作);
- 清洗与编辑:比如为 Web App 课程 做准备前所做的数据清洗;
- 随机化与打乱(randomize and shuffle):视具体训练技术而定,有时需要打乱数据顺序。
文档还提醒了一个务实的检查点:完成收集与处理后,先看看数据的"形状"(shape)能否支撑你原本想问的问题。数据可能在你的任务上表现不佳——聚类课程 中就有这样的发现。
特征(Feature)与目标(Target)
这两个术语是 ML 数据建模的基本词汇,文档的定义如下:
- 特征(feature):数据的一个可测量属性(measurable property)。在许多数据集中,它表现为列标题,如
date、size、color。特征变量在代码中通常表示为X,它是用来训练模型的输入变量。 - 目标(target):你想预测的东西。目标变量通常表示为
y,代表你向数据提出的那个问题的答案——例如"12 月份什么颜色的南瓜最便宜?""旧金山哪些街区的房价价格最好?"目标有时也被称为"标签属性"(label attribute)。
这一 X → y 的抽象贯穿后续所有课程。可以直接在本仓库的线性回归解决方案 notebook 中看到它的落地形态,位于 notebook.ipynb:
X = pie_pumpkins['DayOfYear'].to_numpy().reshape(-1, 1) # 特征:一年中的第几天
y = pie_pumpkins['Price'] # 目标:南瓜价格
特征选择 vs 特征提取:两件事不是一回事
选哪个变量进入模型,通常要经过**特征选择(feature selection)或特征提取(feature extraction)**的过程,以获得表现最好的模型。文档特别指出二者并不相同,并给出了权威定义:
"特征提取通过原始特征的函数创建新特征,而特征选择返回的是一组特征的子集。"
换句话说:
| 技术 | 做法 | 结果 |
|---|---|---|
| 特征选择(feature selection) | 从原始特征中挑选子集 | 特征数量减少,特征含义不变 |
| 特征提取(feature extraction) | 由原始特征的函数生成新特征 | 产生全新特征(可能降维或变换) |
在仓库代码中两者都能找到影子:分类课程的数据文件 经过清洗后生成了 ingredient_indexes.csv,这就是"由原始特征派生新特征"的典型例子;而回归课中只从南瓜数据里挑选 Month/DayOfYear/Price 等列,则更接近特征选择的思路。
数据可视化:数据科学家工具箱的核心
文档将"可视化数据"列为数据科学家工具箱中的重要能力,并点名了两个优秀库:Seaborn 和 MatPlotLib。可视化的价值在于:
- 帮助你发现可以利用的隐藏相关性(hidden correlations);
- 帮助你发现偏见或不均衡的数据——分类课程的分类器 1 小节 中就发现了这类问题。
在回归课程的解决方案 notebook 中,可视化被用于直接观察"月份—价格"与"年内第几天—价格"的散点关系,正是"可视化先行、建模在后"这一方法论的体现:
import matplotlib.pyplot as plt
plt.scatter('Month', 'Price', data=new_pumpkins)
plt.scatter('DayOfYear', 'Price', data=new_pumpkins)
数据集切分:训练集、测试集与验证集
训练之前,需要把数据集切成两个或多个大小不等的部分,且每个部分仍要能良好地代表整体数据。文档定义了三类子集:
- 训练集(Training):用于"拟合"(fit)模型的那部分数据,构成原始数据集的大多数。
- 测试集(Testing):一个独立的数据组,通常从原始数据中划分而来,用于确认已构建模型的表现。
- 验证集(Validating):一组更小的独立示例,用于调优模型的超参数或架构以提升模型。注意:视数据规模与问题而定,你未必需要构建这第三个集合——文档特意提到这一点在 时间序列预测课程 中也有说明(时间序列数据往往不能随意打乱切分)。
仓库中的实际切分代码印证了这一操作(线性回归解决方案):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
这里 test_size=0.2 表示 20% 的数据留出作测试集、80% 用于训练——正是文档所说"大小不等且代表性良好"的切分;random_state=0 固定随机种子,保证切分可复现。这是 Scikit-learn 中最常用的切分 API,后续回归、分类课程的 solution 中反复出现。
构建模型:训练、拟合与评估
拿到训练数据后,目标是利用各种算法训练出一个模型,即数据的统计表征(statistical representation)。训练(training)的过程是让模型接触数据,允许它对"感知到的模式"做出假设,并验证、接受或拒绝这些模式。
确定训练方法
训练方法的选择取决于两个变量:你的问题,以及数据的性质。文档建议读者翻查本课程使用的 Scikit-learn 官方文档,其中提供了多种训练模型的途径。文档还点破了这个环节的诚实之处:根据经验不同,你可能需要尝试好几种方法才能构建出最好的模型。典型的数据科学家工作流是——给模型喂入未见过的数据 → 检查准确性、偏见及其他降低质量的问题 → 为当前任务挑选最合适的训练方法。
这一"先试错、再评估"的思路在仓库中有完整案例:南瓜价格任务先用 LinearRegression 做基线,发现线性拟合不够理想后,再用多项式管线改进:
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train, y_train)
PolynomialFeatures(2) 生成二阶多项式特征,再交给线性回归——这就是"更换训练方法"的一个具体形态,也是前文"特征提取"思想在建模环节的应用。
训练模型:fit 的含义
文档指出,在多数 ML 库中你会看到 model.fit 这样的代码——正是在这一步,你把特征变量(X,通常是一个数组)和目标变量(y)"送进"模型,让它与数据拟合:
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)
fit 是 Scikit-learn 生态中"训练"的统一入口,无论底层是线性回归、逻辑回归还是分类器,调用形态一致。这也是文档把 X/y 的表示约定放在"特征与目标"一节的原因:它们直接对应 fit(X, y) 的两个参数。
评估模型:用未见过的数据说话
训练完成后(训练一个大模型可能需要许多次迭代,即"epochs"),你可以用测试数据评估模型质量——这些数据是模型此前从未分析过的原始数据的子集,你可以打印出一张关于模型质量的指标表。仓库中的评估代码展示了完整的"预测 → 误差 → 判定"链路(线性回归解决方案):
from sklearn.metrics import mean_squared_error
import numpy as np
pred = lin_reg.predict(X_test)
mse = np.sqrt(mean_squared_error(y_test, pred))
print(f'Mean error: {mse:3.3} ({mse/np.mean(pred)*100:3.3}%)')
score = lin_reg.score(X_train, y_train)
print('Model determination: ', score)
这里体现了评估的两个层次:mean_squared_error 给出针对测试集的量化误差(课程中对其取平方根并换算成百分比),而 score 给出模型对数据的整体判定分数。
模型拟合、过拟合与欠拟合
文档给出了几个关键概念的界定:
- 模型拟合(Model fitting):在机器学习的语境下,指模型底层函数在尝试分析它不熟悉的数据时的准确度。
- 欠拟合(Underfitting)与过拟合(Overfitting):是两种常见的、会劣化模型质量的问题——模型要么拟合得不够好,要么拟合得"太好"。
文档对两者的界定非常清晰:
- 过拟合:模型对训练数据预测得"太好了",因为它把数据的细节乃至噪声都学了进去;
- 欠拟合:模型不准确,因为它既无法准确分析训练数据,也无法分析它尚未"见过"的数据。
图中展示了数据量、模型复杂度与训练/验证误差之间的权衡关系,直观解释了"拟合不足"与"拟合过度"两个失效方向。
从仓库的南瓜回归实验可以推断出识别这两种问题的一条实用路径:线性基线模型与二阶多项式模型的误差对比(见 线性回归课程 README 中的迭代过程),正是"当前拟合不足 → 增加模型表达力 → 重新评估"的教科书式循环。
超参数调优(Parameter Tuning)
文档将这一步浓缩为一句话:初始训练完成后,观察模型质量,考虑通过调整其"超参数"(hyperparameters)来改进模型。
结合前文的方法论可以这样理解各层级的变量:
- 参数(parameters):模型从数据中学到的量(如回归系数),不需要手动设置;
- 超参数(hyperparameters):训练之前由人设定、控制训练算法行为的变量(文档第 6 步的"redo the process using different parameters"指的就是这一类)。
仓库代码本身就是超参数调节的实例:切分比例 test_size=0.2、随机种子 random_state=0、多项式阶数 PolynomialFeatures(2),都属于这类"改变算法行为"的设定。调优的完整闭环是:改变一个或多个超参数 → 用训练集重新 fit → 用测试集重新评估 → 比较指标决定是否保留。时间序列课程(1-Introduction)进一步展示了在数据不能打乱的约束下,如何设计切分与调参流程。
预测:从评估走向应用
文档指出,这是"用完全新的数据测试模型准确性"的时刻。在"应用型(applied)"ML 场景中——即你正在构建要在生产环境使用模型的 Web 资产——这个流程可能涉及:收集用户输入(例如一次按钮点击)→ 用它设置一个变量 → 把该变量发给模型做**推理(inference)**或评估。
仓库中的最小示例展示了单点预测的形态(线性回归解决方案):
# 预测"程序员节"(第 256 天)的南瓜价格
lin_reg.predict([[256]])
注意输入 [[256]] 的形状:这是一个二维数组,与训练时 reshape(-1, 1) 的特征形状保持一致——这是文档强调"特征变量是一组值的数组"在实际代码里的具体体现。Web App 课程 则把 predict 进一步封装进 Web 服务,完成"用户输入 → 模型推理 → 返回结果"的完整生产链路。
本课小结与实战检查单
对照本文梳理的七步流程,可以提炼出一份可自查的 ML 工程检查单,也是你开始本课程后续实验(线性回归、逻辑回归、分类、聚类 等空白 notebook)前的预习框架:
| 步骤 | 核心动作 | 仓库中的对应实践 |
|---|---|---|
| 1. 确定问题 | 问题是否规则引擎无法回答、是否围绕预测 | 南瓜价格、菜系分类、歌曲聚类等课程选题 |
| 2. 数据准备 | 收集、清洗、归一化、生成新特征、打乱 | 4-Classification/data 中的原始与清洗后数据对比 |
| 3. 特征与目标 | 明确 X 与 y,做特征选择/提取 |
DayOfYear → Price 的 X/y 拆分 |
| 4. 切分数据 | 训练/测试(必要时验证集) | train_test_split(..., test_size=0.2, random_state=0) |
| 5. 训练方法 | 选定算法,必要时多法实验 | LinearRegression → make_pipeline(PolynomialFeatures(2), ...) |
| 6. 训练与评估 | fit 后在未见数据上评估 |
predict + mean_squared_error + score |
| 7. 调参与预测 | 调超参数、对新输入做推理 | lin_reg.predict([[256]]),Web App 生产链路 |
文档最后给出的课堂挑战(Challenge)是:画一张反映 ML 实践者步骤的流程图,并回答——你现在处于流程的哪个位置?你预计在哪里遇到困难?哪些部分对你来说比较容易?配套的 作业 则要求你采访一位数据科学家,了解其日常工作究竟是"专精某一环节"还是"全栈"地覆盖上述全流程——这正是本课标题 "Techniques of Machine Learning" 的落脚点:技术(techniques)不只是 API 调用,而是一整套可复现、可评估、可持续迭代的工作方法。
延伸阅读:本仓库中的相关课程
- 1-Introduction 章节总览:ML 入门四课(入门、历史、公平性、技术)的入口;
- 2-Regression:线性/逻辑回归,本文代码示例的主要来源;
- 4-Classification:分类算法与数据不平衡处理;
- 5-Clustering:无监督聚类与数据可视化;
- 7-TimeSeries:时间序列场景下的切分与验证集取舍。
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 StartedRust0624
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
