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

目录

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}")

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

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

相关文章

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…

Java内存模式以及volatile关键字的使用

1.Java内存模型 (1)Java 内存模型(Java Memory Model,简称 JMM),它是一个抽象的概念,JMM是和多线程相关的,它是一组规范,描述了一组规则,定义了多线程对共享…

“图生视频”技术创新:剪贴画秒变动画生成的实验验证与分析

在最近的研究进展中,AniClipart系统的问世标志着文本到视频生成技术的一个重要里程碑。这一系统由香港城市大学和莫纳什大学的研究者们共同开发,旨在解决将静态剪贴画图像根据文本提示自动转换成动画序列的挑战。传统的动画制作流程繁琐且耗时&#xff0…

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 展会背景: 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办&#xff…

用友GRP-U8 bx_dj_check.jsp SQL注入漏洞复现(XVE-2024-10537)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

NSSCTF | [SWPUCTF 2021 新生赛]babyrce

打开题目&#xff0c;显示了一个php脚本 我们来分析一下这个脚本是什么意思 <?php error_reporting(0); header("Content-Type:text/html;charsetutf-8"); highlight_file(__FILE__); if($_COOKIE[admin]1) {include "../next.php"; } elseecho &quo…

传统FTP弊端显现 国产ftp要如何选择?

FTP&#xff08;File Transfer Protocol&#xff09;是一个用于在网络上的计算机之间传输文件的协议。它属于网络协议组的应用层&#xff0c;主要用于文件的上传、下载和文件管理操作&#xff0c;是一种比较通用、操作也比较简单的传输方式。不过随着国产化大浪潮的推进&#x…

【线性系统理论】笔记三

能控性判别 约当标准型 总结&#xff1a; 秩的判据 能观性判别 秩判据 能控Ⅰ型&能控Ⅱ型 1型 2型 能控性分解&能观型分解

vue+element 验证输入框是否包含特殊字符(赠送ip+域名双验证判断)

1 效果: 2 添加element自定义验证方法 rules{ dbConfig.address: [ { required: true, validator: validatehost_ip, trigger: blur } ] } 3 添加对应方法 var validatehost_ip (rule, value, callback) > {if (!value) {callback(new Error(地址不可为空))} else {//验…

OpenFeign替代品:Spring6 新增的http exchange 如何设置拦截器

前言 OpenFeign已经被认为是功能完备了&#xff0c;后续不再更新新功能&#xff0c;新出来的 http exchange 可以实现类似的功能。 在使用Openfeign的时候&#xff0c;我们通常会使用它的拦截器来实现认证token的填写等统一处理&#xff0c;那么&#xff0c;在使用Http exchan…

MY SQL 实验四:

一、实验目的 通过该实验掌握较复杂的SQL 查询数据库方法&#xff0c;包括嵌套查询&#xff0c;相关与不相关子查询&#xff0c;连接的多种方法等。 二、实验原理 数据库查询是数据库的核心操作。SQL语言提供了SELECT语句进行数据库的查询。 SELECT[ALL|DISTINCT]<目标列表达…

enable_shared_from_this 实现原理

前言 enable_shared_from_this 可以帮助我们用 this 指针安全地创建 shared_ptr。 enable_shared_from_this 假设我们的程序使用 shared_ptr 管理 Widget 对象&#xff0c;我们用一个 vector 来记录已经处理过的 Widget 对象&#xff1a; std::vector<std::shared_ptr&l…

OSError: [WinError 1455] 页面文件太小,无法完成操作 的问题

实质问题是报错&#xff1a;caffe2_detectron_ops.dll“ or one of its dependencies 还需要安装一个包&#xff1a; pip install intel-openmp 安装之后顺利测试通过。

使用可接受gitlab参数的插件配置webhook

jenkins配置 安装Generic Webhook Trigger 配置远程触发令牌 勾选Print post content和Print contributed variables用于打印值 配置gitlab 选择新增webhook 配置webhook http://JENKINS_URL/generic-webhook-trigger/invoke,将JENKINS_URL修改成自己的jenkins地址 先保存…

【考研数学】准备开强化,更「张宇」还是「武忠祥」?

数一125学长前来回答&#xff0c;选择哪位老师的课程&#xff0c;这通常取决于你的个人偏好和学习风格&#xff01; 张宇老师和武忠祥老师都是非常有经验的数学老师&#xff0c;他们的教学方法各有特点。 张宇老师的教学风格通常被认为是通俗易懂&#xff0c;善于将复杂的概念…

【JS】基于原生JavaScript的大文件切片上传及断点续传实现

基于原生JavaScript的大文件切片上传及断点续传实现 在现代Web应用中,大文件上传是一个常见但具有挑战性的功能。随着文件大小的增加,如何高效可靠地上传文件至服务器成为亟待解决的问题。在本文中,我将介绍如何使用原生JavaScript实现大文件切片上传及断点续传功能。 为什…

嵌入式开发十四:按键输入实验

前面两个实验&#xff0c;我们介绍了 STM32F4 的 IO 口作为输出的使用&#xff0c;这一次&#xff0c;我们将向大家介绍如何使用 STM32F4 的 IO 口作为输入用。我们将利用板载的 4 个按键&#xff0c;来控制板载的两个 LED 的亮灭和蜂鸣器。通过本次的学习&#xff0c;你将了解…

C语言输出符

C语言输出符 以下是C语言中一些常用的格式化输出的格式控制符及其对应的数据类型&#xff1a; 格式控制符描述对应数据类型%d十进制有符号整数int%ld长整型long int%lld长长整型long long int%u十进制无符号整数unsigned int%lu无符号长整型unsigned long int%llu无符号长长整…

从独立开发者到成为SeaTunnel社区的贡献者,我做对了哪些事儿?

个人介绍 大家好&#xff0c;我是闫成雨&#xff0c;目前是一名独立开发者。专注于数据开发、机器学习、资源调度算法和分布式系统。 GitHub ID: CheneyYin 个人主页&#xff1a;https://cheneyyin.github.io/ 为社区做了哪些贡献 加强了Spark引擎和Flink引擎对SeaTunnel数据…

2024年最新软件测试面试题必问的1000题!

我了解的测试理论和方法包括以下几个方面&#xff1a; 黑盒测试与白盒测试&#xff1a; 黑盒测试&#xff1a;基于对软件系统外部行为进行测试&#xff0c;独立于内部代码实现细节。黑盒测试关注输入与输出之间的关系以及软件功能是否符合预期。白盒测试&#xff1a;基于对软件…