几种交叉验证法(超详细)

交叉验证

交叉验证是一种用来评价一个训练出的模型是否可以推广到另一个数据结构相同的数据集上的方法。主要用于PCR 、PLS 回归建模等建模应用中。

交叉验证有时也称为交叉比对,如:10折交叉比对。主要用于估计一个预测模型在实际数据应用中的准确度。它是一种统计学上将数据样本切割成较小子集的实用方法。首先在一个子集上做训练, 而其它子集则用来做后续对此分析的确认及验证。

一个交叉验证将样本数据集分成两个互补的子集,一个子集用于训练分类器或模型,被称为训练集(training set);另一个子集用于验证训练出的分类器或模型是否有效,被称为测试集(testing set)。测试结果作为分类器或模型的性能指标。而我们的目的是得到高度预测精确度和低的预测误差。为了保证交叉验证结果的稳定性,对一个样本数据集需要多次不同的划分,得到不同的互补子集,进行多次交叉验证。取多次验证的平均值作为验证结果。

几种交叉验证方法

1、随机子抽样验证(Hold-Out Method)
介绍:常识来说,Hold-Out 验证并非一种交叉验证,因为数据并没有交叉使用。该方法将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为分类器的性能指标。相对K-CV又被称为2-CV。

**优点:**处理简单,只需随机把原始数据分为两组即可。

**缺点:**有些样本可能从未做过训练或测试数据,而有些样本不止一次选为训练或测试数据。另外训练集样本数太少,通常不足以代表母体样本的分布,导致 test 阶段辨识率容易出现明显落差。

2、K折交叉验证(K-fold Cross Validation)
**介绍:**作为2-CV的演进,将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2。而K-CV 的实验共需要建立 k 个models,并计算 k 次 test sets 的平均辨识率。在实作上,k 要够大才能使各回合中的训练样本数够多,一般而言 k=10 (作为一个经验参数)算是相当足够了。

优点: K-CV使得每一个样本数据都既被用作训练数据,也被用作测试数据,可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性。

缺点: K值的选择

3、留一法交叉验证(Leave-One-Out Cross Validation)
**介绍:**如果设原始数据有N个样本,那么每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标。

优点:
a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠;
b. 实验没有随机因素,整个过程是可重复的。

缺点: 计算成本高,当N非常大时,计算耗时。除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间。

在模式识别与机器学习的相关研究中,经常会将数据集分为训练集与测试集这两个子集,前者用以建立模式,后者则用来评估该模式对未知样本进行预测时的精确度,即泛化能力(generalization ability)。

交叉验证核心原则

Cross-validation 是为了有效的估测 generalization error 所设计的实验方法,只有训练集才可以用在模式的训练过程中,测试集则必须在模式完成之后才被用来评估模式优劣的依据。

数据集分割原则

原始数据集分割为训练集与测试集,必须遵守两个要点:
1、训练集中样本数量必须够多,一般至少大于总样本数的 50%;
2、两组子集必须从完整集合中均匀取样。均匀取样的目的是希望尽量减少训练集/测试集与完整集合之间的偏差。一般的作法是随机取样,当样本数量足够时,便可达到均匀取样的效果。

### 常见的交叉验证及其优缺点 #### 留出 (Hold-Out) 留出是一种简单的划分训练集和测试集的方。数据被随机分成两部分,一部分用于模型训练,另一部分用于评估模型性能。 - **优点**: 实现简单,计算成本低。 - **缺点**: 结果可能依赖于特定的数据分割方式,可能导致较大的方差[^1]。 --- #### k交叉验证 (K-Fold Cross Validation) k交叉验证将数据分为k个子集(folds),每次选取其中一个作为测试集,其余作为训练集。重复此过程k次,最终取平均值作为模型性能指标。 - **优点**: 更充分利用数据,减少因数据划分带来的偏差;适合中小型数据集。 - **缺点**: 计算开销较大,尤其是当k值较高时。 ```python from sklearn.model_selection import KFold kf = KFold(n_splits=5, shuffle=True, random_state=42) 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] ``` --- #### 留一 (Leave-One-Out Cross Validation, LOOCV) LOOCV 是一种特殊的k交叉验证,其中k等于样本数量。即每次仅保留一个样本作为测试集,其他所有样本都用来训练模型。 - **优点**: 几乎无偏估计,因为几乎所有的数据都被用于训练。 - **缺点**: 对大数据集不适用,计算复杂度高;结果可能存在较高的方差。 --- #### 自助 (Bootstrapping) 自助通过对原始数据进行有放回抽样构建多个训练集,未被选中的样本则构成测试集。 - **优点**: 特别适用于小型数据集,能够有效缓解数据不足的问题。 - **缺点**: 可能会引入一定的偏差,尤其是在类别分布不平衡的情况下。 ```python import numpy as np n_samples = len(X) bootstrap_indices = np.random.choice(range(n_samples), size=n_samples, replace=True) X_bootstrap = X[bootstrap_indices] y_bootstrap = y[bootstrap_indices] test_mask = ~np.isin(np.arange(n_samples), bootstrap_indices) X_test = X[test_mask] y_test = y[test_mask] ``` --- #### 嵌套交叉验证 (Nested Cross-Validation) 嵌套交叉验证主要用于超参数调优和模型选择场景。外层循环负责评估模型泛化能力,内层循环用于优化模型参数。 - **优点**: 提供了更为可靠的模型性能评估,避免了过度拟合到特定的超参数组合上[^2]。 - **缺点**: 运行时间较长,资源消耗大。 --- ### 各种方的应用场景 | 方 | 适用场景 | |-------------------|------------------------------------------------------------------------| | 留出 | 数据量充足且不需要精确评估的小型项目。 | | k交叉验证 | 中小型数据集上的常规模型评估任务,特别是需要平衡偏差与方差的情况。 | | 留一 | 小规模数据集或对模型误差敏感的任务,例如生物医学研究中个体差异显著的情形。 | | 自助 | 当可用数据有限而无满足传统划分需求时使用。 | | 嵌套交叉验证 | 超参数调优阶段,需同时完成模型选择与性能评估的大规模实验设计。 | ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

data大柳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值