ML学习笔记(二)----交叉验证、偏差和方差分析

2023-11-07

什么是交叉验证?

交叉验证是一种模型验证技术,可用于评估统计分析(模型)结果在其它独立数据集上的泛化能力。它主要用于预测,我们可以用它来评估预测模型在实践中的准确度。
交叉验证的目标是定义一个数据集,以便于在训练阶段(例如,验证数据集)中测试模型,从而限制模型过拟合、欠拟合等问题,并且帮助我们了解模型在其它独立数据集上的泛化能力。值得一提的是,验证集和训练集必须满足独立同分布条件,否则交叉验证只会让结果变得更加糟糕。
验证有助于我们评估模型的质量
验证有助于我们挑选出那些能够在预测数据集上取得最好性能的模型
验证有助于我们避免过拟合与欠拟合

什么是过拟合/欠拟合?

欠拟合指的是模型没能够从训练数据中学习到足够的模式。此时,模型在训练集和测试集上的表现都非常差。
过拟合则有两种情况:第一种,模型学习到过多的噪声;第二种,模型学习到的模式泛化能力差。此时,模型在训练集上表现很好,但是在测试集上表现则非常差(对于分类任务而言,可以看作是模型学习到了同类别的不同实例之间的区别,并把它们作为分类依据,所以面对新的实例时分类性能不佳)。
而最佳的模型应该能够在训练集和测试集上都表现得很好。

不同的验证策略

通常,依据数据集中分割方式的不同,会有不同的验证策略。
训练测试集划分/Holdout 验证 —— 组数为 2
在该策略中,我们简单地将数据集划分成两组:训练集和测试集,并且要求训练集和测试集之间的样本不存在任何重叠,如果存在重叠,那么验证手段将失效。在准备发布最终模型之前,我们可以在整个数据集上重新训练模型,而不需要更改任何超参数。

在这里插入图片描述但是这种划分方式存在一个主要的缺陷:
如果我们的划分方式并不是随机的呢?比如,我们数据的某个子集只有来自于某个州的人,或者某个子集中只含有某一特定水平收入的员工,又或者子集中只含有女性或特定年龄的人,这时我们该怎么办?尽管我们一直在极力避免,但是这些情况都将导致模型的过拟合,因为此时无法确定哪些数据点会出现在验证集中,并且针对不同的数据集,模型的预测结果也可能完全不同。因此,只有当我们拥有充足的数据时,这种做法才是合适的。

k 分划分 —— 组数为k
由于永远不会有充足的数据来训练模型,因此如果将数据集中的某一部分划分出来用于验证还会导致模型出现欠拟合的问题。由于训练数据样本减少,我们的模型面临着丢失掌握重要模式/趋势机会的风险,从而增加偏差引起的误差。因此,我们需要一种方法,它既能够为训练模型提供充足的数据样本,又能够为验证步骤保留一定数量的数据。k 分(k-fold)交叉验证正是我们所需要的。

k 分交叉验证可以看做是执行了多次的简单二分划分验证,然后我们在执行了 k 次不同的简单划分验证之后继续简单地将得分进行平均。数据集中的每个数据点只能在验证集中出现一次,并且在训练集中出现 k-1 次。这种做法将大大减轻欠拟合现象,因为我们使用了几乎所有的数据来训练模型,同时还能显著减少过拟合现象,因为大部分数据也被用来做验证。

当我们的数据量较小时,或者在不同的划分数据集中,我们的模型性能或者最优参数存在较大的区别时,k 分交叉验证是一种很好的选择。通常情况下,我们设置 k=5 或 k=10,这些值来自于经验总结,大量实验证明当 k 取这些值时,验证结果不会存在过高的偏差或者方差。

留一法 —— 组数训练数据集大小
当 k 等于数据集中的样本数时,留一法(Leave one out)实际上可以看做 k 分交叉验证的一个特例。这意味着每次使用 k-1 个样本作为训练样本而剩下 1 个样本作为验证样本,然后照此遍历数据集。
如果我们的数据量非常小并且模型的训练速度非常快,那么可以考虑该方法。
在这里插入图片描述

额外补充 —— 分层法(Stratification)
通常,在使用训练集/测试集划分或者是 k 分交叉验证的时候,我们会将数据集进行随机重排,以便于得到随机的训练/验证集划分。在这种情况下,可以将不同的目标分布应用于不同的划分区域中。通过分层法,当我们在分割数据时,我们可以在不同的划分区域中获得相似的目标分布。
该方法对以下情况有效:

小数据集

数据不平衡

多分类问题

通常而言,对于一个类别平衡的大型数据集,分层划分法和简单的随机划分基本一样。

什么时候使用?

如果我们有充足的数据,并且对于不同的划分方式,我们都能获得相近的成绩以及最优参数模型,那么训练集/测试集二分划分是一种不错的选择。而如果恰恰相反,也就是对于不同的划分方式,模型的测试成绩和最优参数都存在着较大的差异时,我们可以选择 k 分交叉验证。如果数据总量非常少,则可以考虑使用留一法。此外,分层法有助于使验证结果更加稳定,并且对于小型且类别不平衡的数据集尤其管用。

k 分交叉验证的 k 该取多少?

当 k 的取值越大时,由偏差导致的误差将减少,而由方差导致的误差将增加,此外计算的代价也将上升。显然,你需要更多的时间来计算,并且也会消耗更多的内存。

当 k 的取值越小时,由方差导致的误差将减少,而由偏差导致的误差将增加。此外,这时所需的计算资源也将减少。

针对大型数据集的时候,我们通常将 k 设置为 3 或者 5,但是对于小型数据集我们还是建议采用留一法。

交叉验证是一种通过估计模型的泛化误差,从而进行模型选择的方法。没有任何假定前提,具有应用的普遍性,操作简便, 是一种行之有效的模型选择方法。

人们发现用同一数据集,既进行训练,又进行模型误差估计,对误差估计的很不准确,这就是所说的模型误差估计的乐观性。为了克服这个问题,提出了交叉验证。基本思想是将数据分为两部分,一部分数据用来模型的训练,称为训练集;另外一部分用于测试模型的误差,称为验证集。由于两部分数据不同,估计得到的泛化误差更接近真实的模型表现。数据量足够的情况下,可以很好的估计真实的泛化误差。但是实际中,往往只有有限的数据可用,需要对数据进行重用,从而对数据进行多次切分,得到好的估计。

交叉验证方法
留一交叉验证(leave-one-out):每次从个数为N的样本集中,取出一个样本作为验证集,剩下的N-1个作为训练集,重复进行N次。最后平均N个结果作为泛化误差估计。
留P交叉验证(leave-P-out):与留一类似,但是每次留P个样本。每次从个数为N的样本集中,取出P个样本作为验证集,剩下的N-P个作为训练集,重复进行
次。最后平均N个结果作为泛化误差估计。
以上两种方法基于数据完全切分,重复次数多,计算量大。因此提出几种基于数据部分切分的方法减轻计算负担。
K折交叉验证:把数据分成K份,每次拿出一份作为验证集,剩下k-1份作为训练集,重复K次。最后平均K次的结果,作为误差评估的结果。与前两种方法对比,只需要计算k次,大大减小算法复杂度,被广泛应用。

模型选择方法的评价

衡量一个模型评估方法的好坏,往往从偏差和方差两方面进行。
Error = Bias^2 + Variance+Noise
Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反应预测的波动情况。

什么是Noise(噪声)
这就简单了,就不是你想要的真正数据,你可以想象为来破坏你实验的元凶和造成你可能过拟合的原因之一,至于为什么是过拟合的原因,因为模型过度追求Low Bias会导致训练过度,对测试集判断表现优秀,导致噪声点也被拟合进去了

总结

交叉验证是数据科学家评估模型有效性的一个非常有用的工具,特别是用于解决过拟合和欠拟合问题。此外,在确定模型最优超参数问题上,它也是非常有帮助的。
Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力.

偏差和方差

在机器学习中,我们用训练数据集去训练(学习)一个model(模型),通常的做法是定义一个Loss function(误差函数),通过将这个Loss(或者叫error)的最小化过程,来提高模型的性能(performance)。然而我们学习一个模型的目的是为了解决实际的问题(或者说是训练数据集这个领域(field)中的一般化问题),单纯地将训练数据集的loss最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的loss与一般化的数据集的loss之间的差异就叫做generalization error=bias+variance。
注:Bias和Variance是针对Generalization(一般化,泛化)来说的。

Bias是 “用所有可能的训练数据集训练出的所有模型的输出的平均值” 与 “真实模型”的输出值之间的差异;

Variance则是“不同的训练数据集训练出的模型”的输出值之间的差异。

参考

三分钟重新学习交叉验证

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ML学习笔记(二)----交叉验证、偏差和方差分析 的相关文章

  • Go高级编程详解

    一 数据操作 1 读取用户的输入 我们如何读取用户的键盘 控制台 输入呢 从键盘和标准输入 os Stdin 读取输入 最简单的办法是使用 fmt 包提供的 Scan 和 Sscan 开头的函数 请看以下程序 示例 readinput1 g
  • sklearn实现支持向量机

    机器学习入门实验之支持向量机 简单实验 使用sklearn完成 代码如下 注 本文章主要是为方便自己以后复习所学内容而写 并不做详细介绍 支持向量机 这里是线性核 sklearn自带软间隔支持向量机 import pandas as pd
  • 用计算机数字语言研究中医理论,试论中医基础理论数字模型.pdf

    试论中医基础理论数字模型 pdf 维普资讯 知 盈 世界科学技术 中药现代化 中医现代化 医 学 课 堂 摘 要 中医基础理论研究的现代化是中医现代化的基础和前提 提出将中医学的基本概念进行 进制数字编码 根据中医原理和规律确定算法 建立数

随机推荐

  • macos 解决 Failed building wheel for xxx

    Failed building wheel for greenlet meinheld ujson 一 手动下载whl文件 二 xcode select install 三 多个版本MacOSX sdk pip install时可能会失败
  • 城市内涝积水监测预警系统的重要性

    一 系统概述 随着我国城镇化快速发展 城市建设产生的大量地面硬底化 大部分的降雨将形成地表径流 仅有少量雨水渗入地下 导致城市内涝等一系列问题 当前 全国多地发生洪涝 我国南北方全面进入主汛期 需要重点防治暴雨造成的城乡内涝 山体滑坡等安全
  • 【java】高并发之限流 RateLimiter使用

    1 概述 转载原文 高并发之限流 你可能知道高并发系统需要限流这个东西 但具体是限制的什么 该如何去做 还是模凌两可 我们接下来系统性的给它归个小类 希望对你有所帮助 google guava中提供了一个限流实现 RateLimiter 这
  • chmod函数

    int chmod const char pathname mode t mode 作用 修改文件的权限 参数 mode 需要修改的权限值 宏或者八进制数 返回值 成功 0 失败 1 include
  • 线性表顺序存储及相关操作(创建,插入,删除,遍历)

    线性表类型的定义 线性表是由同类数据元素构成的有序序列的线性结构 表中元素个数 n gt 0 称为线性表的长度 n 0时称为空表 在复杂线性表中 一个数据元素可以由若干个数据项 item 组成 这种情况下 常把数据元素称为记录 record
  • Linux 入门笔记(根据传智韩顺平整理的(一))

    开发步骤 1 Vi Hello java 2 输入i进入插入模式 3 输入esc 进入命令模式 4 输入 冒号 wq保存退出 q 退出不保存 5 编译Hello java gt javac Hello java 6 运行 java Hell
  • C++如何显示一个函数被调用的次数

    问题1 如何显示一个函数被调用的次数 使用static关键字 汉诺塔问题局部 void move char src char dest static int n 1 n具有全局寿命 但是局部可见 cout lt
  • 什么是漏洞扫描?

    首先什么是漏洞 国内外各种规范和标准中关于漏洞 也称脆弱性 英文对应Vulnerability 的定义很多 摘录如下 互联网工程任务组RFC4949 1 系统设计 部署 运营和管理中 可被利用于违反系统安全策略的缺陷或弱点 中国国家标准 信
  • 分布式与高并发(一)了解多线程的意义和使用

    了解多线程的意义和使用 什么是线程 并发与高并发 客户端向Tomcat发送请求 在Tomcat中存在多个个并发数 这个并发数由什么决定的 并发 单位时间内能够同时处理的请求数 默认情况下Tomcat可以支持的最大请求数是150 也就是同时支
  • 资深测试老鸟整理,性能测试-常见调优详细,卷起来...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • python报错“No module named xarray”

    在python运行 import xarray as xr 报错 No module named xarray 在命令提示符中显示已安装 一 检查 1 确认 Python 解释器路径 运行以下代码 查看正在使用的 Python 解释器路径
  • python:playwright结合pytest执行用例

    playwright结合Pytest为您的 Web 应用程序编写端到端的测试 安装pytest插件 C Users lifeng01 gt pip install pytest playwright Collecting pytest pl
  • Linux下CMake编译链接线程库以及线程绑定

    CMake编译链接线程库 1 设置链接选项 使用 CMake 编译程序时 需要设置链接选项来链接 pthread 库 在 CMakeLists txt 文件中添加链接选项 即在add executable 下面添加以下代码将 pthread
  • Tomcat性能优化(二)

    六 NIO连接器前端整体框图 1 图解tomcat总体流程 源码详细分析解读见视频 连接器在Tomcat中是一个重要的组件 叫做Tomcat前端 这个前端框架不是通常我们讲的Web前端 那是structs javascript jsp这些内
  • A记录,子域名,CNAME,MX,TXT,SRV

    http zhanghucheng cn post 8 A记录 A Address 记录是用来指定主机名 或域名 对应的IP地址记录 用户可以将该域名下的网站服务器指向到自己的web server上 同时也可以设置您域名的子域名 通俗来说A
  • Git:Unable to negotiate with错误

    今天更新了一下Git版本 发现推送代码的时候提示 Unable to negotiate with xx xx xx xx port 29418 no matching host key type found Their offer ssh
  • JS 如何将数组对象中多个特定值取出形成新数组

    有如下数据 list mainId 581 errMsg null sort null status null nowFarmId null nowPigstyId null insideEarCode MT5687G pigEntityC
  • Linux操作系统原理与应用实验 实验三 实验四 问题总结

    本文是在进行Linux实验三和实验四所遇到的问题或学到的小知识进行总结 以调通程序为内容导向 问题的解决方法或许不难 也都能搜到 但是如果笔者自己总结下来能够节省很多人去搜索解决方法的繁琐步骤 节省大家的时间 实验三 文件操作算法 新版本带
  • gdb调试动态链接库

    转自 http www cnblogs com ybgame archive 2012 03 23 2414078 html 在 Linux 可以用 gdb 来调试应用程序 当然前提是用 gcc 编译程序时要加上 g 参数 我这篇文章里将讨
  • ML学习笔记(二)----交叉验证、偏差和方差分析

    什么是交叉验证 交叉验证是一种模型验证技术 可用于评估统计分析 模型 结果在其它独立数据集上的泛化能力 它主要用于预测 我们可以用它来评估预测模型在实践中的准确度 交叉验证的目标是定义一个数据集 以便于在训练阶段 例如 验证数据集 中测试模