过拟合与欠拟合

一、模型选择

1、问题导入

2、训练误差与泛化误差

3、验证数据集和测试数据集

4、K-折交叉验证

       一般在没有足够多数据时使用。

二、过拟合与欠拟合

1、过拟合

过拟合的定义:

       当学习器把训练样本学的“太好”了的时候,很可能已经把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致泛化性能下降,这种现象称为过拟合。具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。

过拟合的原因:

  • 训练数据中噪音干扰过大,使得学习器认为部分噪音是特征从而扰乱学习规则。
  • 建模样本选取有误,例如训练数据太少,抽样方法错误,样本label错误等,导致样本不能代表整体。
  • 模型不合理,或假设成立的条件与实际不符。
  • 特征维度/参数太多,导致模型复杂度太高。

2、欠拟合

欠拟合的定义:

       欠拟合是指对训练样本的一般性质尚未学好。在训练集及测试集上的表现都不好。

欠拟合的原因:

  • 模型复杂度过低
  • 特征量过少

3、模型容量

4、数据复杂度

三、代码解释

       我们可以通过多项式拟合来探索这些概念。

import math
import numpy as np
import torch
from torch import nn
from d2l import torch as d2l

1、生成数据集

       给定$x$,我们将使用以下三阶多项式来生成训练和测试数据的标签:

$y = 5 + 1.2x - 3.4\frac{x^2}{2!} + 5.6 \frac{x^3}{3!} + \epsilon \text{ where } \epsilon \sim \mathcal{N}(0, 0.1^2).$

       噪声项$\epsilon$服从均值为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])     # 注意true_w.shape = (max_degree,),只是后面16个都为0
features = np.random.normal(size=(n_train + n_test, 1))
np.random.shuffle(features)     # features.shape = (n_train + n_test, 1)
# 使用 numpy.power 函数将 features 的每个元素分别与 np.arange(max_degree)(从0到max_degree-1的数组)进行幂运算。
poly_features = np.power(features, np.arange(max_degree).reshape(1, -1))    # ploy_feature.shape = (n_train + n_test, max_degree)
for i in range(max_degree):poly_features[:, i] /= math.gamma(i + 1)  # gamma(n)=(n-1)! 第i列数据除以i的阶乘
# labels的维度:(n_train+n_test,)
labels = np.dot(poly_features, true_w)  # labels.shape = (n_train + n_test,)  通过将多项式特征 poly_features 与真实系数 true_w 相乘得到标签。
labels += np.random.normal(scale=0.1, size=labels.shape)    # 向标签数据添加服从正态分布的噪声
# 下面4个分别对应: w x x^n/n! y=w*(x^n/n!)
true_w, features, poly_features, labels = [torch.tensor(x, dtype=       # 多项式:"polynomial"torch.float32) for x in [true_w, features, poly_features, labels]]  # for训练遍历列表[true_w, features, poly_features, labels]中的4个元素,将NumPy ndarray转换为tensor

2、对模型进行训练和测试

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

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(reduction='none')     # 使用均方根损失input_shape = train_features.shape[-1]  # input_shape=20# 不设置偏置,因为我们已经在多项式中实现了它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())

3、拟合结果分析

(1)三阶多项式函数拟合(正常)

       我们将首先使用三阶多项式函数,它与数据生成函数的阶数相同。结果表明,该模型能有效降低训练损失和测试损失。学习到的模型参数也接近真实值$w = [5, 1.2, -3.4, 5.6]$

# 从多项式特征中选择前4个维度,即1,x,x^2/2!,x^3/3!
# poly_features每行的前4个值是线性相关的,因为此时已经进行了幂运算、阶乘运算,就差乘true_w了,也正因如此前面才能使用单线性层nn.Linear拟合
train(poly_features[:n_train, :4], poly_features[n_train:, :4],labels[:n_train], labels[n_train:])

(2)线性函数拟合(欠拟合)

       让我们再看看线性函数拟合,减少该模型的训练损失相对困难。在最后一个迭代周期完成后,训练损失仍然很高。当用来拟合非线性模式(如这里的三阶多项式函数)时,线性模型容易欠拟合。不过这里的欠拟合是因为数据没给全(因为数据没给全而导致特征不明显),前4项weight的后面2项模型学不到,人为强制使模型欠拟合了,而不是模型容量不够。

# 从多项式特征中选择前2个维度,即1和x
train(poly_features[:n_train, :2], poly_features[n_train:, :2],labels[:n_train], labels[n_train:])

(3)高阶多项式函数拟合(过拟合) 

       现在,让我们尝试使用一个阶数过高的多项式来训练模型。在这种情况下,没有足够的数据用于学到高阶系数应该具有接近于零的值。因此,这个过于复杂的模型会轻易受到训练数据中噪声的影响。虽然训练损失可以有效地降低,但测试损失仍然很高。结果表明,复杂模型对数据造成了过拟合。其实就是给的数据太多(后面16项多余了),模型把不该学的(后面16项的weight)给学到了,于是就造成了过拟合。

# 从多项式特征中选取所有维度
train(poly_features[:n_train, :], poly_features[n_train:, :],labels[:n_train], labels[n_train:], num_epochs=1500)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每天五分钟计算机视觉:GoogLeNet的核心模型结构——Inception

本文重点 当构建卷积神经网络的时候,我们需要判断我们的过滤器的大小,这往往也作为一个超参数需要我们进行选择。过滤器的大小究竟是 11,33 还是 55,或者要不要添加池化层,这些都需要我们进行选择。而本文介绍的Inception网络的作用就是代替你来决定,把它变成参数的一部…

迅速理解什么是通信前置机

通信前置机设在两个通信对象之间,是实质性的物理服务器,适应不同通信协议或数据格式之间的相互转换。 前置机的作用: 隔离——隔离客户端与服务端,保障后端安全减负——处理非核心业务,分担后端服务器压力&#xff0…

【MATLAB】数据拟合第10期-二阶多项式的局部加权回归拟合算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 二阶多项式局部加权回归拟合算法是一种用于回归分析的方法,主要通过局部加权线性回归模型来实现。以下是对二阶多项式局部加权回归拟合算法的介绍: 局部加权线性回…

引用阿里图标库,不知道对应的图标是什么,可在本地显示图标ui,再也不要担心刚来不知道公司图标对应的是什么了

项目中使用了阿里的图标库,但是无法看到对应显示什么,每次都要去阿里图标库里面找 在下载下来的文件中会发现有两个文件一个是iconfont.css和iconfont.json, 这两个文件的数据可以拿到然后显示在页面上 有两个问题: 1&#xff1a…

如何在iPad Pro上实现SSH远程连接服务器并进行云端编程开发【内网穿透】

文章目录 前言1. 在iPad下载Code APP2.安装cpolar内网穿透2.1 cpolar 安装2.2 创建TCP隧道 3. iPad远程vscode4. 配置固定TCP端口地址4.1 保留固定TCP地址4.2 配置固定的TCP端口地址4.3 使用固定TCP地址远程vscode 前言 本文主要介绍开源iPad应用IDE如何下载安装,并…

爬虫的分类

爬虫的分类 网络爬虫按照系统结构和实现技术,大致可分为4类,即通用网络爬虫、聚焦网络爬虫、增量网络爬虫和深层次网络爬虫。 1.通用网络爬虫:搜索引擎的爬虫 比如用户在百度搜索引擎上检索对应关键词时,百度将对关键词进行分析…

乳品加工ERP包含哪些模块?乳品加工ERP常用哪家

乳品的加工管理涉及原材料采购、供应商选择、品质检验、车间排期、库龄分析、保质期、包装等诸多环节,其中某一个环节出现问题都将可能导致乳品的质量存在问题,从而导致企业的整体效益受到影响。 而电商等行业的发展也间接促进乳品行业管理模式的变革&a…

机器学习算法---分类

当然,让我为您提供更详细的机器学习算法介绍,重点在于每种算法的原理、优缺点,并在注意事项中特别提到它们对非平衡数据和高维稀疏数据的适应性。 1. 决策树(Decision Trees) 原理: 决策树通过学习简单的…

亚马逊云科技 re:Invent 大会 - S3 对象存储华丽升级

亚马逊云科技 re:Invent 大会 - S3 对象存储华丽升级 本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 文章目录 亚马逊云科技 re:Inv…

【MySQL】:数据类型

数据类型 一.数值类型1.整数1.tinyint2.bit类型 2.浮点类型1.float2.decimal 二.字符串类型1.char类型2.varchar类型3.char和varchar的区别4.日期和时间类型5.enum和set 三.集合查询 一.数值类型 1.整数 1.tinyint 正常插入 越界插入 如果我们向mysql特定的类型中插入不合法的…

Unity Mono加密解决方案

Unity Mono 是 Unity 引擎默认的脚本运行时环境,在游戏开发中扮演着重要的角色。Mono 由跨平台的开源 .NET 框架实现,它允许开发者使用 C# 等编程语言编写游戏逻辑。凭借简单易用的开发环境和高效的脚本编译速度,得到了众多游戏的青睐。 在 …

【Maven教程】(十二):版本管理 ——版本号定义约定及相关概念,自动化版本发布与创建分支,GPG签名 ~

Maven 版本管理 1️⃣ 版本管理的概念2️⃣ Maven 的版本号定义约定3️⃣ 主干、标签与分支4️⃣ 自动化版本发布5️⃣ 自动化创建分支6️⃣ GPG签名6.1 GPG 及其基本使用6.2 Maven GPG Plugin 🌾 总结 一个健康的项目通常有一个长期、合理的版本演变过程。例如JUn…

win10 + vs2017 + cmake3.17编译OSG-3.4.1

1. 下载文件 主要用到4个文件 1)OSG-3.4.1源码2)OSG第三方依赖库3)OSG示例数据4)cmake-3.17 我已经准备好了,大家可以自行下载。下载路径: 链接:https://pan.baidu.com/s/1E3YESh0T9KPlJJe2…

利用Python+selenium技术,实现浏览器基本操作详解,代码有详细注释

首先,需要安装selenium库和对应的浏览器驱动程序。以Chrome浏览器为例,可以使用以下命令安装selenium和chromedriver: pip install selenium然后,需要下载对应版本的chromedriver,并将其添加到环境变量中。下载地址&a…

代码随想录二刷 |二叉树 |144.二叉树的前序遍历

代码随想录二刷 |二叉树 |144.二叉树的前序遍历 题目描述解题思路代码实现递归法迭代法 题目描述 144.二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输…

godot 报错Unable to initialize Vulkan video driver解决

版本 godot 4.2.1 现象 godot4.2.1 默认使用vulkan驱动,如果再不支持vulkan驱动的主机上,进入引擎编辑器将报错如下 解决 启动参数添加 –rendering-driver opengl3 即可进入引擎编辑器 此时运行项目仍然会报错无法初始化驱动 在项目设置中配置编…

vue实现公式编辑器组件

实现方式一 1、效果图 2、实现代码 组件弹框实现 样式自己调整 公式的数字与汉字元素、符号 建立元素表 动态获取 完整代码&#xff08;calculate.vue&#xff09; <template><div id"formulaPage"><divref"formulaView"class"f…

记录今日将C语言的Windows程序更改为python语言Windows程序,实现子窗口控制,类似微信程序框架最简单的原型

基本思路 为什么要选择python制作Windows应用程序&#xff0c;主要就是源代码直接展示&#xff0c;发现问题随时修改&#xff0c;同时可以不断增加新的功能方便。 由于C语言的Windows程序中结构类型在python中不能使用&#xff0c; 因此我们按照ctypes模块指导意见继承structu…

Verilog自学还是报班?

FPGA作为国内领先的芯片产品&#xff0c;和传统芯片相比并不局限于单纯的研究和设计芯片&#xff0c;而是针对多种领域的产品通过特定的芯片模型进行优化设计。FPGA本身也构成了典型的半定制电路&#xff0c;涵盖了数字管理模块、输入、输出等单元。 FPGA最大的特点是可以在同…