深度学习中常见的九种交叉验证方法汇总

目录

1. K折交叉验证(K-fold cross-validation)

2. 分层K折交叉验证(Stratified K-fold cross-validation)

3. 时间序列交叉验证(Time Series Split)

4. 留一交叉验证(Leave-One-Out Cross-Validation,LOOCV) 

5. 留P交叉验证(Leave-P-Out Cross-Validation,LPOCV)

6. 重复K折交叉验证(Repeated K-Fold Cross-Validation)

7. 留出交叉验证(Holdout Cross-Validation)

8. 自助采样交叉验证(Bootstrap Cross-Validation)

9. 蒙特卡洛交叉验证(Monte Carlo Cross-Validation)

10. 重复随机子采样交叉验证(Repeated Random Subsampling Cross-Validation)


方法任务类型划分方式计算量优点缺点适用场景
K折交叉验证通用将数据集分为 K 个子集,每次选取一个子集作为验证集中等充分利用数据,可以更准确地评估模型性能计算量较大通用
分层K折交叉验证通用类似于 K 折交叉验证,但保持每个折中类别比例中等对于不平衡数据集,保证了每个折中的类别比例计算量较大数据不平衡时
时间序列交叉验证时间序列数据根据时间顺序划分数据,保证训练集在测试集之前考虑了时间序列数据的顺序性,适合于时间序列预测任务不适用于非时间序列数据时间序列预测任务
留一交叉验证通用每次将一个样本作为验证集最大程度利用数据,评估结果准确计算量巨大,效率低下数据集较小时
留P交叉验证通用每次留下 P 个样本作为验证集可以自定义留下的样本数量 P,适用于不同情况计算量较大,效率低下数据集较小时
重复K折交叉验证通用对 K 折交叉验证进行多次重复提供更稳健的评估结果,减少因随机性引起的评估误差计算量更大需要更加稳健的评估结果
留出交叉验证通用将数据集划分为训练集和测试集,通常使用固定比例计算量低,简单易用不充分利用数据数据集较大时
自助采样交叉验证通用通过自助采样的方式随机采样训练集充分利用数据,对于小样本数据集效果好计算量较大,可能会产生相似的训练样本,引入估计偏差数据集较小,或者需要处理小样本数据时
蒙特卡洛交叉验证通用随机重复采样和验证可以得到对数据的全面评估计算量非常大需要对模型进行全面评估时
重复随机子采样交叉验证通用通过随机子采样的方式重复采样训练集充分利用数据,减少因样本选择的随机性引起的评估误差计算量较大,可能会产生相似的训练样本,引入估计偏差数据集较小,或者需要处理小样本数据时

 

1. K折交叉验证(K-fold cross-validation)

  • 介绍: 将数据集分成K个大小相似的互斥子集,称为“折叠”(fold)。然后,对模型进行K次训练和测试,在每次训练中,使用K-1个折叠作为训练集,剩下的一个折叠作为测试集。
  • 优点: 充分利用数据,减少因数据划分不同而引起的方差;可以评估模型性能的稳定性。
  • 缺点: 计算量较大,因为需要训练和测试K次模型。
  • 使用场景: 适用于数据量较小,但希望充分利用数据进行模型评估和选择的情况。
  • 适用任务: 适用于分类和回归任务。
import numpy as np
from sklearn.model_selection import KFold

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 创建K折交叉验证对象
kf = KFold(n_splits=2, shuffle=True)

# 遍历每一次交叉验证
for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    # 在此处训练和评估模型

2. 分层K折交叉验证(Stratified K-fold cross-validation)

  • 介绍: 与K折交叉验证类似,但是在每个折叠中,类别比例与整个数据集中的类别比例相同。
  • 优点: 在处理不平衡数据集时效果更好,确保每个折叠中类别的分布是相似的。
  • 缺点: 对于较大的数据集,可能会导致计算开销增加。
  • 使用场景: 适用于处理类别不平衡的分类任务。
  • 适用任务: 主要用于分类任务。
import numpy as np
from sklearn.model_selection import StratifiedKFold

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])

# 创建分层K折交叉验证对象
skf = StratifiedKFold(n_splits=2, shuffle=True)

# 遍历每一次交叉验证
for train_index, test_index in skf.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    # 在此处训练和评估模型

3. 时间序列交叉验证(Time Series Split)

  • 介绍: 主要用于时间序列数据,保持数据的时间顺序,将数据集分割成连续的时间段,然后在每个时间段上进行交叉验证。
  • 优点: 考虑到了时间顺序的影响,避免了时间序列数据的信息泄露。
  • 缺点: 可能无法完全适用于非时间序列数据。
  • 使用场景: 适用于时间序列数据的预测任务,如股票价格预测、天气预测等。
  • 适用任务: 主要用于时间序列数据的预测任务。
import numpy as np
from sklearn.model_selection import TimeSeriesSplit

# 创建时间序列数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([1, 2, 3, 4, 5])

# 创建时间序列交叉验证对象
tscv = TimeSeriesSplit(n_splits=3)

# 遍历每一次交叉验证
for train_index, test_index in tscv.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    # 在此处训练和评估模型

4. 留一交叉验证(Leave-One-Out Cross-Validation,LOOCV) 

  • 介绍: 将数据集中的每个样本单独作为测试集,其他样本作为训练集,重复进行N次(N为样本数量),最终取平均。
  • 优点: 对数据进行了最大程度的利用,可以有效减小因为样本数量较少而引起的方差。
  • 缺点: 计算开销较大,因为需要训练和评估N次模型。
  • 使用场景: 适用于数据量较小且计算资源充足的情况。
  • 适用任务: 适用于分类和回归任务。
import numpy as np
from sklearn.model_selection import LeaveOneOut

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 创建Leave-One-Out交叉验证对象
loo = LeaveOneOut()

# 遍历每一次交叉验证
for train_index, test_index in loo.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    # 在此处训练和评估模型

5. 留P交叉验证(Leave-P-Out Cross-Validation,LPOCV)

  • 介绍: 类似于Leave-One-Out交叉验证,但是每次将P个样本作为测试集,其余样本作为训练集,重复进行多次。
  • 优点: 在一定程度上减小了计算开销,同时保持了较高的样本利用率。
  • 缺点: 计算开销仍然较大,特别是对于大样本量的数据集。
  • 使用场景: 适用于数据量较大,但仍希望充分利用数据进行模型评估的情况。
  • 适用任务: 适用于分类和回归任务。
import numpy as np
from sklearn.model_selection import LeavePOut

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 创建Leave-P-Out交叉验证对象
lpocv = LeavePOut(p=2)

# 遍历每一次交叉验证
for train_index, test_index in lpocv.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    # 在此处训练和评估模型

6. 重复K折交叉验证(Repeated K-Fold Cross-Validation)

  • 介绍: 重复K折交叉验证多次,每次随机重新划分数据集。
  • 优点: 能够更好地评估模型的稳定性和泛化性能。
  • 缺点: 计算开销较大,因为需要重复多次K折交叉验证。
  • 使用场景: 适用于需要更准确评估模型性能和泛化能力的情况。
  • 适用任务: 适用于分类和回归任务。
import numpy as np
from sklearn.model_selection import RepeatedKFold

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 创建Repeated K-fold交叉验证对象
rkf = RepeatedKFold(n_splits=2, n_repeats=2)

# 遍历每一次交叉验证
for train_index, test_index in rkf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    # 在此处训练和评估模型

7. 留出交叉验证(Holdout Cross-Validation)

  • 介绍: 将数据集划分为训练集和测试集,通常使用较大比例的数据作为训练集,而剩余部分作为测试集。
  • 优点: 简单易用,计算开销小。
  • 缺点: 对划分方式较为敏感,可能因为随机性而导致评估结果不稳定。
  • 使用场景: 适用于数据量较大的情况,但不适用于数据量较小的情况,因为可能会导致训练集和测试集的样本偏差。
  • 适用任务: 主要用于分类和回归任务。
import numpy as np
from sklearn.model_selection import train_test_split

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

8. 自助采样交叉验证(Bootstrap Cross-Validation)

  • 介绍: 通过有放回地随机抽样生成多个大小相同的训练集和测试集,然后对每个训练集和测试集进行模型训练和评估。
  • 优点: 可以对模型的稳定性和泛化性能进行更准确的评估,特别适用于小样本数据集。
  • 缺点: 计算开销较大,因为需要进行多次重采样。
  • 使用场景: 适用于小样本数据集和需要对模型稳定性进行更准确评估的情况。
  • 适用任务: 主要用于分类和回归任务。
import numpy as np
from sklearn.utils import resample

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 创建Bootstrap交叉验证对象
n_iterations = 5
n_samples = len(X)
for i in range(n_iterations):
    X_train, X_test, y_train, y_test = resample(X, y, n_samples=n_samples, replace=True)

9. 蒙特卡洛交叉验证(Monte Carlo Cross-Validation)

  • 介绍: 通过随机地多次将数据集划分为训练集和测试集,并对每次划分进行模型训练和评估。
  • 优点: 可以提供更准确的评估结果,对数据集的划分更加灵活。
  • 缺点: 计算开销较大,因为需要进行多次随机划分。
  • 使用场景: 适用于对模型性能进行更准确评估,并希望对数据集划分进行更灵活控制的情况。
  • 适用任务: 主要用于分类和回归任务。
import numpy as np
from sklearn.model_selection import ShuffleSplit

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 创建Monte Carlo交叉验证对象
n_iterations = 5
ss = ShuffleSplit(n_splits=n_iterations, test_size=0.2, random_state=42)

# 遍历每一次交叉验证
for train_index, test_index in ss.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    # 在此处训练和评估模型

10. 重复随机子采样交叉验证(Repeated Random Subsampling Cross-Validation)

  • 介绍: 通过多次随机子采样来构建训练集和测试集,每次采样得到不同的训练集和测试集,并重复此过程多次以获得更稳健的评估结果。
  • 优点: 能够在不同的训练集和测试集上进行多次评估,提供对模型性能的更加稳健的估计。
  • 缺点: 计算成本较高,需要多次重复采样和训练模型。
  • 使用场景: 用于需要更稳健的性能评估的情况,或者对模型性能进行一致性验证。
  • 适用任务: 通用的机器学习任务,特别是需要对模型性能进行稳健性评估的情况。
import numpy as np
from sklearn.model_selection import ShuffleSplit, cross_val_score

# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])

# 定义重复次数
n_repeats = 5

# 定义随机子采样交叉验证
rss_cv = ShuffleSplit(n_splits=10, test_size=0.3, random_state=42)

# 使用交叉验证评估模型
scores = cross_val_score(model, X, y, cv=rss_cv, n_jobs=-1)

# 输出结果
for i, score in enumerate(scores):
    print(f"Cross-validation run {i+1}: {score}")

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

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

相关文章

centos7.9安装es7.12.0

下载es 国内镜像:https://mirrors.huaweicloud.com/elasticsearch/7.12.0/ 下载并上传内容到/usr/local目录下 解压: tar -zxvf /uar/local/elasticsearch-7.12.0-linux-x86_64.tar.gz安装 es一般不能用root启动,因此需要创建es:es用户和…

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时,使用的用户名,可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…

通过 Apple Vision Pro 释放创造力:深入研究空间计算

Apple 最新进军空间计算领域的 Apple Vision Pro,标志着重新定义我们与技术交互方式的重大飞跃。空间计算超越了传统界限,允许用户以无缝集成到物理世界的方式参与 2D 和 3D 内容。 我们可以关注两种类型的体验: 在空间中渲染 2D 内容。这涉及将现有设备窗口投影到空间领域…

某能源集团电力公司搭建数据报表中心,实现采集填报分析一体化

​在当今这个信息爆炸的时代,数据已成为企业最宝贵的财富,越来越多的企业开始重视数据的积累和归集。在企业日常生产和工作过程中,会产生绵延不断的数据,但这些数据往往没有统一的记录、归纳和整理,或者录入了系统却分…

广汽原车控制系统CAN协议控制汽车基本信息获取及数据应用

在现代汽车工业的迅速发展中,车辆控制系统的智能化和网络化已成为提升汽车性能的关键。广汽作为中国汽车行业的佼佼者,其在原车通信网络方面也取得了显著的成就。特别是广汽原车CAN(Controller Area Network)协议的应用&#xff0…

AC/DC电源模块在工业自动化领域的应用探析

BOSHIDA AC/DC电源模块在工业自动化领域的应用探析 AC/DC电源模块是一种将交流电转换为直流电的电力转换设备,在工业自动化领域具有广泛的应用。本文将从稳定性、效率和可靠性三个方面对AC/DC电源模块在工业自动化领域的应用进行探析。 首先,AC/DC电源模…

【SQL】SQL常见面试题总结(1)

目录 1、检索数据1.1、从 Customers 表中检索所有的 ID1.2、检索并列出已订购产品的清单1.2、检索所有列 2、排序检索数据2.1、检索顾客名称并且排序2.2、对顾客 ID 和日期排序2.3、按照数量和价格排序2.4、检查 SQL 语句 3、过滤数据3.1、返回固定价格的产品3.2、返回产品并且…

React 第三十七章 Scheduler 最小堆算法

在 Scheduler 中&#xff0c;使用最小堆的数据结构在对任务进行排序。 // 两个任务队列 var taskQueue: Array<Task> []; var timerQueue: Array<Task> [];push(timerQueue, newTask); // 像数组中推入一个任务 pop(timerQueue); // 从数组中弹出一个任务 time…

【漏洞复现】用友 NC portal-registerServlet JNDI注入漏洞

0x01 产品简介 用友NC是用友网络科技股份有限公司开发的一款大型企业数字化平台。它主要用于企业的财务核算、成本管理、资金管理、固定资产管理、应收应付管理等方面的工作,致力于帮助企业建立科学的财务管理体系,提高财务核算的准确性和效率。 0x02 漏洞概述 用友NC存在…

Elasticsearch 在滴滴的应用与实践

滴滴 Elasticsearch 简介 简介 Elasticsearch 是一个基于 Lucene 构建的开源、分布式、RESTful 接口的全文搜索引擎&#xff0c;其每个字段均可被索引&#xff0c;且能够横向扩展至数以百计的服务器存储以及处理 TB 级的数据&#xff0c;其可以在极短的时间内存储、搜索和分析大…

登录接口取到token,加到请求头中,通过服务器验证#Vue3

登录接口取到token&#xff0c;加到请求头中&#xff0c;通过服务器验证#Vue3 Token验证的基本流程 1.服务端收到请求&#xff0c;去验证用户名与密码 2.验证成功后&#xff0c;服务端会签发一个 Token&#xff0c;再把这个 Token 发送给客户端 3.客户端收到 Token 以后可以把它…

Linux文件系统详解

&#x1f30e;Linux文件系统 文章目录&#xff1a; Linux文件系统 简单认识磁盘 文件系统       磁盘线性结构抽象       文件系统存储方法 inode Table         inode Bitmap         Data Block         Block Bitmap         …

【漏洞复现】方正全媒体采编系统密码泄露漏洞

0x01 产品简介 方正全媒体新闻采编系统是一个面向媒体深度融合的技术平台&#xff0c;它以大数据和AI技术为支撑&#xff0c;集成了指挥中心、采集中心、编辑中心、发布中心、绩效考核中心、资料中心等多个功能&#xff0c;全面承载“策采编审发存传评”的融媒体业务流程。 0…

爱吃香蕉的珂珂

题目链接 爱吃香蕉的珂珂 题目描述 注意点 piles.length < h < 10^9如果某堆香蕉少于k根&#xff0c;将吃掉这堆的所有香蕉&#xff0c;然后这一小时内不会再吃更多的香蕉返回可以在 h 小时内吃掉所有香蕉的最小速度 k&#xff08;k 为整数&#xff09; 解答思路 二…

Find My资讯|苹果 iOS 17.5 率先执行跨平台反跟踪器标准

苹果和谷歌公司于 2023 年 5 月宣布推出“检测预期外位置追踪器”&#xff08;Detecting Unwanted Location Trackers&#xff09;行业标准&#xff0c;经过 1 年多的打磨之后&#xff0c;该标准目前已通过 iOS 17.5 部署到 iPhone 上。谷歌也将为运行 Android 6.0 或更高版本的…

【从零开始学架构 架构基础】二 架构设计的复杂度来源:高性能复杂度来源

架构设计的复杂度来源其实就是架构设计要解决的问题&#xff0c;主要有如下几个&#xff1a;高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键&#xff0c;就是新旧技术之间不是完全的替代关系&#xff0c;有交叉&#xff0c;有各自的特点&#xff0c;所以才需要具体…

FestDfs快速安装和数据迁移同步。Ubuntu环境

一&#xff1a;防火墙 ufw status 二&#xff1a;下载 分别是&#xff08;环境依赖&#xff0c;网络模块依赖&#xff0c;安装包&#xff09; git clone https://github.com/happyfish100/libfastcommon.git git clone https://github.com/happyfish100/libserverframe.git …

package-lock.json导致npm install安装nyc出现超时错误

一、背景 前端项目在npm install安装依赖&#xff0c;无法下载组件nyc&#xff0c;详细报错信息&#xff1a; npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/nyc/download/nyc-13.3.0.tgz?cache0&a…

析构函数详解

目录 析构函数概念特性对象的销毁顺序 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;️ C语言例题 &…

开源标注工具LabelMe的使用

开源标注工具LabelMe使用Python实现&#xff0c;并使用Qt作为其图形界面&#xff0c;进行图像多边形标注。源码地址:https://github.com/labelmeai/labelme &#xff0c;最新发布版本为v5.4.1&#xff0c;它遵循GNU通用公共许可证的条款。 1.Features (1).多边形、矩形、圆形、…