机器学习:过拟合与欠拟合是如何被解决的?

简介: 机器学习:过拟合与欠拟合是如何被解决的?

机器学习:过拟合与欠拟合是如何被解决的?

什么是过拟合与欠拟合

机器学习的主要挑战是我们的算法能够在为观测的数据上误差较小,而不是在只在训练集上表现良好,我们这种能力我们称之为泛化
在这里插入图片描述

过拟合

如上右图所示,模型通过训练集很好的拟合了观测数据,训练误差很小,但是由于过度的在训练集上拟合,当其用于推理测试数据时,误差很可能会变大,因为数据是有噪声的并且其本身与真实概率分布也有一定偏差,训练集的概率分布与真实概率分布还是有一定差距的,当模型过度的接近训练集的概率分布,那么他就会随着训练轮数的增加而远离真实的概率分布(这里我们假设测试集复合真实概率分布),以上的情况我们称之为过拟合。

欠拟合

如上左图所示,模型通过训练集拟合的直线不能很好的拟合图中的观测值,训练误差和泛化误差都非常高,我们称之为欠拟合

如何解决过拟合

L2正则化(权重衰减)

谈到正则化,我们继续观察上面过拟合图像,函数过度的复杂了(太弯弯绕了~),我们首先想到的一定是降低他的复杂度,也就是说我们要减少权重参数的维度大小(权重衰减),它的维度决定了图像他有个拐点,大小则决定了图像弯曲程度。那么我们就有了一个想法了💡!
我们从权重衰减的方向入手(也就是参数的大小):
我们让权重参数的二范数小于某个值来约束它。在优化损失函数(以MSE为例)的时候可得如下方程组:

image.png

这里我们根据拉格朗日乘子法 ,可以把在约束内求最值,改成无范围求最值。得到下方方程(lambda为惩罚系数):
image.png

根据梯度下降法($\alpha$为learning rate),我们继续化简:
image.png

我们发现,参数w每回合都在慢慢减少,权重系数减少,也就是对数据与噪声变得不敏感(曲线越平滑,根据泰勒展开可知),相对来讲,也就是降低了数据的拟合程度从而缓解过拟合。

这里我们要注意,其中衰减的参数包含偏置系数b,因为权重系数决定了模型推理结果的方差,而偏置系数决定了偏差,不能缓解过拟合。

代码实现

%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l

n_train, n_test, num_inputs, batch_size = 20, 100, 200,5
true_w, true_b = torch.ones((num_inputs, 1))*0.05, 0.05
train_data = d2l.synthetic_data(true_w, true_b,n_train)
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_train)
test_iter = d2l.load_array(test_data,batch_size, is_train=False)

def init_params():
    w = torch.normal(0,1,size=(num_inputs,1),requires_grad = True)
    b = torch.zeros(1,requires_grad = True)
    return [w,b]
def l2_penalty(w):
    return torch.sum(torch.abs(w))
num_epochs, lr = 1000, 0.003
def train(lambd):
    w,b = init_params()
    net,loss = lambda X : d2l.linreg(X,w,b), d2l.squared_loss
    animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log',
                            xlim=[5, num_epochs], legend=['train', 'test'])
    
    for epoch in range(num_epochs):
        for X,y in train_iter:
            l = loss(net(X),y)+lambd*l2_penalty(w)
            l.sum().backward()
            d2l.sgd([w,b],lr,batch_size)
        if (epoch + 1) % 5 == 0:
            animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss),
                                     d2l.evaluate_loss(net, test_iter, loss)))
    print('w的L2范数是:', torch.norm(w).item())
 train(lambd=1)

降维

剔除掉冗余的特征和比重不大的特征,原因

  1. 采用合适的模型(控制模型的复杂度)

采用合适的模型

过于复杂的模型会带来过拟合问题。对于模型的设计,目前公认的一个深度学习规律"deeper is better"。国内外各种大牛通过实验和竞赛发现,对于CNN来说,层数越多效果越好,但是也更容易产生过拟合,并且计算所耗费的时间也越长。

根据奥卡姆剃刀法则:在同样能够解释已知观测现象的假设中,我们应该挑选“最简单”的那一个。对于模型的设计而言,我们应该选择简单、合适的模型解决复杂的问题。

数据增强

如何解决欠拟合

欠拟合的问题一般出现在训练开始,随着训练的深入,一般此问题会不攻自破,我们一般采用:

  1. 增加模型的复杂度(比如从直线->曲线)。
  2. 增加数据维度(维度数应该远远小于数据的数量,否则可能出现过拟合)。
  3. 增加数据量。
目录
相关文章
|
9月前
|
机器学习/深度学习 数据采集 监控
深度学习中模型训练的过拟合与欠拟合问题
在机器学习和深度学习中,过拟合和欠拟合是影响模型泛化能力的两大常见问题。过拟合指模型在训练数据上表现优异但在新数据上表现差,通常由模型复杂度过高、数据不足或质量差引起;欠拟合则指模型未能充分学习数据中的模式,导致训练和测试数据上的表现都不佳。解决这些问题需要通过调整模型结构、优化算法及数据处理方法来找到平衡点,如使用正则化、Dropout、早停法、数据增强等技术防止过拟合,增加模型复杂度和特征选择以避免欠拟合,从而提升模型的泛化性能。
|
机器学习/深度学习 算法
【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
本文介绍了如何通过观察训练误差和验证误差来判断模型是否出现过拟合或欠拟合,并提供了相应的解决方案,包括增加数据、调整模型复杂度、使用正则化技术等。
1348 1
|
11月前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的过拟合现象及其解决方案
在机器学习领域,过拟合是一个常见且棘手的问题,它发生在模型过于复杂以至于捕捉到训练数据中的噪声而非信号时。本文将深入探讨过拟合的原因、影响以及如何通过技术手段有效缓解这一问题,旨在为读者提供一个全面而实用的指南。
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
1552 3
|
机器学习/深度学习 算法 数据挖掘
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
机器学习入门(二):如何构建机器学习模型,机器学习的三要素,欠拟合,过拟合
|
11月前
|
机器学习/深度学习
深入理解机器学习中的过拟合与正则化
深入理解机器学习中的过拟合与正则化
|
机器学习/深度学习 算法 API
【机器学习】正则化,欠拟合与过拟合(详细代码与图片演示!助你迅速拿下!!!)
【机器学习】正则化,欠拟合与过拟合(详细代码与图片演示!助你迅速拿下!!!)
|
11天前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
5月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
|
11月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1101 6