LOOCV - Leave-One-Out-Cross-Validation 留一交叉验证

2024-03-25 22:59

本文主要是介绍LOOCV - Leave-One-Out-Cross-Validation 留一交叉验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是留一交叉验证

正常训练都会划分训练集和验证集,训练集用来训练模型,而验证集用来评估模型的泛化能力。留一交叉验证是一个极端的例子,如果数据集D的大小为N,那么用N-1条数据进行训练,用剩下的一条数据作为验证,用一条数据作为验证的坏处就是可能 E v a l E_{val} Eval E o u t E_{out} Eout相差很大,所以在留一交叉验证里,每次从D中取一组作为验证集,直到所有样本都作过验证集,共计算N次,最后对验证误差求平均,得到Eloocv(H,A),这种方法称之为留一法交叉验证。
1 N ∑ n = 1 N e n = 1 N ∑ n = 1 N e r r ( g n − ( x n ) , y n ) \frac{1}{N}\sum_{n=1}^{N} e_{n} = \frac{1}{N}\sum_{n=1}^{N} err(g_{n}^{-}(x_{n}),y_{n}) N1n=1Nen=N1n=1Nerr(gn(xn),yn)

为什么使用LOOCV

至于为什么,其原因和为什么使用交叉验证是一样的,主要是为了防止过拟合,评估模型的泛化能力

什么时候使用LOOCV

当数据集D的数量较少时使用留一交叉验证,其原因主要如下

  • 数据集少,如果像正常一样划分训练集和验证集进行训练,那么可以用于训练的数据本来就少,还被划分出去一部分,这样可以用来训练的数据就更少了。loocv可以充分的利用数据。
  • 因为loocv需要划分N次,产生N批数据,所以在一轮训练中,要训练出N个模型,这样训练时间就大大增加。所以loocv比较适合训练集较少的场景
LOOCV理论证明

为什么可以使用LOOCV来近似估计泛化误差,即 E l o o c v ≈ E o u t E_{loocv}\approx E_{out} EloocvEout
证明如下
在这里插入图片描述

解释如下:

  • ε D \varepsilon_{D} εD表示在不同数据集上的期望 , ε \varepsilon ε 是表示期望的符号,这里不同的数据D,我的理解是对原始数据的N次划分得到的不同数据集
  • ε D e n \varepsilon_{D}e_{n} εDen=> ε D n ε ( x n , y n ) e n \varepsilon_{D_{n}}\varepsilon_{{(x_{n},y_{n})}}e_{n} εDnε(xn,yn)en是因为 D n D_{n} Dn ( x n , y n ) (x_{n},y_{n}) (xn,yn)服从iid分布
  • ε ( x n , y n ) e r r ( g n − ( x n ) , y n ) \varepsilon_{{(x_{n},y_{n})}}err(g_{n}^{-}(x_{n}),y_{n}) ε(xn,yn)err(gn(xn),yn)转化为 E o u t ( g n − ) E_{out}(g_{n}^{-}) Eout(gn)是期望的定义和 E o u t E_{out} Eout的定义,虽然是对剩下的一个求误差,但是求的是对剩下单个数据的期望,单个数据的的期望相当于对所有未知数据上求概率平均(因为训练数据和位置数据是iid,所以对训练数据求期望相当终于对未知数据求期望),也就是 g n − g_{n}^{-} gn在未知数据上的E即 E o u t E_{out} Eout
LOOCV的优点
  • 充分利用数据
  • 因为采样是确定的,所以最终误差也是确定的,不需要重复LOOCV
LOOCV的缺点
  • 训练起来耗时
  • 由于每次只采一个样本作为验证,导致无法分层抽样,影响验证集上的误差。举个例子,数据集中有数量相等的两个类,对于一条随机数据,他的预测结果是被预测为多数的结果,如果每次划出一条数据作为验证,则其对应的训练集中则会少一条,导致训练集中该条数据占少数从而被预测为相反的类,这样原来的误差率为50%,在LOOCV中为100%
LOOCV模型选择问题

之前有个疑问就是,在留一交叉验证过后,到底选择哪一个模型作为最终的模型呢?比如一百条数据在LOOCV中训练了一百个模型,选择其中最好的一个吗,其实不是这样的。
考虑一般的划分训练,train_data七三划分为训练集和验证集,然后每一轮训练都会得到一个 E v a l E_{val} Eval,训练到 E v a l E_{val} Eval最低为止,此时的模型就是最终的模型。
LOOCV也是这样的,只不过原来每一轮的训练对应于LOOCV中划分N次训练N个模型,原来的 E v a l E_{val} Eval对应于LOOCV每一轮N个误差的平均,这样一轮轮下来直到验证集上的误差最小,此时的模型就是最终需要的模型(这个模型内部有N个小模型)

这篇关于LOOCV - Leave-One-Out-Cross-Validation 留一交叉验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846526

相关文章

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

React 笔记 父子组件传值 | 父组件调用子组件数据 | defaultProps | propsType合法性验证

1.通过props实现父组件像子组件传值 、方法、甚至整个父组件 传递整个父组件则   [变量名]={this} import Header from "./Header"render(){return(<Header msg={"我是props传递的数据"}/>)} import React,{Component} from "react";class Header extends

Java验证辛钦大数定理

本实验通过程序模拟采集大量的样本数据来验证辛钦大数定理。   实验环境: 本实验采用Java语言编程,开发环境为Eclipse,图像生成使用JFreeChart类。   一,验证辛钦大数定理 由辛钦大数定理描述为: 辛钦大数定理(弱大数定理)  设随机变量序列 X1, X2, … 相互独立,服从同一分布,具有数学期望E(Xi) = μ, i = 1, 2, …, 则对于任意正数ε ,