交叉验证是一种用于评估模型性能和减少过拟合风险的统计学方法。它将数据集划分为训练集和验证集,模型在不同的子集上进行训练和评估,从而更全面地评估其泛化性能。
为什么要交叉验证?
- 评估模型性能: 交叉验证可以提供对模型性能的更可靠估计。通过在不同的训练和验证集上多次运行模型,可以减小对单一划分的依赖,使得性能评估更具可信度。
- 减少过拟合风险: 交叉验证有助于减小过拟合的风险。通过在不同的子集上训练模型,可以更好地捕捉数据中的模式,而不仅仅是过度适应某个特定的训练集。
- 利用有限数据: 在数据集较小的情况下,交叉验证是一种有效的方法,因为它允许充分利用有限的数据来进行模型评估。不同的子集提供了对模型在不同数据情境下的表现的见解。
- 选择合适的模型: 通过比较不同模型在不同数据子集上的性能,可以更好地选择适合特定问题的模型。这对于调优超参数或选择算法非常有用。
常见的交叉验证
对不同数据分布的适应:在实际应用中,数据的分布可能会发生变化。通过交叉验证,模型可以在不同的数据子集上进行评估,从而更好地适应可能的数据变化。有⼏种类型的交叉检验技术最为流行和广泛使用。其中包括:
k 折交叉检验
分层 k 折交叉检验
暂留交叉检验
留一交叉检验
分组k折交叉检验
k 折交叉检验
K折交叉验证(K-Fold Cross-Validation)是一种常用的交叉验证技术,它将数据集分成K个折(fold),然后进行K次模型训练和评估。在每一次迭代中,模型使用K-1个折作为训练集,剩余的1个折作为验证集。这个过程重复K次,确保每个折都被用作验证集一次。K的常见取值为5或10,但实际上可以根据数据集的大小和复杂性进行调整。K折交叉验证的主要优点是充分利用了数据集,同时减小了对单一划分的依赖性,提供了更可靠的模型评估。
在scikit-learn中,可以使用KFold类来实现K折交叉验证。
分层 k 折交叉检验
分层K折交叉验证(Stratified K-Fold Cross-Validation)是K折交叉验证的一种变体,特别适用于处理分类问题,并确保每个折中的类别分布与整个数据集中的类别分布相似。这有助于确保在每个训练和验证折中都包含每个类别的样本,从而更全面地评估模型性能,尤其是在类别不平衡的情况下。
在scikit-learn中,可以使用StratifiedKFold类来实现分层K折交叉验证。
暂留交叉检验
如果数据量很⼤,该怎么办呢?假设我们有 100万个样本。5倍交叉检验意味着在 800k 个样本 上进⾏训练,在 200k 个样本上进⾏验证。根据我们选择的算法,对于这样规模的数据集来说, 训练甚⾄验证都可能⾮常昂贵。在这种情况下,我们可以选择暂留交叉检验。 创建保持结果的过程与分层 k 折交叉检验相同。对于拥有 100 万个样本的数据集,我们可以创建 10 个折叠⽽不是 5 个,并保留其中⼀个折叠作为保留样本。这意味着,我们将有 10 万个样本被 保留下来,我们将始终在这个样本集上计算损失、准确率和其他指标,并在 90 万个样本上进⾏训练。在处理时间序列数据时,暂留交叉检验也⾮常常⽤。假设我们要解决的问题是预测⼀家商店 2020 年的销售额,⽽我们得到的是 2015-2019 年的所有数据。在这种情况下,你可以选择 2019 年的 所有数据作为保留数据,然后在 2015年⾄ 2018 年的所有数据上训练你的模型。这种策略的选择通常取决于具体的问题和计算资源的限制。如果训练和验证都很昂贵,而你的数据集又很大,那么这种暂留交叉检验可能是一个有效的折衷方案。
留一交叉检验
留一法交叉验证(Leave-One-Out Cross-Validation,简称LOOCV)是一种极端的交叉验证方法,它将每个样本作为一个独立的验证集,而剩余的样本作为训练集。这意味着在有N个样本的数据集中,会执行N次迭代,每次迭代中,一个样本被留出作为验证集,而其余N-1个样本被用于训练。LOOCV的优点是提供了对模型性能的无偏估计,因为每个样本都有机会作为验证集。然而,它的计算成本很高,特别是对于大型数据集,因为需要进行N次训练,每次都需要在几乎相同的训练集上进行。
在scikit-learn中,可以使用LeaveOneOut类来实现留一法交叉验证。
分组K折交叉验证
分组K折交叉验证(Group K-Fold Cross-Validation)是一种特殊形式的交叉验证,特别适用于处理数据集中存在分组结构的情况。这种分组结构可能是由于数据中的某些样本具有相似性或相关性,需要保证在训练集和验证集中都有这些相关样本。在分组K折交叉验证中,数据集被划分为K个折,确保每个分组中的样本在整个交叉验证过程中都只出现在训练集或验证集中。这对于处理类似家庭、实验批次、地理位置等分组信息的数据集非常有用。
在scikit-learn中,可以使用GroupKFold类来实现分组K折交叉验证。