机器学习,过拟合与欠拟合,正则化与交叉验证

目录

机器学习

过拟合与欠拟合

正则化与交叉验证

正则化

交叉验证


机器学习

的目的是使学到的模型不仅对已知数据而且对未知数据都能有很好的预测能力

不同的机器学习方法会给出不同的模型。当损失函数给定时,基于损失函数的模型的训练误差(training error)和模型的测试误差(test error)就自然成为学习方法评估的标准。

注意,机器学习方法具体采用的损失函数未必是评估时使用的损失函数。当然,让两者一致是比较理想的。

训练误差的大小,对判断给定的问题是不是一个容易学习的问题是有意义的,但是本质上不重要。测试误差反应了学习方法对未知的测试数据集的预测能力。

显然,给定两种学习方法,测试误差小的方法具有更好的预测能力,是更有效的方法。通常讲学习方法对未知数据的预测能力称为泛化能力(generalization ability)。

过拟合与欠拟合

对于机器学习和深度学习模型而言,我们不仅希望它能很好的拟合训练数据集,同时也希望它可以对未知数据集(测试集)有很好的拟合效果(泛化能力)。机器学习的泛化能力(generalization ability)是指由该方法学习到的模型对未知数据的预测能力,是学习方法本质上重要的性质。现实中采用最多的办法是用过测试误差来评价学习方法的泛化能力

度量泛化能力的好坏,就涉及到所谓的模型的欠拟合(underfitting)和过拟合(overfitting)。

  • 过拟合指的是在训练数据集上表现良好,而在未知数据上表现差。
  • 欠拟合指的是模型没有很好地学习到数据特征,不能够很好地拟合数据,在训练数据和未知数据上表现都很差。

图片

欠拟合、正常拟合和过拟合

下图描述了训练误差和测试误差与模型的复杂度之间的关系。当模型的复杂度增大时,训练误差会逐渐减小并趋近于0;而测试误差会先减小,达到最小值后有增大。当选择的模型复杂度过大时,过拟合现象就会发生。

因此,在学习时就要防止过拟合,进行最优的模型选择,即选择复杂度适当的模型,以达到使测试误差最小的学习目的。

图片

训练误差和测试误差与模型的复杂度之间的关系

过拟合的原因在于:

  • 参数太多,模型复杂度过高;

  • 建模样本选取有误,导致选取的样本数据不足以代表预定的分类规则;

  • 样本噪音干扰过大,使得机器将部分噪音认为是特征从而扰乱了预设的分类规则;

  • 假设的模型无法合理存在,或者说是假设成立的条件实际并不成立。

欠拟合的原因在于:

  • 特征量过少;

  • 模型复杂度过低。

怎么解决过拟合?

  • 获取和使用更多的数据(数据集增强)——解决过拟合的根本性方法;

  • 特征降维,人工选择保留特征的方法对特征进行降维;

  • 加入正则化,控制模型的复杂度;

  • Dropout;(
    dropout(随机失活):dropout是通过遍历神经网络每一层的节点,然后通过对该层的神经网络设置一个keep_prob(节点保留概率),即该层的节点有keep_prob的概率被保留,keep_prob的取值范围在0到1之间。通过设置神经网络该层节点的保留概率,使得神经网络不会去偏向于某一个节点(因为该节点有可能被删除),从而使得每一个节点的权重不会过大,有点类似于L2正则化,来减轻神经网络的过拟合。)

  • Early stopping;

  • 交叉验证。

怎么解决欠拟合?

  • 增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;

  • 添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强;

  • 减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数;

  • 使用非线性模型,比如核SVM 、决策树、深度学习等模型;

  • 调整模型的容量(capacity),通俗地,模型的容量是指其拟合各种函数的能力;

  • 容量低的模型可能很难拟合训练集。

正则化与交叉验证

正则化

模型选择的典型方法是正则化(regularization)。正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项(regularizer)或惩罚项(penalty term)。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化值就越大。比如,正则化项可以是模型参数向量的范数。

正则化一般具有如下形式:

 

其中,第1项是经验风险,第2项是正则化项, 为调整两者之间关系的系数。

第1项的经验风险较小的模型可能较复杂(有多个非零参数),这时第2项的模型复杂度会较大。正则化的作用是选择经验风险与模型复杂度同时较小的模型。

从贝叶斯估计的角度来看,正则化项对应于 模型的先验概率

  • 可以假设复杂的模型有较小的先验概率
  • 简单的模型有较大的先验概率

交叉验证

另一种常用的模型选择方法是交叉验证(cross validation)。

如果给定的样本数据充足,进行模型选择的一种简单方式是随机地将数据集切分成三部分,分别为训练集(training set)、验证集(validation set)和测试集(test set)。训练集用来训练模型,验证集用于模型的选择,测试集用于最终对学习方法的评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。

但是,在许多实际应用中数据是不充足的。为了选择好模型,可以采用交叉验证方法。交叉验证的基本想法是重复地使用数据;把给定的数据进行切分,讲切分的数据集组合为训练集与测试集,在此基数上反复地进行训练、测试以及模型选择

  1. 简单交叉验证

简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集(例如,70%的数据为训练集,30%的数据为测试集);然后用训练集在各种条件下(例如,不同参数个数)训练模型,从而得到不同的模型;在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

  1. S折交叉验证

应用最多的是S折交叉验证(S-fold cross validation),方法如下:首先随机地将已给数据切分为S个互不相交、大小相同的子集;然后利用S-1个子集的数据训练模型,利用余下的子集测试模型;将这一过程可能的S种选择重复进行;最后选出S次测评中平均测试误差最小的模型。

  1. 留一交叉验证

S折交叉验证的特殊情形是S=N,成为留一交叉验证(leave-one-out cross validation,LOOCV),往往在数据缺乏的情况下使用。这里N是给定数据集的容量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件

文章目录 ⭐前言⭐react 组件传值实例💖父组件传值给子组件(props)💖子组件传递事件给父组件props绑定事件💖父组件触发子组件的事件Ref ⭐vue3 组件传值实例💖 父组件传递数据给子组件props💖 …

三维重建 PyQt Python MRP 四视图(横断面,冠状面,矢状面,3D)

本文实现了 Python MPR 的 四视图,横断面,冠状面,矢状面,3D MPR(multi-planner reformation)也称多平面重建,多重面重建是将扫描范围内所有的轴位图像叠加起来再对某些标线标定的重组线所指定的组织进行冠状、矢状位、…

JAMstack架构:快速构建安全、高性能的现代应用

随着Web应用的快速发展,开发者们在寻找更加高效、安全和可维护的应用架构。JAMstack架构应运而生,它通过将前端、后端和部署过程分离,提供了一种现代化的方式来构建Web应用。在本文中,我们将深入探讨JAMstack架构的特点、优势以及…

ES 索引重命名--Reindex(一)

ES reindex脚本流程,下图为整体流程: 步骤(1):每次写入把之前的索引删除再重新创建索引,然后判断索引是否创建成功,由于创建成功返回结果是json,因此用Json Input插件去解析json获得…

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…

备份服务器搭建

备份服务器搭建 1、背景2、作用3、选型4、环境5、部署5.1、服务端部署5.1.1、安装5.1.2、配置 5.2、客户端部署5.3、备份策略5.3.1、定时备份策略5.3.2、文件变动备份 6、参考 1、背景 随着项目的推进,备份服务器被提上了工作日程,等保、密评和接入测评…

selenium Chrome驱动下载地址

Chrome驱动官方最新版下载地址:https://googlechromelabs.github.io/chrome-for-testing/ 有稳定版,开发版等版本可以选择下载 选择 操作系统复制下载链接直接下载

CentOS7安装部署Doris

文章目录 CentOS7安装部署Doris一、前言1.简介2.环境 二、正文1.Doris基础1)架构图2)通讯端口 2.部署服务器3.安装基础环境1)安装JDK 112)安装GCC3)设置文件句柄数4)关闭交换分区(swap&#xff…

微服务参数透传实现

说明:在微服务架构中,用户身份经网关验证后,我们可以将用户信息,如ID加入到请求头上。后面的微服务中,可以设置一个拦截器,拦截请求,获取请求头上的用户ID,加入到ThreadLocal中。 最…

欧拉计划44题

Pentagon numbers Pentagonal numbers are generated by the formula, . The first ten pentagonal numbers are: 1,5,12,22,35,51,70,92,117,145,… It can be seen that . However, their difference, 70−2248, is not pentagonal. Find the pair of pentagonal numbers, a…

安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Stable Diffusion入门修炼手册

简介 作为新入门的新手,通常安装完Stable Diffusion之后,一打开界面,在文生图输入girl或者dog,结果出来的画面比较糟糕,看起来像素很低,画面不清晰,人物也不怎么美,等等其他问题&am…

【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新: 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…

二、10.文件系统

硬盘是低速设备,其读写单位是扇区,为了避免频繁访问硬盘,操作系统不会有了一扇区数据就去读写一次磁盘,往往等数据积攒到“足够大小”时才一次性访问硬盘,这足够大小的数据就是块,硬盘读写单位是扇区&#…

二、9.硬盘驱动程序

文件系统是运行在操作系统中的软件模块,是操作系统提供的一套管理磁盘文件读写的方法和数据组织、存储形式,因此,文件系统=数据结构+算法,哈哈,所以它是程序。它的管理对象是文件,管…

C语言小白急救 指针初级讲解(四千字教程)

系列文章目录 C语言小白急救 表达式求值(两千字教程) C语言小白急救 操作符详解(8千字保姆级教程) C语言小白急救 扫雷游戏(万字保姆级教程) C语言小白急救 使用C语言编写‘三子棋‘ 文章目录 系列文章目录[C语言小白急救 表达式…

Docker的基本使用

Docker 概念 Docker架构 docker分为客户端,Docker服务端,仓库 客户端 Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务端发起请求,服务端将完成所有的工作并返回相应结果。 Docker …

设计模式之创建者模式

文章目录 一、介绍二、应用三、案例1. 麦当劳11随心配2. 代码演示3. 演示结果 四、优缺点五、送给读者 一、介绍 建造者模式(Builder Pattern)属于创建型设计模式,很多博客文章的对它的作用解释为用于将复杂对象的创建过程与其细节表示分离。但对于初学者来说&…

机器学习深度学习——NLP实战(情感分析模型——textCNN实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——NLP实战(情感分析模型——RNN实现) 📚订阅专栏:机器学习…

Lnton羚通算法算力云平台【PyTorch】教程:torch.nn.Softsign

torch.nn.Softsign 原型 CLASS torch.nn.Softsign() 图 代码 import torch import torch.nn as nnm nn.Softsign() input torch.randn(4) output m(input)print("input: ", input) print("output: ", output)# input: tensor([ 0.0046, -0.4135, -2…
最新文章