在机器学习模型训练过程中,过拟合指的是模型在训练集上表现优异,但在未见过的测试集上表现较差的现象,通过绘制训练误差与测试误差随数据量变化的趋势对比折线图,能够直观观察模型是否出现过拟合。当数据量较小时,训练误差会持续下降,而测试误差可能先下降后上升,这种分化趋势就是过拟合的典型特征。

核心概念说明
训练误差是模型在训练数据集上的预测误差,测试误差是模型在独立测试数据集上的预测误差。正常情况下,随着训练数据量的增加,两类误差都会逐渐下降并趋于稳定。如果出现过拟合,训练误差会持续降低甚至接近0,而测试误差会在某个点之后开始上升,两者之间的差距会越来越大。
绘图准备
我们需要准备以下工具和模拟数据:
- Python环境,安装
matplotlib和numpy库 - 模拟不同数据量下的训练误差和测试误差数据
如果未安装相关库,可以通过以下命令安装:
pip install matplotlib numpy
模拟误差数据
我们首先模拟不同数据量下的训练误差和测试误差,实际场景中这些数据可以从模型训练过程中记录得到。
import numpy as np # 模拟数据量,从100到1000,步长50 data_sizes = np.arange(100, 1050, 50) # 模拟训练误差:随数据量增加逐渐下降,最终接近0.1 train_errors = 1 / (data_sizes / 100) + 0.1 + np.random.normal(0, 0.02, len(data_sizes)) # 模拟测试误差:先下降后上升,体现过拟合特征 test_errors = 0.5 / (data_sizes / 200) + 0.2 + np.random.normal(0, 0.03, len(data_sizes)) # 给测试误差添加过拟合后的上升部分 test_errors[10:] += (data_sizes[10:] - data_sizes[10]) * 0.0005
绘制对比折线图
使用matplotlib库绘制两条折线,分别对应训练误差和测试误差,添加坐标轴标签、图例和标题,让图表更易读。
import matplotlib.pyplot as plt
# 设置中文字体,避免中文显示乱码
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制训练误差折线
plt.plot(data_sizes, train_errors, label="训练误差", marker="o", color="blue", linewidth=2)
# 绘制测试误差折线
plt.plot(data_sizes, test_errors, label="测试误差", marker="s", color="orange", linewidth=2)
# 添加坐标轴标签
plt.xlabel("训练数据量")
plt.ylabel("误差值")
# 添加标题
plt.title("训练误差与测试误差随数据量变化趋势对比")
# 添加图例
plt.legend()
# 添加网格线,方便观察数值
plt.grid(True, linestyle="--", alpha=0.7)
# 显示图表
plt.show()
图表解读
运行上述代码后得到的折线图中,蓝色折线代表训练误差,橙色折线代表测试误差。可以看到随着数据量增加,蓝色折线持续下降并趋于平稳,而橙色折线在下降到某个点后开始上升,两者之间的差距逐渐拉大,这就是典型的过拟合表现。我们可以根据这种趋势调整模型参数,比如增加正则化项、减少模型复杂度,来缓解过拟合问题。
实际场景适配
在实际项目中,只需要将模拟数据替换为真实的模型训练记录即可。比如在训练循环里,每个epoch或者每添加一批训练数据后,记录当前训练集和测试集的损失值,将这些损失值作为误差数据传入绘图代码,就能得到对应模型的误差趋势图。
Python过拟合训练误差测试误差matplotlib修改时间:2026-06-11 07:39:14