8-3 过拟合和欠拟合

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(666)
x = np.random.uniform(-3.0,3.0,size=100)
X = x.reshape(-1,1)
y = 0.5 * x ** 2 + x + 2 + np.random.normal(0,1,size=100)

plt.scatter(x,y)
plt.show()

输出图片:在这里插入图片描述
使用线性回归

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(X,y)
lin_reg.score(X,y)
输出:0.4953707811865009

y_predict = lin_reg.predict(X)
plt.scatter(x,y)
plt.plot(np.sort(x),y_predict[np.argsort(x)],color='r')
plt.show()

输出图片:
在这里插入图片描述

from sklearn.metrics import mean_squared_error#使用均方误差来进行衡量

y_predict = lin_reg.predict(X)#我们训练出来的模型LinearRegression对于X的预测结果
mean_squared_error(y,y_predict)#使用线性拟合最终得到的均方误差
输出:3.0750025765636577

用直线来拟合数据,显然没有很好的反应原始数据的样本特征,这种情况叫做欠拟合
在这里插入图片描述

使用多项式回归

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
​
def PolymialRegression(degree):
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),
        ("std_scaler",StandardScaler()),
        ("lin_reg",LinearRegression())
    ])
    
poly2_reg = PolymialRegression(degree=2)
poly2_reg.fit(X,y)

Pipeline(steps=[('poly', PolynomialFeatures()),
                ('std_scaler', StandardScaler()),
                ('lin_reg', LinearRegression())])
y2_predict = poly2_reg.predict(X)
mean_squared_error(y,y2_predict)

输出:1.0987392142417856

plt.scatter(x,y)
plt.plot(np.sort(x),y10_predict[np.argsort(x)],color='r')
plt.show()

输出图片:
在这里插入图片描述
将degree的值放大再来看结果:

poly100_reg = PolymialRegression(degree=100)
poly100_reg.fit(X,y)
y100_predict = poly100_reg.predict(X)
mean_squared_error(y,y100_predict)
输出:0.6870911922673567

plt.scatter(x,y)
plt.plot(np.sort(x),y100_predict[np.argsort(x)],color='r')
plt.show()

输出图片:
在这里插入图片描述

X_plot = np.linspace(-3,3,100).reshape(100,1)
y_plot = poly100_reg.predict(X_plot)

plt.scatter(x,y)
plt.plot(X_plot[:,0],y_plot,color='r')
plt.axis([-3,3,-1,10])
plt.show()

输出结果:在这里插入图片描述
虽然均方误差变得越来越小,但是该曲线为了拟合我们给定的所有的样本点而变得太过复杂了,这种情况叫做过拟合
在这里插入图片描述

### YOLOv8 中的过拟合拟合 #### 过拟合的表现及原因 在YOLOv8模型训练期间,如果发现模型在训练集上的表现非常好但在验证集或测试集上效果差,则表明发生了过拟合现象。这可能是由于模型过度适应了训练数据中的细节噪音,而未能泛化到未见过的数据。当训练数据集中存在一些样本标签被错误标注的情况时,最小化这些样本上的损失函数也会导致过拟合的发生[^2]。 #### 拟合的表现及原因 对于YOLOv8而言,若模型既不能很好地拟合训练数据也不能有效预测新数据,则说明出现了拟合状况。这种情况通常是由于所选架构过于简单不足以表达复杂的特征映射关系所致;或者是训练时间不够充分使得权重更新不完全等原因引起[^3]。 #### 针对过拟合的解决方案 - **正则化**:可以通过向损失函数中加入L1/L2范数惩罚项的方式抑制参数过大带来的影响,从而减少过拟合风险。此外还可以尝试标签平滑(Label Smoothing)技术,在输出层的真实分布基础上增加少量随机扰动以增强鲁棒性。 - **对抗训练**:该方法旨在通过构建对抗样本来提高模型抵御异常输入的能力,进而缓解因特定模式而导致的过拟合问题。 - **早停法(Early Stopping)**:监控验证集上的性能指标并适时终止训练过程,避免继续迭代造成进一步偏差累积。 - **数据扩增(Data Augmentation)**:通过对原始图像实施旋转、缩放等变换操作扩充可用素材量级,有助于降低依赖于单一视角造成的局限性。 ```python import torch.nn as nn class RegularizedModel(nn.Module): def __init__(self, base_model): super(RegularizedModel, self).__init__() self.base_model = base_model def forward(self, x): output = self.base_model(x) return output def apply_label_smoothing(true_labels, epsilon=0.1): num_classes = true_labels.shape[-1] smoothed_labels = (1 - epsilon) * true_labels + epsilon / num_classes return smoothed_labels ``` #### 应对拟合的方法 - **加深网络层次/扩展宽度**:适当增大卷积核数目以及堆叠更多残差模块可赋予更强表征能力给定任务所需复杂度匹配。 - **延长训练周期**:确保有足够的epoch次数让梯度下降算法找到全局最优解附近区域而非局部极小值点停留太久。 - **优化初始化策略**:良好的权值初设能加快收敛速率同时避开不良鞍点陷阱。 - **调整激活函数类型**:有时更换Leaky ReLU或其他变体代替标准ReLU单元会带来意想不到的效果改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值