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

news/2024/11/13 9:12:21/

目录

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.ppmy.cn/news/1461990.html

相关文章

SAP BSEG VS ACDOCA 差异

温习一下 ACDOCA VS BSEG matinal:S4 HANA 详解ACDOCA与BSEG的区别都在这了_sap acdoca-CSDN博客

神经网络案例实战

🔎我们通过一个案例详细使用PyTorch实战 ,案例背景:你创办了一家手机公司,不知道如何估算手机产品的价格。为了解决这个问题,收集了多家公司的手机销售数据:这些数据维度可以包括RAM、存储容量、屏幕尺寸、…

汇昌联信科技:做拼多多网店要押金吗?

做拼多多网店要押金吗?”这个问题,其实与拼多多的平台规则有关。在开店之前,商家需要详细了解平台的各项规定和费用构成,这样才能做好充足的准备。 一、明确回答问题 做拼多多网店,不需要支付押金。拼多多的入驻门槛相对较低&…

Python学习之路 | Python基础语法(一)

数据类型 Python3 中常见的数据类型有: Number(数字)String(字符串)bool(布尔类型)List(列表)Tuple(元组)Set(集合)Dict…

Python 自动化脚本系列:第3集

21. 使用 cryptography 自动化文件加密 Python 的 cryptography 库提供了一种安全的方式,使用对称加密算法对文件进行加密和解密。你可以自动化加密和解密文件的过程来保护敏感数据。 示例:文件加密和解密 假设你想使用对称加密算法加密一个文件&…

linux系统介绍和安装教程(含安装链接放在最下面了)

一、linux系统简介 在Linux和C语言的发展历程中,有几位关键人物为它们的诞生和推广做出了重要贡献。 首先,肯汤姆森(Ken Thompson)是一位在AT&T公司工作的员工,他不仅发明了B语言,还创造了Unix系统。…

AIGC行业现在适合进入吗

人工智能、物联网、基因编辑和量子计算等新兴技术领域正在以前所未有的速度发展,这些技术的结合正在重塑我们的世界。在这个充满机遇和挑战的时代,AIGC(人工智能、基因编辑和量子计算)行业备受关注,许多人都在考虑是否…

一个简单的线下转盘活动,指定记录,有增速度和减速

代码在此&#xff0c;请品尝 在线地址&#xff1a;JS Bin - Collaborative JavaScript Debugging <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"I…