15 机器学习小白教程系列:模型评估之过拟合与欠拟合
系列进度
机器学习入门 · 第 15 / 21 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
过拟合是模型把训练集记得太细,欠拟合是模型连基本规律都没学到。判断时要同时看训练集和验证集表现。
我会画训练分数和验证分数曲线。两条线之间的距离,往往比单个准确率更能说明问题。
在上一篇教程中,我们讨论了模型评估的重要性,以及如何使用交叉验证来确保我们的模型具有良好的泛化能力。在本篇中,我们将深入探讨两个关键概念:过拟合(Overfitting)和欠拟合(Underfitting)。这两者的问题会直接影响我们的模型在未知数据上的表现,因此理解它们是每一个机器学习小白必须掌握的技能。
过拟合与欠拟合的定义
-
过拟合(Overfitting):当模型在训练数据上表现得非常好,但在测试数据上表现不佳时,就发生了过拟合。过拟合通常是由于模型复杂度过高,或者训练数据量不足,导致模型学习到了训练数据中的
噪声和细节。 -
欠拟合(Underfitting):当模型在训练数据和测试数据上都表现不佳时,就发生了欠拟合。欠拟合通常是由于模型复杂度过低,无法捕捉数据中的
潜在模式。
过拟合与欠拟合的图示
通常,我们可以通过模型的学习曲线来观察过拟合和欠拟合的现象:
- 过拟合:在训练曲线中,训练损失迅速降低,但验证损失在某一点后开始上升。
- 欠拟合:在训练和验证损失都很高且处于相近的水平。
这里是一个简单的示意图,以帮助理解这两个概念:
损失
|
| . .
| . .
| . .
| . .
| . .
| . .
|. .
|--------------------------> 训练轮次
- 过拟合:训练损失急剧下降,而验证损失在某一阶段开始上升。
- 欠拟合:训练损失和验证损失都保持在高水平。
如何检测过拟合与欠拟合
要检测模型的过拟合或欠拟合,可以采用以下几种方法:
- 交叉验证:如上一篇中提到的,交叉验证可以帮助我们更好地理解模型在不同数据子集上的表现。
- 学习曲线:通过绘制学习曲线,我们可以观察到模型的训练损失与验证损失之间的关系,从而判断模型是否过拟合或欠拟合。
- 评估指标:使用如
精度、召回率、F1分数等指标来评估模型的性能。
解决过拟合与欠拟合的方法
解决过拟合的方法
- 减少模型复杂度:选择一个更简单的模型,或者使用
正则化技术,如L1或L2正则化。
排查机器学习过拟合与欠拟合时,先比较训练误差、验证误差、特征数量、正则化和学习曲线。
from sklearn.linear_model import Ridge
model = Ridge(alpha=1.0) # 使用L2正则化
- 增加训练数据:获取更多的训练数据,可以帮助模型更好地泛化。
- 使用
Dropout:在神经网络中,可以使用Dropout层来随机丢弃部分神经元,从而减少过拟合风险。 - 提早停止:在训练过程中监控验证损失并提早停止训练。
解决欠拟合的方法
-
增加模型复杂度:选择更复杂的模型,或者增加特征数量。
from sklearn.tree import DecisionTreeRegressor model = DecisionTreeRegressor(max_depth=None) # 不限制树的深度 -
相应的数据预处理:确保特征经过适当的预处理,如
标准化或归一化。 -
特征工程:创造新的特征,或者尝试非线性模型(如多项式回归)。
代码示例:过拟合与欠拟合实例
下面是一个简单的例子,通过使用sklearn库来展示过拟合和欠拟合的概念。我们将使用决策树回归模型来拟合数据:
《机器学习小白教程系列:模型评估之过拟合与欠拟合》可以按“场景、概念、动作、结果”来读。先把这四件事对齐,再回到正文里的参数、代码或流程。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
# 生成数据
X = np.sort(np.random.rand(100))
y = np.sin(2 * np.pi * X) + np.random.normal(0, 0.1, X.shape)
# 切分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 训练一个过拟合模型
model_overfit = DecisionTreeRegressor(max_depth=5)
model_overfit.fit(X_train.reshape(-1, 1), y_train)
# 训练一个欠拟合模型
model_underfit = DecisionTreeRegressor(max_depth=1)
model_underfit.fit(X_train.reshape(-1, 1), y_train)
# 预测
y_pred_overfit = model_overfit.predict(X_test.reshape(-1, 1))
y_pred_underfit = model_underfit.predict(X_test.reshape(-1, 1))
# 绘制结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.scatter(X_test, y_test, color='black')
plt.scatter(X_test, y_pred_overfit, color='red')
plt.title('Overfitting Model')
plt.subplot(1, 2, 2)
plt.scatter(X_test, y_test, color='black')
plt.scatter(X_test, y_pred_underfit, color='blue')
plt.title('Underfitting Model')
plt.show()
在这个示例中,我们生成了一些数据并通过决策树模型实现了过拟合与欠拟合的例子。你应该会看到,红色的点代表过拟合模型的预测,它在训练数据上表现良好,但在测试数据上表现不好,而蓝色的点代表欠拟合模型的预测,它在两者上都表现不佳。
如果《机器学习小白教程系列:模型评估之过拟合与欠拟合》还没完全消化,可以从这张卡片的四个动作重新走一遍。
回看《机器学习小白教程系列:模型评估之过拟合与欠拟合》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。
总结
在本篇教程中,我们探讨了过拟合和欠拟合的概念,这是模型评估中的关键点。通过理解这些概念,我们可以有效地调整和优化我们的机器学习模型,以便在实际应用中取得更好的表现。在下一篇中,我们将介绍一个实际项目,帮助你巩固并应用所学的知识。
希望本篇内容对你理解模型的评估能力有所帮助!
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
机器学习小白教程系列:模型评估之过拟合与欠拟合适合谁读?
这是 机器学习入门 系列第 15 / 21 篇,适合正在学习机器学习入门,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇机器学习入门教程要多久?
按中文技术文章阅读速度估算,通读大约 4 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读