首页 > 其他分享 >模型选择、过拟合和欠拟合

模型选择、过拟合和欠拟合

时间:2023-08-06 16:47:49浏览次数:34  
标签:features 训练 模型 labels 选择 train 拟合

训练误差和泛化误差

  • 训练误差:模型在训练数据上的误差
  • 泛化误差:模型在新数据上的误差

例子:根据摸考成绩来预测未来考试分数

  • 在过去的考试中表现很好(训练误差)不代表未来考试一定会好(泛化误差)
  • 学生A通过背书在摸考中拿到很好成绩
  • 学生B知道答案后面的原因

类似地,考虑⼀个简单地使用查表法来回答问题的模型。如果允许的输入集合是离散的并且相当小,那么也许在查看许多训练样本后,该方法将执行得很好。但当这个模型面对从未见过的例子时,它表现的可能比随机猜测好不到哪去。这是因为输入空间太大了,远远不可能记住每⼀个可能的输入所对应的答案。例如,考虑28 × 28的灰度图像。如果每个像素可以取256个灰度值中的⼀个,则有\(256^{784}\)个可能的图像。这意味着指甲大小的低分辨率灰度图像的数量比宇宙中的原子要多得多。即使我们可能遇到这样的数据,我们也不可能存储整个查找表。

验证数据集和测试数据集

原则上,在我们确定所有的超参数之前,我们不希望用到测试集。如果我们在模型选择过程中使用测试数据,可能会有过拟合测试数据的风险。因此,我们决不能依靠测试数据进行模型选择。然而,我们也不能仅仅依靠训练数据来选择模型,因为我们无法估计训练数据的泛化误差。
解决此问题的常见做法是将我们的数据分成三份,除了训练和测试数据集之外,还增加⼀个验证数据集(validation dataset),也叫验证集(validation set)
所以,综上所述:

  • 验证数据集:一个用来评估模型好坏的数据集
    ·  例如拿出50%的训练数据
    ·  不要跟训练数据混在一起(常犯错误)
  • 测试数据集:只用一次的数据集。例如
    ·  未来的考试
    ·  我出价的房子的实际成交价
    ·  用在Kaggle私有排行榜中的数据集

K折交叉验证

当训练数据稀缺时,我们甚至可能无法提供足够的数据来构成⼀个合适的验证集。这个问题的一个流行的解决方案是采用K折交叉验证。 这里,原始训练数据被分成K个不重叠的子集。然后执行K次模型训练和验证,每次在K−1个子集上进行训练,并在剩余的一个子集(在该轮中没有用于训练的子集)上进行验证。最后,通过对K次实验的结果取平均来估计训练和验证误差。

K-则交叉验证主要使用在没有足够多的数据时,
image

过拟合和欠拟合

欠拟合:当模型训练误差和验证误差都很严重,但是它们之间仅有一点差距,也就是模型在训练集和验证集上表现都不好但是训练误差和测试误差差距很小的时候。

过拟合:当训练集误差明显低于测试集误差的时候,也就是模型在训练集表现的明显比测试集上好的多。 注意,过拟合并不总是一件坏事。特别是在深度学习领域,众所周知,最好的预测模型在训练数据上的表现往往比在保留(验证)数据上好得多。是否过拟合或欠拟合可能取决于模型复杂性和可用训练数据集的大小。
image
我们看这个图,当数据比较简单,我们模型也比较简单的时候它是正常的,但是当模型比较简单,我们的数据比较复杂的时候就会欠拟合。当数据和模型都比较复杂的时候比较正常,但是当数据比较简单,我们的模型比较复杂的时候很容易过拟合。正如下面这张图:
image

模型容量

·拟合各种函数的能力
·低容量的模型难以拟合训练数据
·高容量的模型可以记住所有的训练数据

下面是模型复杂度对欠拟合和过拟合的影响:
image

估计模型容量

  • 难以在不同的种类算法之间比较
    ·  例如数模型和神经网络
  • 给定一个模型种类,将有两个主要因素
    · 参数的个数(就是W,B个数)
    ·  参数值的选择范围

另⼀个重要因素是数据集的大小。训练数据集中的样本越少,我们就越有可能(且更严重地)过拟合。随着训练数据量的增加,泛化误差通常会减小。

多项式回归

import math
import numpy as np
import torch
from torch import nn
from d2l import torch as d2l
  • 生成数据集

给定x,我们将使用以下三阶多项式来生成训练和测试数据的标签:
image
噪声项ϵ服从均值为0且标准差为0.1的正态分布。在优化的过程中,我们通常希望避免⾮常⼤的梯度值或损失值。这就是我们将特征从\(x^i\)调整为\(\frac{x^i}{i!}\)的原因,这样可以避免很大的i带来的特别大的指数值。我们将为训练集和测试集各生成100个样本。

max_degree = 20
n_train, n_test = 100, 100
true_w = np.zeros(max_degree)
true_w[0:4] = np.array([5, 1.2, -3.4, 5.6])

features = np.random.normal(size=(n_train + n_test, 1))
np.random.shuffle(features)
poly_features = np.power(features, np.arange(max_degree).reshape(1, -1))
for i in range(max_degree):
    poly_features[:, i] /= math.gamma(i + 1)
labels = np.dot(poly_features, true_w)
labels += np.random.normal(scale=0.1, size=labels.shape)

其中中国poly_features就是样本,labels就是要预测的值.
同样,存储在poly_features中的单项式由gamma函数重新缩放,其中Γ(n) = (n − 1)!。从⽣成的数据集中查
看⼀下前2个样本,第⼀个值是与偏置相对应的常量特征。

# NumPy ndarray转换为tensor
true_w, features, poly_features, labels = [torch.tensor(x, dtype=
torch.float32) for x in [true_w, features, poly_features, labels]]
features[:2], poly_features[:2, :], labels[:2]

image

  • 对模型进行训练和测试

首先让我们实现⼀个函数来评估模型在给定数据集上的损失。

def evaluate_loss(net, data_iter, loss):  
    """评估给定数据集上模型的损失。"""
    metric = d2l.Accumulator(2)
    for X, y in data_iter:
        out = net(X)
        y = y.reshape(out.shape)
        l = loss(out, y)
        metric.add(l.sum(), l.numel())
    return metric[0] / metric[1]
  • 训练函数
def train(train_features, test_features, train_labels, test_labels,
          num_epochs=400):
    loss = nn.MSELoss()
    input_shape = train_features.shape[-1]
    net = nn.Sequential(nn.Linear(input_shape, 1, bias=False))
    batch_size = min(10, train_labels.shape[0])
    train_iter = d2l.load_array((train_features, train_labels.reshape(-1, 1)),
                                batch_size)
    test_iter = d2l.load_array((test_features, test_labels.reshape(-1, 1)),
                               batch_size, is_train=False)
    trainer = torch.optim.SGD(net.parameters(), lr=0.01)
    animator = d2l.Animator(xlabel='epoch', ylabel='loss', yscale='log',
                            xlim=[1, num_epochs], ylim=[1e-3, 1e2],
                            legend=['train', 'test'])
    for epoch in range(num_epochs):
        d2l.train_epoch_ch3(net, train_iter, loss, trainer)
        if epoch == 0 or (epoch + 1) % 20 == 0:
            animator.add(epoch + 1, (evaluate_loss(
                net, train_iter, loss), evaluate_loss(net, test_iter, loss)))
    print('weight:', net[0].weight.data.numpy())

在这个里我们只有前4个维度是正常的,后面都是0.

  • 1.三阶多项式函数拟合(正常)
# 从多项式特征中选择前4个维度,即1,x,x^2/2!,x^3/3!
train(poly_features[:n_train, :4], poly_features[n_train:, :4],
	labels[:n_train], labels[n_train:])

学习到的模型参数也接近真实值w = [5, 1.2, −3.4, 5.6]。
image

  • 2.线性函数拟合(欠拟合)
# 从多项式特征中选择前2个维度,即1和x
train(poly_features[:n_train, :2],poly_features[n_train:, :2],labels[:n_train], labels[n_train:])

image
image

  • 高阶多项式函数拟合(过拟合)
# 从多项式特征中选取所有维度
train(poly_features[:n_train, :],poly_features[n_train:, :],labels[:n_train],labels[n_train:], num_epochs=1500)

image

标签:features,训练,模型,labels,选择,train,拟合
From: https://www.cnblogs.com/lipu123/p/17609422.html

相关文章

  • 流畅的python笔记 (一) 1.python的数据模型
    python的数据模型:python风格的设计思想完全体现在Python的数据模型上,而数据模型所描述的API,为使用最地道的语言特性来构建你自己的对象提供了工具。数据模型其实是对Python框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理......
  • PTE 听力 选择
             ......
  • 可与ViT一较高下,DeepMind从稀疏转向Soft混合专家模型
    前言 对于谷歌DeepMind的SoftMoE,有人表示:「即使它不是万能药,仍可以算得上一个突破」。本文转载自机器之心仅用于学术分享,若侵权请联系删除欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。CV各大方向专栏与各个部署框架最......
  • ThreeJs导入外部3D模型
    这节讲ThreeJs如何导入外部3D模型,在制作数字孪生或者模拟一些显示场景的时候,场景中的很多物体结构会比较复杂,所以需要的模型也比较复杂,很难用ThreeJs提供的文档实现,会否会花费大量的时间,针对复杂的模型的需要,ThreeJs提供导入3D模型的方式来实现一些复杂的模型显示。这样可以在方便......
  • Springboot中怎么选择性使用thymeleaf进行渲染?
    SpringBoot默认支持多种模板引擎,包括Thymeleaf。如果你想选择性地使用Thymeleaf进行渲染,这基本上取决于你的Controller的实现。以下是一个基本示例:首先,确保你的SpringBoot项目已经添加了Thymeleaf的依赖。在你的pom.xml文件中,你应该看到类似以下的内容<dependency>......
  • R语言随机搜索变量选择SSVS估计贝叶斯向量自回归(BVAR)模型|附代码数据
    原文链接:http://tecdat.cn/?p=9390原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于贝叶斯向量自回归(BVAR)的研究报告,包括一些图形和统计输出。介绍向量自回归(VAR)模型的一般缺点是,估计系数的数量与滞后的数量成比例地增加。因此,随着滞后次数的增加,每个参数可用的信息......
  • Unity 编辑器选择器工具类Selection 常用函数和用法
    Unity编辑器选择器工具类Selection常用函数和用法点击封面跳转下载页面简介在Unity中,Selection类是一个非常有用的工具类,它提供了许多函数和属性,用于操作和管理编辑器中的选择对象。本文将介绍Selection类的常用函数和用法,并提供相应的示例代码。静态属性1.activeConte......
  • C/C++ 数据结构-直接选择排序
    #include<iostream>#include<Windows.h>usingnamespacestd;voidswap(int*num1,int*num2){inttemp=*num1;*num1=*num2;*num2=temp;}intmain(){intret[]={161,156,170,164,158,180,159,185,172,176};intlen=......
  • 动态规划01: 斐波那契数列模型
    第N个泰波那契数(easy)题目链接:1137.第N个泰波那契数题目描述:泰波那契序列Tn定义如下:T~0~=0,T~1~=1,T~2~=1,且在n>=0的条件下T~n+3~=T~n~++T~n+1~+T~n+2~给你整数n,请返回第n个泰波那契数Tn的值。示例1:输入:n=4输出:4解释:T_3=0......
  • ChatGenTitle:使用百万arXiv论文信息在LLaMA模型上进行微调的论文题目生成模型
    ChatGenTitle:使用百万arXiv论文信息在LLaMA模型上进行微调的论文题目生成模型相关信息1.训练数据集在Cornell-University/arxiv,可以直接使用;2.正式发布LLaMa-Lora-7B-3和LLaMa-Lora-7B-3-new版本的LoRA模型权重,允许本地部署使用;完成了基于alpaca-lora上进行的LLaMa......