机器学习基础核心:模型训练流程、三大范式与过拟合欠拟合
帮学生改人工智能课程大作业,看多了代码能跑、指标很高、一问却讲不清楚的案例后,我越发觉得:很多人学机器学习,不是从“它到底要解决什么问题”开始的,而是从“怎么把代码跑起来”开始的。后者当然不算错,但顺序一但没有理顺,后面所有细节都会变成一堆散装概念,期末复习时尤其痛苦。
这篇文章就是把机器学习基础篇里那条主线抽出来讲清楚:它和人工智能是什么关系、一个模型到底怎么被训练出来、有监督无监督分别是什么意思、过拟合和欠拟合是怎么回事,以及学完这些之后课程考试和大作业应该怎么安排。适合三类人读:正在为机器学习期末复习的大学生、要交人工智能大作业却不知从哪下手的新手,还有刷了不少入门视频但始终觉得隔着一层窗户纸的自学者。不涉及太高深的公式推导,但会让你在动手之前,先把地图在脑子里铺开。
1. 先厘清一层关系:机器学习在人工智能里扮演什么角色
很多新手最容易犯的一个错,是把人工智能、机器学习、深度学习这三个词当成同义词混着用。我见过不少项目汇报PPT,把“基于人工智能大作业”写成“用深度学习做了一个机器学习模型”,这个表述其实很乱。要理解机器学习基础篇,第一件事就是把这三层关系摆正。
1.1 人工智能是个大目标,机器学习只是实现路径之一
人工智能是研究“如何让机器完成那些原本需要人类智能才能完成的任务”的领域。它是一个宏大的目标集合,比如让机器会说话、会看、会推理、会规划。而机器学习,是当前实现这个目标最主流的一条路径,核心思想是:不再由人手工编写规则,而是让机器从大量数据中自己归纳规律。
我习惯用一个类比:人工智能像是一个“想考高分的学生”,机器学习是“通过大量刷题、归纳出解题套路”的学习方法。当然,这个学生还有其他打法,比如符号主义、知识图谱、专家系统那一路,相当于靠背教科书和公式去解题。二者没有绝对优劣,但在近十年里,机器学习这条“数据驱动”的打法明显赢在了绝大多数场景上。有朋友问过我agent到底是什么,从一个更宽泛的角度说,agent属于人工智能体系里的一个重要概念,指的是能够感知环境并采取行动的主体,但它在机器学习基础篇里并不是核心,不用被这个概念分散注意力。
1.2 传统编程与机器学习的差别:规则由谁来决定
把传统编程和机器学习放在一起对比,你会发现它们解决问题的方向是反过来的。
传统编程是先有规则,再处理数据,最后出结果。比如写一个垃圾短信过滤程序,你会这样做:判断短信里有没有“中奖”“点击链接”“转账”这些关键词,命中就拦截。程序逻辑很清晰,但它很僵硬——诈骗短信换了说法,你就得继续加规则,规则越堆越长,最终维护成本爆炸。
机器学习的思路完全不同:你收集一万条短信,每条都标注好“垃圾”或“正常”,把这些数据丢给算法;算法自动找出哪些字词组合更容易出现在垃圾短信里,训练完成后你得到的是一个“模型”。这个模型本质上是数据里归纳出来的一套判断规则,只是这套规则复杂到无法用几行if-else写出来而已。更关键的是,当出现新的诈骗话术时,只要重新往标注数据里补充样本、再做一次训练,模型自己就会跟着变化。
从“人写规则”到“机器从数据里学规则”,这个转变解决了现实里大量“规则说不清楚”的任务,比如识别一张照片里是不是猫、判断一段评论是正面还是负面、预测用户明天会不会下单。这些任务中,人类能轻松做出判断,却完全说不出自己依据的精确规则,恰恰是机器学习出手的地方。
1.3 数据、模型、算法三要素里,最被低估的是数据
机器学习体系里有一句老话:模型的上限由数据决定,算法只是逼近这个上限。这句话怎么理解?数据决定了模型能从什么信息里学习,算法只是想办法把这份信息榨干。如果你的数据里根本没有“促销活动”这一条记录,模型再怎么调参也学不会预测促销对销量的影响。反过来,数据足够干净、特征足够丰富,哪怕用最简单的线性回归,效果也可能吊打硬凑出来的深度网络。
所以我在基础篇里会反复强调:不要一上来就迷信复杂模型,先检查你手里的数据。数据里带偏见,模型就学偏见;数据里有脏值,模型就学脏值。很多人以为人工智能“偏见”是模型的错,其实大部分时候是训练数据本身的分布问题——样本本身就不均衡,或者标注时本身就不一致,模型只是忠实地复述了这些偏差。
2. 把一次模型训练拆开看:数据、特征、切分、评估
很多新手在sklearn里跑通fit和predict之后,就以为自己“会训练模型”了。但真正上台面的大作业里,训练只是一小步,完整流程是:数据清洗、特征工程、数据集划分、模型训练、评估调参,最后才是预测。哪一步都不许省。
2.1 进门第一关:数据清洗不是小事
拿到一份原始数据,先别急着喂模型,先干三件事——看形状、看缺失、看分布。首先要看数据的规模和类型,判断每列是数值还是文本,有没有空值。然后处理缺失值,常见做法是直接删除缺失比例过高的行,或者用中位数、均值、众数填补,文本特征可以用“未知”填充。很多新手不假思索地直接drop掉所有含空值的行,结果样本量少了一半,模型自然学不动。
再说异常值,这里最忌一刀切。我见过有同学看到价格字段里出现负值,二话不说全部删掉,结果那其实是原始系统里另一个字段的错误标记,正确做法是找到对应关系修正。反过来,高净值客户的年薪可能是普通人百倍,看起来像异常值,但你把它删了,模型就学不到长尾分布。判断异常值是测量错误还是真实极端情况,一定要结合业务场景,不能只靠统计学。
最后是量纲问题。如果特征里有“年龄”和“年收入”两列,年龄范围是0到100,收入范围可能是0到百万级,那很多基于距离的算法,比如K近邻、SVM、线性回归,就会被数值大的特征完全主导。解决办法是标准化或归一化,把不同尺度拉平到同一量级。这里有个细节:树模型(决策树、随机森林)不受量纲影响,因为它们做的是切分而非距离计算,所以是否需要标准化,取决于你选了什么算法。
2.2 特征工程:把原始字段变成模型听得懂的语言
特征工程说白了,就是想办法让模型从数据里“看到”更多有效信号。原始字段往往不能直接表达规律,需要你人为加工。
举一个常见的例子:预测用户是否会流失。原始数据里有“注册时间”这个时间字段,如果你直接把它当数值喂给模型,模型只能学到一个毫秒级时间戳,基本毫无意义。但如果你把时间戳拆开,衍生出“注册天数”“最近7天是否登录”“平均每天使用时长”,模型立刻就能感知到用户活跃度的差异。这就是特征工程的价值——它不改变算法,但改变了模型能看到的世界。
还有一个很实用的原则:一个特征是否有用,看它能否让“明明是同一类问题的样本”在特征空间里更靠近。判定技巧是先做相关性分析,剔除掉强相关的冗余特征,再用业务直觉尝试交叉特征,比如“人均面积=面积/卧室数”“点击率=点击量/曝光量”。不需要一开始就追求几十个特征,先把信息密度高的核心特征做好,比堆数量更有效。
2.3 数据集的三种切分,相当于考试的“真题/模拟题/考题”
训练集、验证集、测试集这三个概念,是机器学习基础篇里绕不开的考点,但我发现很多人根本没有认真理解它们背后的防作弊思想。可以把训练集当成平时做作业的题目,模型从这些数据里学习;验证集当成考前模拟卷,用来调超参数、选择模型;测试集则是最终高考,只能最后考一次,分数才是真实的模型水平。
| 用途 | 训练集 | 验证集 | 测试集 |
|---|---|---|---|
| 模型是否看到过 | 是,用于学习参数 | 否,但会用于调参 | 否,最后才用一次 |
| 典型占比 | 60%-70% | 15%-20% | 15%-20% |
| 常见操作 | 训练、计算梯度 | 选择超参数、比较模型 | 最终评估性能 |
很多新手只划分训练集和测试集,调参时反复看测试集结果,这等于拿着答案复习,最终“成绩”必然虚高。测试集一旦被反复使用,信息就会泄漏进模型的选择过程,上线后真实性能通常一落千丈,这是数据泄漏最常见的形态。
还有两个容易忽略的细节。一是划分时建议采用分层采样:如果二分类任务的样本类别比例是9:1,那么训练集和测试集里也最好保持9:1,否则可能出现训练集里全是多数类、测试集里全是少数类的极端情况。二是时间序列数据不能随机划分,必须按时间先后切,因为过去预测未来才是真实场景,随机划分等于让模型偷看未来。
2.4 训练评估闭环:损失函数与评价指标
模型训练过程听上去很玄,本质其实很简单:定义一个损失函数来衡量预测和真实答案的差距,然后用优化算法不断调整模型参数,让这个差距越来越小。如果预测房价,损失可以是预测值和真实值差的平方,这叫均方误差;如果是分类任务,常用交叉熵损失。参数学习常靠梯度下降:把损失函数想象成一座山谷,你在山顶往下走,梯度方向是坡度最陡的方向,每一次更新就是往低处迈一步,直到走不动为止。
评估阶段则是另一个容易被忽略的重灾区。讲个最常见的问题:一个“预测明天是否下雨”的模型,如果某地只有2%的日子下雨,那么一个永远预测“不下雨”的“聪明”模型也能拿到98%的准确率——但它是废物。所以准确率并不是唯一标准,尤其是类别不均衡时,要看精确率、召回率、F1值。精确率关注“我预测下雨的日子里有几次真下雨了”,召回率关注“真正下雨的日子里有几次被我抓住了”,你关心哪个,取决于场景:漏报一次洪灾的代价远高于虚报一次。
3. 三类学习任务:只知道监督学习是不够的
机器学习基础篇里的“三大范式”划分,几乎贯穿所有教材和期末考点:有监督学习、无监督学习、强化学习。它们的核心差异在于训练时使用的信号不同,而不是算法名称听起来有多高级。
3.1 有监督学习:给答案的练习册
有监督学习指的是:训练数据里每个样本都带着正确答案(标签),模型需要学习从输入到标签的映射。比如一组学生的出勤率、作业成绩、平时成绩,预测期末会不会挂科,每条样本都有“挂了/没挂”的真实标签。这是目前应用最成熟、也最贴近课程大作业的一类。
子任务分成两种。一种是回归,预测连续值,比如房价、气温、销量;另一种是分类,预测离散类别,比如垃圾邮件判断、用户是否流失。基础篇里常出现的算法有线性回归、逻辑回归、决策树、随机森林、K近邻、朴素贝叶斯、SVM,每一种算法背后的建模假设不同,但在入门阶段你不需要逐个深入原理,先建立“知道它适合处理什么输入输出、有什么优缺点”的意识就赢了。
3.2 无监督学习:没有答案也要找结构
无监督学习训练时根本没有标签,只有一堆数据样本,它要做的是发现数据内部的结构。两个最典型的任务是聚类和降维。
聚类最经典的算法是K-means,它的思路特别直觉:先在数据里随机挑K个“中心点”,把每个样本分给离它最近的中心点,然后重新计算每个簇的中心位置,再重新分配样本,如此反复迭代,直到中心点不再移动。K值怎么选?可以画不同K值下的总距离平方和,找一个明显的拐点,也叫肘部法则。这个算法的缺点是初始中心点选择会影响结果,所以实际中常常要用k-means++来初始化。
降维的代表是PCA,通过找出数据方差最大的投影方向,把高维数据压到更低的维度上。降维的作用不是让你“少看几个字段”,而是可视化高维数据、压缩存储、加快后续算法运行。举个例子,用户画像数据有几百个特征时没法画图,用PCA降到二维平面,就能直观观察用户群体分布。
3.3 强化学习:从环境回报里学策略
强化学习跟前两种有本质区别:它没有静态的数据集,而是让一个智能体在环境里不断尝试动作、获取奖励或惩罚,目标是最大化长期累计奖励。你可以把它理解成“无人监督地自学成才”:下棋输了就调整策略,机器人走路摔了就换姿势。
一个容易被误解的地方是:强化学习不等于“没有标签”,它的标签来自环境反馈,只是这个反馈不是直接告诉模型正确答案,而是告诉它“你这一步做得有多好”。在课程和基础篇里,你只需要能区分清楚:有监督是“给你答案学”、无监督是“没有答案找结构”、强化学习是“边试边学求奖励”。另外,近年大火的半监督学习、自监督学习(预训练)是从另外两个维度对这个体系做的延展,入门阶段知道它们的存在即可。
下表可以把三个范式放在一起对比,考前复盘会非常方便:
| 维度 | 有监督学习 | 无监督学习 | 强化学习 |
|---|---|---|---|
| 训练信号 | 有标注标签 | 无标签 | 环境奖励或惩罚 |
| 典型任务 | 分类、回归 | 聚类、降维 | 游戏、控制、决策 |
| 代表性思路 | 线性模型、树模型 | K-means、PCA | Q-learning、策略梯度 |
| 一句话记忆 | 最小化预测与标签的差 | 找出数据里的分组与结构 | 最大化累积奖励 |
4. 过拟合和欠拟合:模型能力的两条边界
模型训练完,你会立刻遇到两种诡异现象:训练集上表现极好,一到测试集就垮掉;或者训练集上分数就一直上不去。前者是过拟合,后者是欠拟合。这两个概念不仅是期末考点,更是你后续所有调参工作都要围绕的核心矛盾。
4.1 偏差与方差:从物理世界的直觉说起
把偏差和方差想成射箭。欠拟合对应高偏差:每次射箭都偏在同一个方向,离靶心很远,说明你的模型系统性理解错了,太简单,学不动数据里的规律。过拟合对应高方差:箭落点忽东忽西,平均值可能还行,但单次表现极不稳定,说明模型把训练数据里那些“纯粹偶然的噪声”也当成了规律。
训练集上表现差通常意味着欠拟合,也就是模型复杂度不够。比如用一条直线去拟合带明显波动趋势的曲线,无论怎么调权重都无能为力。而训练集分数很高、验证集分数明显下降,就是过拟合的经典信号——模型记住了训练集的个性,而不是共性。
4.2 过拟合长什么样:拿高阶多项式举例
用一个特别直观的例子说明过拟合。假设你手里有20个散点样本,真实规律是一个二次曲线,但你用九次多项式去拟合,结果必然是把每个点都穿过去了,训练集误差几乎为零。可这时候你把新样本拿来预测,预测值会非常离谱,因为九次多项式为了穿过所有点,已经大幅扭曲成波浪形,完全脱离真实的平滑曲线。
决策树也存在同样的问题:如果你不限制树的深度,也不设置叶子节点最小样本数,它就能不断切分直到每个训练样本都落在独立的一片叶子里,训练集准确率拉到100%不是难事。问题是,这样一棵树在新样本上几乎没有泛化能力。所以判断一个模型是否过拟合,有一条非常好用的经验:先看训练损失,再看验证损失,训练损失持续下降而验证损失开始反弹,就赶紧停止增加模型复杂度。
4.3 缓解手段:从简到繁,别一上来就上大模型
面对过拟合,有效手段不少,但重点是顺序。我建议按“代价从小到大”来试,而不是一听过拟合就马上换更复杂的模型。
- 简化模型:降低多项式次数、减少树的深度、限制叶子节点数,用更小的模型容量去交换泛化能力。
- 加正则化:L1正则倾向于把不重要的特征权重压缩成零,L2正则让权重整体变小,通俗讲就是给模型“减负”,不许它过于自信。
- 增加数据:更多样本、数据增强(图像翻转、加噪声等)。数据是最有效的正则化手段,没有之一。
- 早停:训练过程中实时监控验证集损失,一旦验证损失不再下降或开始上升,立刻停止训练。
- 交叉验证:把训练集切成K份,轮流拿其中一份做验证,其余做训练,最终取K次结果的平均。它能降低“某一次数据划分恰好很走运”造成的评估偏差。
有一个坑我必须单独拿出来讲:交叉验证分数不是越高越好,它的真正价值在于稳定性。如果一个模型在第一折上跑到95%,第二折却只有75%,说明它在某些数据分区上完全不稳定,这时候你要担心的不是平均分,而是为什么波动那么大。还有,绝对不要在测试集上反复做特征选择或调参,否则测试集就变成了第二个验证集,最终分数会高得虚假,上线时原形毕露。
5. 从“学过”到“会做”:课程、考试和大作业怎么安排
基础篇说到底要落地到两件事:期末能过、大作业能交明白。我根据带学生和辅导课程的经验,把这块讲透一点。
5.1 先读懂大多数课程的考察逻辑
市面上常见的人工智能导论、机器学习课程,期末考察无非三类:第一类是概念辨析,比如区分监督与无监督、判断过拟合与欠拟合、解释偏差和方差的含义;第二类是算法过程题,比如让你写出K-means的一次迭代步骤、计算决策树的信息增益、用贝叶斯公式求后验概率;第三类是综合设计题,给一个业务场景,让你选择合适的模型并说明理由。
备考资料上,我比较推荐“一本教材+一门视频课”的组合。教材首选周志华的《机器学习》即“西瓜书”,它的公式推导和知识体系非常完整,配合“图解机器学习算法”这类工具书看算法可视化;视频课程我比较推荐吴恩达的经典课程,它对数学基础薄弱的人极度友好。另一个容易被忽略的是平台练习,比如头歌这类在线教学平台,上面有不少和期末题型接近的实操题,考前刷一圈,手感和记忆都会有明显提升。
5.2 大作业和入门项目:一条可以直接照搬的启动路线
很多同学面对“人工智能大作业”时最痛苦的不是不会写代码,而是不知道该做什么、从哪里开始。这里给出一个完整的启动路线,按顺序执行即可。
第一步,选一个表格类的结构化数据集,而不是一上来做图像或文本。经典选项有Kaggle上的泰坦尼克号生存预测、房价预测、经典鸢尾花分类。选表格数据的理由是:它最贴近基础篇所学的内容,不涉及深度学习那些工程复杂度。
第二步,用sklearn写一个最朴素的基线模型。比如逻辑回归,先不看分数,先把整条pipeline跑通:读取数据、划分训练测试集、训练、预测、输出准确率。这个baseline的意义是打个底子,后续所有改动都有参照。
第三步,做一轮特征工程。看看数据集里哪些字段是真正有预测力的,把时间拆开、把类别变量做编码、把数值量纲标准化。
第四步,拿多个模型做对比。逻辑回归、决策树、随机森林、K近邻各跑一遍,用交叉验证比较平均分数,再选最好的模型做超参数调优。
第五步,给结果做分析和可视化,写报告。大作业报告不用堆代码,重点是说明每一步为什么这么选,模型有哪些局限。
这五步走下来,大作业的“过程完整度”已经超过大多数人。记住一个心态:能跑通只是开始,能解释清楚每一步为什么这么做,才是大作业真正想考察的能力。
5.3 三个最常见的学习误区
误区一:觉得数学必须很好才能学机器学习。说实话,入门阶段你真正需要的数学只有求导、矩阵乘法、基本概率论,高中的底子加大学公共课就已经够用了。遇到复杂的推导,要用的时候再针对性地补,不需要一口气学完微积分线代概率统计再动手。
误区二:一上来就研究深度学习和大模型。我理解心情,看到别人用PyTorch跑出图像模型很酷,但深度学习是机器学习的一个子集,背后仍是基础篇里讲的训练闭环。你连训练集测试集划分、过拟合都没吃透,直接上深度网络只会更晕。建议先把传统模型用熟,再进入深度学习的门槛,你会发现自己其实已经站在半山腰了。
误区三:只看不写、只抄不改。机器学习的动手性极强,光看视频没有用,甚至会形成“我已经懂了”的错觉。写代码时一定要自己动手改参数、调特征、观察分数变化,这个过程才是真正建立直觉的路径。最后顺带提一句,人工智能相关岗位的热度这两年一直很高,从人工智能训练师到算法工程师,机器学习基础是这些岗位共同的能力底座。基础不牢,后面面试也好、实际业务也好,都会处处卡壳。
最后分享一个我比较受用的习惯:学任何一个算法之前,先在本子上回答三个问题——输入是什么?输出是什么?训练时它用什么信号来改自己?能答出来,说明你真的懂了;答不出来,就算代码照抄跑通,也只是把别人的结论搬过来。别怕慢,基础篇打牢一点,后面学深度学习和大模型时,你会发现自己越跑越快。