深入python机器学习中的过拟合与欠拟合
在机器学习中,模型的表现很大程度上取决于我们如何平衡“过拟合”和“欠拟合”。本文通过理论介绍和代码演示,详细解析过拟合与欠拟合现象,并提出应对策略。主要内容如下:
什么是过拟合和欠拟合? 如何防止过拟合和欠拟合? 出现过拟合或欠拟合时怎么办? 使用代码和图像辅助理解。
一、什么是过拟合和欠拟合?
1.1过拟合(Overfitting)
定义:过拟合就是模型“学得太多了”,它不仅学会了数据中的规律,还把噪声和细节当成规律记住了。这就好比一个学生在考试前死记硬背了答案,但稍微换一道题就不会了。
过拟合的表现:
训练集表现非常好:训练数据上的准确率高,误差低。 测试集表现很差:新数据上的准确率低,误差大。 模型太复杂:比如使用了不必要的高阶多项式或过深的神经网络。
1.2 欠拟合(Underfitting)
欠拟合是什么?
欠拟合就是模型“学得太少了”。它只掌握了最基本的规律,无法捕获数据中的复杂模式。这就像一个学生只学到了皮毛,考试的时候连最简单的题都答不对。
欠拟合的表现:
训练集和测试集表现都很差:无论新数据还是老数据,模型都表现不好。 模型太简单:比如使用了线性模型拟合非线性数据,或者训练时间不足。
二、如何防止过拟合和欠拟合?
2.1 防止过拟合的方法
- 获取更多数据
更多的数据可以帮助模型更好地学习数据的真实分布,减少对训练数据细节的依赖。
- 正则化
正则化通过惩罚模型的复杂度,让模型不容易“过拟合”。
from sklearn.linear_model import Ridge # L2正则化
model = Ridge(alpha=0.1) # alpha控制正则化强度
- 降低模型复杂度
简化模型,比如减少神经网络层数或多项式的阶数。
- 早停法(Early Stopping)
在模型训练时,监控验证集的误差,如果误差开始上升,提前停止训练。
from keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5)
- 数据增强(Data Augmentation)
在图像分类任务中,通过旋转、裁剪、翻转等方法增加数据的多样性,提升模型的泛化能力。
2.2 防止欠拟合的方法
- 增加模型复杂度
增加模型的参数,比如更多的神经元或更深的网络层。
- 延长训练时间
欠拟合可能是因为训练时间不够长,模型没有学到足够的规律。
3。 优化特征工程
如果模型无法拟合数据,可能是因为输入的特征不够好。尝试创建更多、更有意义的特征。
- 降低正则化强度
正则化强度过大可能限制了模型的学习能力,适当减小正则化系数。
三、过拟合与欠拟合时怎么办? 当你发现模型出现问题时,可以通过以下策略调整:
|
现象 |
解决方法 |
|---|---|
|
过拟合 |
- 获取更多数据- 使用正则化- 降低模型复杂度- 使用早停法 |
|
欠拟合 |
- 增加模型复杂度- 延长训练时间- 改善特征质量- 减小正则化强度 |
三、代码与图像演示:多项式拟合的例子
下面通过一个简单的例子,用多项式拟合来直观感受过拟合与欠拟合。
3.1 数据生成 我们生成一个非线性数据集,并可视化:
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 防止方法
防止过拟合:使用正则化、数据增强、早停等方法。 防止欠拟合:增加模型复杂度、延长训练时间、优化特征。
- 点赞
- 收藏
- 关注作者
评论(0)