深入python机器学习中的过拟合与欠拟合

举报
tea_year 发表于 2025/10/28 11:10:55 2025/10/28
【摘要】 在机器学习中,模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示,详细解析过拟合与欠拟合现象,并提出应对策略。主要内容如下:什么是过拟合和欠拟合? 如何防止过拟合和欠拟合? 出现过拟合或欠拟合时怎么办? 使用代码和图像辅助理解。一、什么是过拟合和欠拟合?1.1过拟合(Overfitting)定义:过拟合就是模型“学得太多了”,它不仅学会了数据中的规律,还...

在机器学习中,模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示,详细解析过拟合与欠拟合现象,并提出应对策略。主要内容如下:


什么是过拟合和欠拟合? 如何防止过拟合和欠拟合? 出现过拟合或欠拟合时怎么办? 使用代码和图像辅助理解。

一、什么是过拟合和欠拟合?

1.1过拟合(Overfitting)

定义:过拟合就是模型“学得太多了”,它不仅学会了数据中的规律,还把噪声和细节当成规律记住了。这就好比一个学生在考试前死记硬背了答案,但稍微换一道题就不会了。

过拟合的表现:

训练集表现非常好:训练数据上的准确率高,误差低。 测试集表现很差:新数据上的准确率低,误差大。 模型太复杂:比如使用了不必要的高阶多项式或过深的神经网络。

1.2 欠拟合(Underfitting)

欠拟合是什么?

欠拟合就是模型“学得太少了”。它只掌握了最基本的规律,无法捕获数据中的复杂模式。这就像一个学生只学到了皮毛,考试的时候连最简单的题都答不对。

欠拟合的表现:

训练集和测试集表现都很差:无论新数据还是老数据,模型都表现不好。 模型太简单:比如使用了线性模型拟合非线性数据,或者训练时间不足。

二、如何防止过拟合和欠拟合?

2.1 防止过拟合的方法

  1. 获取更多数据

更多的数据可以帮助模型更好地学习数据的真实分布,减少对训练数据细节的依赖。

  1. 正则化

正则化通过惩罚模型的复杂度,让模型不容易“过拟合”。

代码语言:javascript
代码运行次数:0
运行

代码解释

from sklearn.linear_model import Ridge  # L2正则化
model = Ridge(alpha=0.1)  # alpha控制正则化强度
  1. 降低模型复杂度

简化模型,比如减少神经网络层数或多项式的阶数。

  1. 早停法(Early Stopping)

在模型训练时,监控验证集的误差,如果误差开始上升,提前停止训练。

代码语言:javascript
代码运行次数:0
运行

代码解释

from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5)
  1. 数据增强(Data Augmentation)

在图像分类任务中,通过旋转、裁剪、翻转等方法增加数据的多样性,提升模型的泛化能力。

2.2 防止欠拟合的方法

  1. 增加模型复杂度

增加模型的参数,比如更多的神经元或更深的网络层。

  1. 延长训练时间

欠拟合可能是因为训练时间不够长,模型没有学到足够的规律。

3。 优化特征工程

如果模型无法拟合数据,可能是因为输入的特征不够好。尝试创建更多、更有意义的特征。

  1. 降低正则化强度

正则化强度过大可能限制了模型的学习能力,适当减小正则化系数。

三、过拟合与欠拟合时怎么办? 当你发现模型出现问题时,可以通过以下策略调整:

现象

解决方法

过拟合

- 获取更多数据- 使用正则化- 降低模型复杂度- 使用早停法

欠拟合

- 增加模型复杂度- 延长训练时间- 改善特征质量- 减小正则化强度

三、代码与图像演示:多项式拟合的例子

下面通过一个简单的例子,用多项式拟合来直观感受过拟合与欠拟合。

3.1 数据生成 我们生成一个非线性数据集,并可视化:

代码语言:javascript
代码运行次数:0
运行

代码解释

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为 SimHei,显示中文
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 生成非线性数据
np.random.seed(42)  # 设置随机种子,保证结果可复现
X = np.random.rand(100, 1) * 6 - 3  # X范围[-3, 3]
y = 0.5 * X**3 - X**2 + 2 + np.random.randn(100, 1) * 2  # 非线性关系并添加噪声

# 可视化数据
plt.scatter(X, y, color='blue', alpha=0.7, label='数据')  # 绘制散点图
plt.xlabel("X")  # 设置X轴标签
plt.ylabel("y")  # 设置Y轴标签
plt.title("生成的非线性数据")  # 设置图表标题
plt.legend()  # 显示图例
plt.show()  # 显示图表

结果图: 生成的数据呈现一个明显的非线性分布。

3.2 模型训练与可视化

我们训练三种模型: 线性回归(1阶):欠拟合。 4阶多项式回归:最佳拟合。 10阶多项式回归:过拟合。

过拟合和欠拟合的本质
其本质是模型不合适,导致其无法对数据实现有效的预测。

具体来说:

训练数据    预测数据
欠拟合    不准确    不准确
过拟合    准确    不准确
好模型    准确    准确
欠拟合不论是训练数据还是预测出的数据都不准确;好模型就是都准确;过拟合会让训练数据的正确率大于等于好模型,造成过拟合的结果更好的假象,但是一旦用过拟合的模型去预测数据准确率就会低下,因为过拟合的模型失去了通用性。

欠拟合非常好判断,但是过拟合不容易判断,这篇文章的重点就在于解决过拟合问题。

3.1.3. 过拟合出现的原因和解决方案
原因:

模型结构过于复杂(维度过高)
使用了过多的属性,训练数据包含了干扰项信息
解决方案:

简化模型结构(使用低阶模型,比如线性模型,但也不要低到欠拟合)
对数据进行预处理,保留主成分信息(PCA降维)
在训练模型时,增加正则化项(regulation)
前面两个解决方案都在之前的文章中介绍过了,我们着重介绍正则化项。

3.1.4. 正则化项
我们先回忆一下在线性回归理论中提到的计算损失的平方误差和(Sum of Squared Errors, SSE)函数:

 

我们要做的就是为它增加正则化处理项:

在λ\lambdaλ取最大值的情况下,可以约束θ\thetaθ的取值,由此有效控制各个属性数据的影响。

可以看到λ\lambdaλ越大θ\thetaθ的影响值越小,越趋进0。

四、总结

4.1 过拟合与欠拟合的核心区别

过拟合:模型对训练数据“学得太死”,测试数据表现很差。 欠拟合:模型对数据“学得太少”,训练和测试表现都不好。

4.2 防止方法

防止过拟合:使用正则化、数据增强、早停等方法。 防止欠拟合:增加模型复杂度、延长训练时间、优化特征。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。