Ch04 机器学习修订于 二〇二六年七月二日

4.5 过拟合和欠拟合

你花了三天三夜背了 100 道课后习题的全部答案。考试时,试卷原封不动地出了这 100 道题——你得满分。但下一次考试换了一套新题,你一道都不会。过拟合(Overfitting)就是这个意思:模型把训练数据的细节和噪声都记下来了,但并没有学到真正通用的规律 1。

反过来,欠拟合(Underfitting)则是你根本没怎么学——考试时连背过的题都做不对,换新题更不行。模型太简单,连训练数据里的基本规律都抓不住。

这是机器学习中最核心的一对矛盾。理解它们,你才能理解为什么需要验证集、为什么需要正则化、为什么更多数据通常更好。本节从偏差-方差的数学本质出发,再给出检测和解决的实际方法。相关理论基础见 集成学习 (Ensemble Learning) 中的偏差-方差分解,以及 第5章 · 模型评估与特征工程 中的交叉验证。

偏差和方差:从数学上理解这一对矛盾

要真正理解过拟合和欠拟合,需要引入两个统计学概念:偏差(Bias)和方差(Variance)2。

偏差衡量的是:模型的平均预测离真实答案有多远。偏差大意味着模型的结构性假设就是错的——不管用多少数据训练,它都学不到真相。偏差大 = 欠拟合。

方差衡量的是:如果换一批训练数据,模型的预测结果会变多少。方差大意味着模型太敏感——训练数据里的一点点随机波动,都会大幅改变它学到的函数。方差大 = 过拟合。

用一个打靶的比方来理解:

  • 低偏差 + 低方差:子弹全部密集命中靶心。理想的模型。
  • 低偏差 + 高方差:子弹散布在靶心周围,但不集中。每次训练得到的结果都不一样——过拟合。
  • 高偏差 + 低方差:子弹全部集中,但打在靶子左边的墙壁上。每次训练都很稳定,但稳定地错——欠拟合。
  • 高偏差 + 高方差:子弹到处乱飞,而且远离靶心。最差的情况。

在数学上,一个回归模型的泛化误差可以分解为三项之和 3:

不可约误差是数据本身的噪声——比如测量误差、人类标注时的随机失误。这部分任何模型都无法消除,是我们能逼近但永远达不到的性能上限。

偏差和方差通常是一对跷跷板:降低一个就会升高另一个。简单的模型(如线性回归)偏差高但方差低——它稳定但可能不够灵活。复杂的模型(如深度神经网络)偏差低但方差高——它能拟合几乎任何模式,但容易把噪声也学进去 4。

过拟合:记笔记但不理解

过拟合发生时的典型症状:

  • 训练集上误差极低,甚至接近于零。
  • 验证集或测试集上误差远高于训练误差,两者之间有一个大缺口(gap)。
  • 模型对训练数据中的噪声极度敏感——换一组训练数据,学到的函数完全不一样。

为什么会过拟合?几个常见原因:

  1. 模型太复杂:参数数量远多于训练样本数量。一个 1000 个参数的模型去拟合 100 个数据点,它可以完美穿过每一个点——但不是因为学到了规律,而是因为它有足够多的自由度去”作弊”。
  2. 数据太少:尤其是数据不够多样。训练数据只有夏天的气温数据,到冬天就完全猜不准。
  3. 特征太多:每个特征都可能成为模型”投机取巧”的入口。比如你给模型 1000 个特征但只训练了 500 个样本,模型可以从这 1000 个特征里找出刚好能区分 500 个样本的组合,但这套组合在新数据上毫无意义。
  4. 数据有噪声:标注错误、测量误差等。过拟合的模型会把这些噪声也当作规律学进去。
  5. 训练太久:在训练集上反复迭代过多轮,误差持续下降——但验证集误差开始上升。

打个比方:你在准备一场问答比赛。过拟合的做法是把题库中所有题目的答案原封不动背下来——遇到题库里的一字不差能答对,但问题稍微换种问法就抓瞎。好的模型(合适拟合)是理解了知识本身,不管怎么问都能答出来。

欠拟合:压根没怎么学

欠拟合发生时的典型症状:

  • 训练集上误差就很高。
  • 验证集上误差也很高,而且和训练集上的误差差不多(没有 gap)。
  • 增加更多训练数据几乎不改善效果——模型的能力上限本身就不够。

为什么会欠拟合?常见原因:

  1. 模型太简单:用一条直线去拟合一个 U 形曲线的数据——怎么画都画不像,因为它根本没有”弯折”的能力。
  2. 特征不够:你用来训练的数据中缺少关键信息。比如你要预测房价,但没有把”地理位置”纳入特征——模型再怎么努力也学不出好结果,因为最重要的信息根本没给它。
  3. 正则化太强:为了防止过拟合,惩罚系数设得太大,把模型有用的参数也压得太狠了。
  4. 训练不够:还没等到模型收敛就提前停了。

打个比方:欠拟合就像让你只用”是/否”两个选项去描述一个人的性格——你缺失的信息太多了,不管怎么努力都描述不清楚。

怎么判断问题出在哪

判断模型是过拟合还是欠拟合,最直接的方法是看学习曲线(Learning Curve)——横轴是训练样本数或训练轮数,纵轴是误差,画两条线:一条训练集误差,一条验证集误差 5。

症状训练误差验证误差两者差距结论
两者都高,差距小高高小欠拟合
训练低,验证高很低高大过拟合
两者都低,差距小低低小合适拟合(理想)

解决过拟合

过拟合的根源是模型记住了不该记的细节。解决思路有两条路:要么减少模型能记的信息量(约束模型),要么增加数据让它没空记噪声。

方法一:更多数据。 这是最根本、效果最好的方法。数据多了,噪声就”平均化”了,模型被迫去学更通用的规律而不是死记硬背。如果收集不到更多真实数据,可以人工生成——图像领域的数据增强(随机裁剪、翻转、调色)就是一种数据扩充手段 6。

方法二:简化模型。 减少层数、减少参数、减少特征——让模型”记不住”那么多细节。对于决策树,限制最大深度(max_depth)和叶子节点的最少样本数(min_samples_leaf)就是做这件事 7。

方法三:正则化。 在损失函数里加一项惩罚——模型参数越大,惩罚越重。这迫使模型”学会用更小的参数去解释数据”,相当于告诉模型:“你当然可以学复杂规律,但每复杂一点,你得先证明它值得。” L1 正则化(Lasso)能把不重要的特征权重压成 0,自动做特征选择。L2 正则化(Ridge)把所有权重都往 0 的方向压,防止某个参数独大 8。

方法四:早停。 训练时盯着验证集误差——一旦它开始上升(或连续 N 轮不下降),立刻停止训练,取验证误差最小时的参数。相当于在”训练刚好够,还没开始过拟合”的时刻喊停 9。

方法五:Dropout。 训练时每次随机”关掉”一部分神经元(比如 20%-50%),相当于每次训练的都是一个稍微不同的网络。这迫使网络不依赖任何单一的神经元路径,每个神经元都必须学到真正有用的东西 10。Dropout 在深度学习中几乎是标配,你会在 第6章 · 神经网络基础 中遇到它。

方法六:集成学习。 训练多个模型,然后把它们的预测结果投票或取平均。单个模型可能过拟合——但这个模型记错的东西和另一个模型记错的不一样,平均之后就互相抵消了。随机森林(Bagging + 决策树)就是这个思路的经典代表 11。

方法七:交叉验证。 把数据分成 K 份,每次用 K-1 份训练、1 份验证,轮换 K 次。这能更准确地估计模型的泛化能力,帮你在过拟合还没发生时就发现 12。

解决欠拟合

欠拟合的根源是模型抓不住数据的规律。解决思路是增加模型的灵活度或改善输入。

方法一:换更复杂的模型。 线性回归欠拟合 -> 试试多项式回归。决策树欠拟合 -> 增加树的深度。浅层网络欠拟合 -> 加深网络。但注意不要一步跳到极端复杂——从一个合理的基础模型(baseline)开始,逐步加复杂度观察验证集表现。

方法二:加更多特征。 有时候不是模型不够强,而是给它的信息不够。房价预测里没有”地理位置”特征,再怎么训练都欠拟合——问题出在特征上,不是出在模型上。特征工程(创造新特征、组合现有特征)是解决欠拟合最被低估的方法 13。

方法三:减少正则化。 如果正则化参数设得太大,先把正则化系数调小,再观察验证集。

方法四:多训练几轮。 模型可能还没收敛就被停了。延长训练时间,观察误差曲线是否还在下降。

实践中的关键建议

  1. 永远从简单模型开始。 拿到数据先用线性回归或决策树跑一个 baseline,建立”这个任务大概多难”的直觉。复杂模型不是越早上越好——如果简单模型就严重过拟合,说明你数据太少;如果简单模型就严重欠拟合,说明你信息不够。

  2. 划分验证集。 不要用训练集来评估模型——就像不能让学生自己批改自己的考卷。用单独切出的验证集(训练时模型没见过的那部分数据)来监控过拟合。这一步不是可选项,是必修步骤 14。

  3. 过拟合不是一定不好。 在深度学习里,有些”过参数化”的模型(参数数量远超训练样本数)反而泛化得更好——这是”良性过拟合”(Benign Overfitting),是现代深度学习的反直觉现象之一 15。但作为新手,还是先按经典原则来——在你能解释为什么”过参数化反而更好”之前,把过拟合当作问题来对待。

  4. 优先看数据,再看模型。 大部分 ML 问题不是模型不够好,而是数据不够好。缺数据 -> 考虑过拟合。特征没选对 -> 考虑欠拟合。拿到烂结果,第一反应不应该是换更复杂的模型,而是回去看数据。


上一节:4.3 五个必知算法 | 下一节:4.6 2026年:经典ML vs 深度学习的选型

注释

  1. Goodfellow, Bengio & Courville, “Deep Learning”, MIT Press, 2016, Chapter 5 ↩

  2. Hastie, Tibshirani & Friedman, “The Elements of Statistical Learning”, 2009, Chapter 7 ↩

  3. Bishop, “Pattern Recognition and Machine Learning”, 2006, Chapter 3 ↩

  4. 详见 偏差与方差 (Bias-Variance Tradeoff) ↩

  5. 详见 学习曲线 ↩

  6. Shorten & Khoshgoftaar, “A survey on Image Data Augmentation for Deep Learning”, Journal of Big Data, 2019 ↩

  7. 见 深挖-决策树 中的剪枝部分 ↩

  8. 详见 正则化 ↩

  9. Prechelt, “Early Stopping — But When?”, Neural Networks: Tricks of the Trade, 1998 ↩

  10. Srivastava et al., “Dropout: A Simple Way to Prevent Neural Networks from Overfitting”, JMLR, 2014 ↩

  11. 见 集成学习 (Ensemble Learning) 和 Bagging (Bootstrap Aggregating) ↩

  12. 详见 交叉验证 ↩

  13. 见 特征工程 ↩

  14. 详见 数据划分 ↩

  15. Belkin et al., “Reconciling modern machine-learning practice and the classical bias-variance trade-off”, PNAS, 2019 ↩

关联11

知识图谱

局部图谱 · 点节点跳转