ML-For-Beginners 机器学习技巧篇:构建、评估与维护模型的七步方法论
本篇基于 ML-For-Beginners 课程第 1 周"机器学习技巧(Techniques of Machine Learning)"一课展开。机器学习模型的构建、使用与维护与大多数开发工作流截然不同,本指南将原文档的七步工作流程、特征与目标变量划分、数据集切分、过拟合与欠拟合等核心概念逐一拆解,并结合仓库中的实战 Notebook 代码(训练/测试切分、model.fit、Flask 推理服务)补充源码级佐证。读完后,你将掌握一条从"提出可预测的问题"到"上线推理"的完整可复现路径。
为什么 ML 工作流不同于普通开发
传统开发是"人写规则、程序执行规则",而机器学习是"人准备数据、算法从数据中归纳规则"。这意味着工作流的重心从编写逻辑转移到了:选对问题、备对数据、选对训练方法、量化模型质量、持续调参。本课(对应课程侧边栏中的 Techniques of ML)的目标,就是把这条流程"去神秘化",让你理解支撑机器学习的几个高层过程,以及"模型(models)""预测(predictions)""训练数据(training data)"等基础概念。
总览:创建机器学习流程的七个步骤
原文档将创建 ML 流程(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)。用全新输入检验模型精度。
该问什么问题:规则引擎失效的地方
计算机特别擅长发现数据中的隐藏模式。这一能力对研究者价值很大——当某个领域的问题无法通过搭建"条件式规则引擎"轻松回答时,ML 就登场了。
原文档给出的两个典型例子:
- 精算(保险)场景:数据科学家也许能手工构造"吸烟者 vs 非吸烟者的死亡率"规则;但当更多变量进入公式后,基于既往健康史预测未来死亡率的 ML 模型可能比人工规则更高效。
- 气象预测场景:为某地预测 4 月天气,输入可包括纬度、经度、气候变化、距海远近、急流模式等。变量多到无法穷举人工规则时,模型学模式比人写规则更实际。
从这两个例子可以提炼出一条选问题准则:可预测、有历史数据、且变量关系复杂到规则引擎难以维护,才值得动用 ML。
建模前的任务
在动手建模之前,需要先完成若干任务来验证问题、并基于模型预测形成假设。原文档列出了四类必须识别并配置好的要素:数据、特征与目标、特征变量选择、数据可视化,以及数据集切分。
数据:收集与准备
要带着某种确定性回答问题,需要"足够多"且"类型正确"的数据。这一步包含两个动作:
- 收集数据(Collect data)。课程前一课专门讲了数据分析中的公平性(见 ML and Fairness),收集数据时要牢记该课内容:留意数据来源、数据中可能存在的固有偏见,并记录其出处(provenance)。
- 准备数据(Prepare data)。数据准备包含若干典型动作:
原文档还特别提醒:收集并处理完数据后,花一点时间检查数据的"形状"(结构、分布、字段)是否真的支撑你要回答的问题——数据本身可能就不适合你的任务,这一点在聚类课中会被再次验证。
特征与目标:X 和 y
这是本课最核心的概念划分:
- 特征(feature):数据中可度量的属性。在很多数据集里,特征就是某个列名,如
date、size、color。特征变量在代码中通常记为X,是用于训练模型的输入变量。 - 目标(target):你想要预测的东西,代码中通常记为
y。它对应你向数据提出的问题本身。原文档举了两个问题句式:- "12 月时,什么颜色的南瓜最便宜?"——目标是颜色;
- "在旧金山,哪些街区的房产价格最好?"——目标是价格。
- 目标有时也被称为标签属性(label attribute)。
仓库中的回归 Notebook 正是这一约定的落地。以线性回归示例 Notebook为例,南瓜价格数据集被切分后,X 是特征矩阵、y 是价格标签,随后直接喂给模型:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
lin_reg.fit(X_train, y_train) # 训练:发送 X(特征)与 y(目标)
pred = lin_reg.predict(X_test) # 在测试集上评估
其中 random_state=0 固定随机种子,保证切分结果可复现——这正是"参数控制算法行为"在切分环节的体现。
特征选择与特征提取:两件事,不是一件事
🎓 构建模型时,如何知道该选哪些变量?你通常会经历**特征选择(feature selection)或特征提取(feature extraction)**流程,为模型挑出表现最佳的变量组合。原文档引用了二者定义上的关键区别:
"Feature extraction creates new features from functions of the original features, whereas feature selection returns a subset of the features."(特征提取从原始特征的函数中创建新特征,而特征选择返回特征的子集。)
仓库源码里能观察到这两类操作的不同形态:线性回归 Notebook中使用 make_pipeline(PolynomialFeatures(2), LinearRegression()) 构建流水线——PolynomialFeatures(2) 从原始特征生成交互与平方项,属于"提取"式做法(从原始特征构造新特征);而只从已有列中挑列、丢弃无关列,则属于"选择"式做法。
可视化你的数据
数据科学家工具箱中重要的一环,是用 Seaborn、MatPlotLib 等库把数据画出来。可视化可能帮你:
- 发现可以加以利用的隐藏相关性;
- 发现偏见或数据不平衡——这一点在分类器第一课中会被具体演示(类别样本量不均会直接影响评估指标的可信度)。
切分数据集:训练 / 测试 / 验证
训练之前,需要把数据集切分为两个或多个"大小不等、但都能良好代表数据"的部分:
- 训练集(Training):用于"拟合(fit)"模型的那部分数据,通常构成原始数据集的多数。
- 测试集(Testing):独立的一组数据(常从原始数据中划出),用于确认已构建模型的性能。评估时模型不能见过它。
- 验证集(Validating):更小的一组独立样本,用于调优模型的超参数或架构以提升模型。视数据规模与问题而定,这个第三集合有时可以省略(时间序列预测入门一文中提到,时序场景对切分方式另有讲究)。
仓库里两种切分比例都出现过:工具课 Notebook使用 test_size=0.33(约三分之一的留出比例),而线性回归与逻辑回归示例统一使用 test_size=0.2, random_state=0。这说明"留出 20%–33% 做测试"都是课程认可的常规做法,具体比例可按数据规模调整。
构建模型
使用训练数据,你的目标是用各种算法对一个模型(或称数据的统计表示)进行训练(train)。训练让模型接触数据,允许它对所感知的模式做出假设、验证,然后接受或拒绝这些假设。
决定训练方法
根据你的问题与数据特性选择训练方法。课程使用 Scikit-learn,从其用户指南可以探索多种训练方式。有经验者也可能需要尝试多种方法才能建出最好的模型——典型的迭代过程是:用未见过的数据喂给模型,检查准确率、偏见以及其他降低质量的问题,然后选定最适合当前任务的训练方法。
从源码结构看,同一份切分数据在线性回归 Notebook中被先后用于朴素 LinearRegression() 与 make_pipeline(PolynomialFeatures(2), LinearRegression()) 两条训练路径,正是"尝试多种方法并对比"的实操样例:
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures
pipeline = make_pipeline(PolynomialFeatures(2), LinearRegression())
pipeline.fit(X_train, y_train)
pred = pipeline.predict(X_test)
训练模型:model.fit
拿到训练数据后,就可以"fit(拟合)"出模型。原文档指出,在多数 ML 库中你都会看到 model.fit 这个调用——正是在这一步,你发送特征变量(通常是 X,一个值数组)和目标变量(通常是 y)。上文线性回归示例中的 lin_reg.fit(X_train, y_train) 就是这个动作的直接实例。
评估模型:以及"拟合度"的两个陷阱
训练完成后(训练大模型可能需要很多轮迭代,即"epoch(轮数)"),你可以用测试数据衡量模型质量——测试数据是模型此前从未分析过的原始数据子集,可以打印一张模型质量指标表。
🎓 原文档在此给出了两个关键概念:
- 模型拟合(Model fitting):在 ML 语境下,指模型底层函数在尝试分析其不熟悉的数据时的准确性。
- 欠拟合(Underfitting)与过拟合(Overfitting):这是两种常见的模型质量问题——模型要么"拟合得不够好",要么"拟合得过头":
- 过拟合:模型预测训练数据好得反常,因为它把数据的细节乃至噪声都"学"进去了。
- 欠拟合:模型不准确,既无法准确分析训练数据,也无法分析它尚未见过的数据。
课程为这一节配了一张对比信息图(上方文章头图,来源为 Jen Looper 的信息图,原图见 overfitting.png):对同一组数据,低阶函数欠拟合、适度函数拟合良好、高阶函数则记住噪声而过拟合。判断落在哪一档,靠的就是测试集上的指标与可视化对比。
参数调优:超参数
初始训练完成后,观察模型质量,并考虑通过调整**超参数(hyperparameters)**来改进。超参数是训练前设定、控制算法行为的旋钮(如正则化强度、多项式阶数、树的深度等),与模型自己从数据中学到的内部权重不同。仓库的流水线示例提供了一个最小例:PolynomialFeatures(2) 中的 2 就是一个超参数,把它调成 3 或 4 会直接改变模型的复杂度与测试集表现——调参过程就是围绕这类旋钮反复实验的过程。
预测:把模型送进"应用"场景
这是用完全全新的数据检验模型精度的时刻。在"应用型" ML 场景(为生产环境构建 Web 资产)中,预测流程通常包括:收集用户输入(例如一次按钮点击)→ 将其设为变量 → 发送给模型进行推理(inference)或评估。
仓库中 Web App 示例的 Flask 服务 把这条链完整实现了:服务启动时加载训练好的 pickle 模型,/predict 路由从表单取值、转成数值数组,调用 model.predict 得到国家预测结果:
@app.route("/predict", methods=["POST"])
def predict():
int_features = [int(x) for x in request.form.values()]
final_features = [np.array(int_features)]
prediction = model.predict(final_features)
output = prediction[0]
countries = ["Australia", "Canada", "Germany", "UK", "US"]
return render_template("index.html", prediction_text="Likely country: {}".format(countries[output]))
对照七步流程可以看到:用户点击"预测"按钮(收集输入)→ 组装特征数组(X 的运行时形态)→ model.predict 完成推理。这正是原文档所说的"在应用环境中把变量发送给模型做评估"的最小闭环;配套的 UFO 数据集与模型工件见 ufo-model.pkl。
挑战与练习
原文档为本课布置的实践任务:
- 🚀 挑战:画一张流程图,反映 ML 从业者的完整步骤。你在流程中处于哪一步?预计哪里会困难?哪些部分对你来说看起来简单?
- 课后测验:课程配套的课前/课后测验(Pre/Post-lecture quiz)可在课程站点完成。
- 作业:采访一位数据科学家——在公司、用户社群或同学中找一位以数据科学家为职业的人,写一篇约 500 词的文章描述其日常任务:他是领域专精型,还是"全栈(Full Stack)"型?
小结
本课把 ML 工作流压缩为可操作的清单:提出规则引擎答不了的问题 → 谨慎收集与准备数据 → 明确 X/y → 选择并可视化特征 → 切分训练/测试/验证集 → 用 model.fit 训练 → 用测试集评估并警惕过拟合/欠拟合 → 调超参数 → 用新数据预测。仓库中后续的回归、分类、聚类、Web 应用与时间序列课程,都会在这张清单的某几步上展开实战;理解本节的七步框架,是读懂这些实战代码的前提。
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
