最近在学习深度学习时,碰到如何对原始数据的处理(分为训练集和验证集)问题,便在网上搜集了下关于交叉验证(cross-validation)的一些知识。
声明:此篇博客是从网上搜集,并加以整理所得
交叉验证(cross-validation)
1. 什么是交叉验证
交叉验证(Cross validation),交叉验证用于防止模型过于复杂而引起的过拟合。有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力(generalize)。
2. 交叉验证的方法
-
留出法 (holdout cross validation)
- 在机器学习任务中,拿到数据后,我们首先会将原始数据集分为三部分:训练集、验证集和测试集。
- 训练集用于训练模型,验证集用于模型的参数选择配置,测试集对于模型来说是未知数据,用于评估模型的泛化能力。对于留出法,这个方法操作简单,只需随机把原始数据分为三组即可;一般如果只做一次分割,它对训练集、验证集和测试集的样本数比例,还有分割后数据的分布是否和原始数据集的分布相同等因素比较敏感,不同的划分会得到不同的最优模型,而且分成三个集合后,用于训练的数据更少了。一般留出法的验证集和测试集等同。
-
k 折交叉验证(k-fold cross validation)
- k个子集,每个子集均做一次测试集,其余的作为训练集。交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果。
- 10-folder通常被使用。k 折交叉验证通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感。
- 优点:所有的样本都被作为了训练集和测试集,每个样本都被验证一次。
- 具体步骤如下:
-
- 不重复抽样将原始数据随机分为 k 份。
-
- 每一次挑选其中 1 份作为测试集,剩余 k-1 份作为训练集用于模型训练。
-
- 重复第二步 k 次,这样每个子集都有一次机会作为测试集,其余机会作为训练集。在每个训练集上训练后得到一个模型,用这个模型在相应的测试集上测试,计算并保存模型的评估指标;
-
- 计算 k 组测试结果的平均值作为模型精度的估计,并作为当前 k 折交叉验证下模型的性能指标。
-
留一法(Leave one out cross validation)
- 每次的测试集都只有一个样本,要进行 m 次训练和预测。这个方法用于训练的数据只比整体数据集少了一个样本,因此最接近原始样本的分布。
- 但是训练复杂度增加了,因为模型的数量与原始数据样本数量相同。一般在数据缺乏时使用。
3. KFold、StratifiedKFold、GroupKFold区别
- KFold
kfold直接随机的将数据划分为k折。看代码中的划分,只需要一个X就可以决定了,不受class和group这两个影响。class和group分别为数据的标签和我们给数据的分组。 - StratifiedKFold
StratifiedKFold会根据数据集的分布来划分,使得 划分后的数据集的目标比例和原始数据集近似,也就是构造训练集和测试集分布相同的交叉验证集。 - GroupKFold
GroupKFold 会保证同一个group的数据不会同时出现在训练集和测试集上。因为如果训练集中包含了每个group的几个样例,可能训练得到的模型能够足够灵活地从这些样例中学习到特征,在测试集上也会表现很好。但一旦遇到一个新的group它就会表现很差。
参考: