过拟合与欠拟合:原因分析及解决方法(代码示例)

发布时间:2026/10/23 1:55:06
过拟合与欠拟合:原因分析及解决方法(代码示例) 在神经网络的训练过程中过拟合和欠拟合是两个常见且影响模型性能的重要问题。理解它们产生的原因以及掌握相应的解决方法对于提升模型的表现至关重要。接下来我们就深入探讨过拟合和欠拟合的相关内容并通过Python代码进行演示。目录过拟合和欠拟合的原因过拟合的原因欠拟合的原因解决过拟合和欠拟合问题的方法解决过拟合的方法解决欠拟合的方法代码演示过拟合和欠拟合的现象总结过拟合和欠拟合的原因过拟合的原因过拟合指的是模型在训练数据上表现非常好但在未见过的测试数据上表现很差。简单来说就是模型过度学习了训练数据中的细节和噪声把一些偶然的特征也当成了普遍规律。模型复杂度高如果模型的参数过多、层数过深它就有更强的能力去拟合训练数据中的每一个样本。例如在一个神经网络中如果隐藏层的神经元数量过多模型就可能会记住训练数据中的所有细节而不是学习到数据的本质特征。训练数据量小当训练数据较少时模型很容易就把训练数据中的特殊情况当成普遍规律。比如只使用了少量的图片来训练一个图像分类模型模型可能就会对这些图片的一些独特特征过度敏感而无法泛化到其他图片上。欠拟合的原因欠拟合则是指模型在训练数据和测试数据上的表现都不理想。这意味着模型没有足够的能力去学习数据中的模式和规律。模型复杂度低如果模型过于简单它就无法捕捉到数据中的复杂特征。例如使用一个线性模型去拟合非线性的数据模型就无法准确地描述数据的变化趋势。训练不足如果训练的轮数太少模型可能还没有充分学习到数据的特征就停止训练了。比如在训练一个神经网络时只进行了几轮的训练模型可能还没有收敛到一个较好的状态。解决过拟合和欠拟合问题的方法解决过拟合的方法正则化正则化是一种常用的防止过拟合的方法它通过在损失函数中添加一个正则化项来限制模型的复杂度。常见的正则化方法有L1和L2正则化。L1正则化会使模型的一些参数变为零从而达到特征选择的目的L2正则化则会使模型的参数变小避免参数过大。在Python中可以使用keras库来实现正则化示例代码如下fromtensorflow.kerasimportregularizersfromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportDense modelSequential()model.add(Dense(64,activationrelu,kernel_regularizerregularizers.l2(0.01),input_shape(input_dim,)))model.add(Dense(1,activationsigmoid))数据增强数据增强是指通过对原始数据进行一些变换来生成更多的训练数据。例如在图像数据中可以对图像进行旋转、翻转、缩放等操作。在keras中可以使用ImageDataGenerator来实现图像数据的增强示例代码如下fromtensorflow.keras.preprocessing.imageimportImageDataGenerator datagenImageDataGenerator(rotation_range20,width_shift_range0.2,height_shift_range0.2,shear_range0.2,zoom_range0.2,horizontal_flipTrue,fill_modenearest)提前停止提前停止是指在训练过程中当模型在验证集上的性能不再提升时就停止训练。这样可以避免模型过度训练。在keras中可以使用EarlyStopping回调函数来实现提前停止示例代码如下fromtensorflow.keras.callbacksimportEarlyStopping early_stoppingEarlyStopping(monitorval_loss,patience10)model.fit(X_train,y_train,epochs100,validation_data(X_val,y_val),callbacks[early_stopping])解决欠拟合的方法增加模型复杂度可以通过增加模型的层数、神经元数量等方式来提高模型的复杂度。例如在一个神经网络中可以增加隐藏层的数量或者每个隐藏层的神经元数量。增加训练轮数让模型有更多的时间去学习数据中的特征。可以通过增加fit函数中的epochs参数来实现示例代码如下model.fit(X_train,y_train,epochs100)代码演示过拟合和欠拟合的现象以下是一个使用keras库来演示过拟合和欠拟合现象的完整代码示例importnumpyasnpimportmatplotlib.pyplotaspltfromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportDensefromtensorflow.keras.optimizersimportAdam# 生成一些模拟数据np.random.seed(0)Xnp.linspace(-1,1,100)yX**2np.random.normal(0,0.1,100)# 划分训练集和测试集X_trainX[:80]y_trainy[:80]X_testX[80:]y_testy[80:]# 过拟合模型model_overfitSequential()model_overfit.add(Dense(100,activationrelu,input_shape(1,)))model_overfit.add(Dense(100,activationrelu))model_overfit.add(Dense(1))model_overfit.compile(optimizerAdam(learning_rate0.01),lossmse)# 欠拟合模型model_underfitSequential()model_underfit.add(Dense(1,input_shape(1,)))model_underfit.compile(optimizerAdam(learning_rate0.01),lossmse)# 训练模型history_overfitmodel_overfit.fit(X_train,y_train,epochs200,validation_data(X_test,y_test),verbose0)history_underfitmodel_underfit.fit(X_train,y_train,epochs200,validation_data(X_test,y_test),verbose0)# 绘制损失曲线plt.figure(figsize(12,6))plt.subplot(1,2,1)plt.plot(history_overfit.history[loss],labelTraining Loss)plt.plot(history_overfit.history[val_loss],labelValidation Loss)plt.title(Overfitting)plt.xlabel(Epochs)plt.ylabel(Loss)plt.legend()plt.subplot(1,2,2)plt.plot(history_underfit.history[loss],labelTraining Loss)plt.plot(history_underfit.history[val_loss],labelValidation Loss)plt.title(Underfitting)plt.xlabel(Epochs)plt.ylabel(Loss)plt.legend()plt.show()在上述代码中我们首先生成了一些模拟数据然后分别构建了一个过拟合模型和一个欠拟合模型。通过训练这两个模型并绘制它们的训练损失和验证损失曲线我们可以直观地看到过拟合和欠拟合的现象。总结通过以上的分析和代码演示我们了解了过拟合和欠拟合的原因以及相应的解决方法。识别和解决过拟合与欠拟合问题对于提升神经网络模型的性能至关重要。掌握了这些内容后下一节我们将深入学习神经网络的评估指标进一步完善对本章神经网络的训练与评估主题的认知。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询