机器学习交叉验证的数据分割算法
交叉验证(cross validation) 是验证分类器性能的一种统计分析方法,基本的思路是在某种意义下将原始数据进行分组,一部分作为训练集,另一部分作为验证集。首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此来作为评价分类器的性能指标。常用的交叉验证方法包括简单交叉验证、K折交叉验证、留一法交叉验证、留P法交叉验证、用户自定义数据集划分等。
下面以iris数据集为例,特征大小为150*4,目标大小为150*1。
![](https://img.haomeiwen.com/i24447700/aa0c2a549e081b5b.png)
1、简单交叉验证train_test_split
简单交叉验证是将原始数据随机分为两组,一组作为训练集,另一组作为验证集。使用sklearn.model_selection中的类train_test_split来完成。可以通过设定明确的 random_state ,设置每次生成的随机数相同,使得伪随机生成器的结果可以重复。
![](https://img.haomeiwen.com/i24447700/a0648ce5fadf6765.png)
2、K折交叉验证KFold
KFold 将所有的样例划分为 k 个组,称为折叠 (fold) (如果 k = n, 这等价于 Leave One Out(留一) 策略),都具有相同的大小。预测函数学习时使用 k - 1 个折叠中的数据,最后一个剩下的折叠会用于测试。使用sklearn.model_selection import 中的类KFold来完成。
![](https://img.haomeiwen.com/i24447700/56a7d758e3aa2c90.png)
3、留一法交叉验证
LeaveOneOut (或 LOO) 是一个简单的交叉验证。每个学习集都是通过除了一个样本以外的所有样本创建的,测试集是被留下的样本。 因此,对于 n 个样本,我们有 n 个不同的训练集和 n 个不同的测试集。这种交叉验证程序不会浪费太多数据,因为只有一个样本是从训练集中删除掉的。使用sklearn.model_selection 中的类LeaveOneOut 。
![](https://img.haomeiwen.com/i24447700/18b2386740e165ca.png)
4、留P法交叉验证
LeavePOut 与 LeaveOneOut 非常相似,因为它通过从整个集合中删除 p 个样本来创建所有可能的 训练/测试集。对于 n 个样本,这产生了 {n \choose p} 个 训练-测试 对。与 LeaveOneOut 和 KFold 不同,当 p > 1 时,测试集会重叠。使用sklearn.model_selection 中的类LeavePOut 。
![](https://img.haomeiwen.com/i24447700/c2ac9655a82f2b53.png)
5、用户自定义数据集划分ShuffleSplit
ShuffleSplit迭代器将会生成一个用户给定数量的独立的训练/测试数据划分,样例首先被打散然后划分为一对训练测试集合。使用sklearn.model_selection中的类ShuffleSplit。
![](https://img.haomeiwen.com/i24447700/57daa4c32b29b746.png)
基于类标签、具有分层的交叉验证迭代器解决样本不平衡问题。 使用StratifiedKFold和Stratified-ShuffleSplit 分层抽样。 一些分类问题在目标类别的分布上可能表现出很大的不平衡性,例如可能会出现比正样本多数倍的负样本。在这种情况下,建议采用如 StratifiedKFold 和 StratifiedShuffleSplit 中实现的分层抽样方法,确保相对的类别频率在每个训练和验证折叠中大致保留。
6、分层K折交叉验证StratifiedKFold
StratifiedKFold**是 k-fold 的变种,会返回 stratified(分层) 的折叠。每个小集合中, 各个类别的样例比例大致和完整数据集中相同。使用sklearn.model_selection 中的类StratifiedKFold 。
![](https://img.haomeiwen.com/i24447700/8899b807bfad9433.png)
7、分层随机交叉验证StratifiedShuffleSplit
StratifiedShuffleSplit**是 ShuffleSplit 的一个变种,会返回直接的划分,比如创建一个划分,但是划分中每个类的比例和完整数据集中的相同。
![](https://img.haomeiwen.com/i24447700/371be6ee287c3e6f.png)
8、时间序列分割TimeSeriesSplit
TimeSeriesSplit是 k-fold 的一个变体,它首先返回 k 折作为训练数据集,并且 (k+1) 折作为测试数据集。 请注意,与标准的交叉验证方法不同,连续的训练集是超越前者的超集。 另外,它将所有的剩余数据添加到第一个训练分区,它总是用来训练模型。
![](https://img.haomeiwen.com/i24447700/786f4463aea24fc0.png)
用于分组数据的交叉验证迭代器进一步测试模型的泛化能力。留出一组特定的不属于测试集和训练集的数据。有时我们想知道在一组特定的 groups 上训练的模型是否能很好地适用于看不见的 group 。为了衡量这一点,我们需要确保验证对象中的所有样本来自配对训练折叠中完全没有表示的组。
9、GroupKFold
GroupKFold是 k-fold 的变体,它确保同一个 group 在测试和训练集中都不被表示。
10、LeaveOneGroupOut
LeaveOneGroupOut是LeaveOneOut的变体,为每个训练/测试集删除与 一 组有关的样本。
11、LeavePGroupsOut
LeavePGroupsOut类似于 LeaveOneGroupOut ,但为每个训练/测试集删除与 P 组有关的样本。
12、GroupShuffleSplit
GroupShuffleSplit迭代器是 ShuffleSplit 和 LeavePGroupsOut 的组合,它生成一个随机划分分区的序列,其中为每个分组提供了一个组子集。