0 参考资料
【全网最全】一文详解机器学习中的7种交叉验证方法_交叉验证.-CSDN博客
1 总结
Cross-Validtion两大功能
-
模型评估-更科学
-
模型选择-充分榨干有限数据集
Cross-Validtion | 适用情景 | 目的 |
---|---|---|
Hold out保留交叉验证 | 数据集数量多 | 探究不同训练超参数 对于模型的性能影响 |
K-fold交叉验证 | 数据量少,数据标签均衡 最常用 | 减少数据集对于模型的影响 增加模型评价指标的科学性,说服力 同组训练超参数 下,寻找最佳模型内部参数 |
Leave one out交叉验证 | 数据集数量极少 | K-fold的特殊情景 以计算难度时间消耗,弥补数据集不足 |
分层K折交叉验证 | 数据集数量少、标签分布不均衡 | K-fold的标签不均衡下的拓展 |
Boostrapping | 解决分组的随机性 | |
蒙特卡罗交叉验证(Shuffle Split) | ||
时间序列交叉验证 | 时间序列数据、数据集数量少 | 解决时间序列数据分组破坏时序结构的问题 |
2 什么是交叉验证
交叉验证Cross Validation
顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在下次可能成为测试集中的样本,即所谓“交叉”。
3 交叉验证有何作用?
应用条件
数据集不是很充足的情况
作用
-
模型评价,评估模型的性能参数
-
即探究在同一组训练参数下,在不同训练集、验证集下的模型性能
-
在数据集不充足条件下,减少数据集的随机性对模型性能的影响
-
模型训练过程中,用于选择模型Model selection
-
验证模型并非是过拟合的
-
在小样本数据集中,模型性能普遍会比较好,此时会有过拟合的嫌疑,但是又没有多余的数据供我们去验证,采用交叉验证,来验证模型是否过拟合
4 HoldOut保留交叉验证
概念
最一般的,初步时应用的
整个数据集被随机划分为训练集和验证集。根据经验,整个数据集的近 70% 用作训练集,其余 30% 用作验证集。
作用
-
探究在相同训练集中,调整模型的超参数,选择合适的评价指标,看模型的性能
-
即根据评价指标,确定最为适合的模型超参数
适用情景
数据集数量足够大、标签分布均衡
则可以不考虑数据集对于模型性能的影响
直接考虑模型训练超参数、算法、模型的网络结构对于模型的影响
5 k-fold交叉验证
概念
-
首先随机地将数据集切分为 k 个互不相交的大小相同的子集;
-
然后将 k-1 个子集当成训练集训练模型,剩下的 (held out) 一个子集当测试集测试模型;
-
将上一步对可能的 k 种选择重复进行 (每次挑一个不同的子集做测试集);
-
这样就训练了 k 个模型,每个模型都在相应的测试集上计算测试误差,得到了 k 个测试误差,对这 k 次的测试误差取平均便得到一个交叉验证误差。这便是交叉验证的过程。
作用
模型评估
-
评估当前
训练超参数
下模型的综合性能,减少数据集对于模型性能的影响,增加可信度
模型选择Model choice
-
由于K fold 交叉验证,会训练出K个模型,也就是会有K组
模型内部参数tuning parameter
,最后选择使得交叉验证误差最小的那一组tuning parameter
k折交叉验证可以有效的避免过拟合以及欠拟合状态的发生,最后得到的结果也比较具有说服性。
K-fold交叉验证图解
将原始数据集Dataset
划分为Train训练集
、Test测试集
Model Choice
-
Test验证集
作为选中
当前训练超参数
下最好的一组tuning parameters
去做最终验证
模型评价
然后进一步将Train训练集
划分为K fold
,不断地选择其中的K-1个作为训练集,1作为Valid验证集
,训练出K个模型,然后计算出K个评价指标,计算均值,作为当前训练超参数
下的模型性能
增加说服力
适用情景
适用情景:
-
数据集数量小
-
增加模型性能的说服力,科学性
不适用情景:
-
标签不平衡
-
时间序列数据
K-fold折数的选择
交叉验证可能存在 bias 或者 variance。如果我们提高切分的数量 k,variance 会上升但 bias 可能会下降。相反得,如果降低 k,bias 可能会上升但 variance 会下降。bias-variance tradeoff 是一个有趣的问题,我们希望模型的 bias 和 variance 都很低,但有时候做不到,只好权衡利弊,选取他们二者的平衡点。
确定依据
-
经验来判断
-
根据训练集数据的样本数量来选择
Sklearn代码实现
6 leave-one-out 留一折交叉验证
概念
k折交叉验证的特殊情况,k=N,N 是数据集的样本数量
假设我们在数据集中有 100 个样本。然后在每次迭代中,1 个值将用作验证集,其余 99 个样本作为训练集。因此,重复该过程,直到数据集的每个样本都用作验证点。
适用情景
往往在数据缺乏的情况下使用
优缺点
优点
-
每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
-
实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。
缺点
计算成本高,因为需要建立的模型数量和原始数据集样本数量一致,尤其当样本数量很大的时候。可以考虑并行化训练模型减少训练时间。
7 分层 K 折交叉验证
概念
分层 K-Fold 是 K-Fold 交叉验证的增强版本,主要用于不平衡的数据集。就像 K-fold 一样,整个数据集被分成大小相等的 K-fold。
但是在这种技术中,每个折叠将具有与整个数据集中相同的目标变量实例比率。
适应情景
数据集数量少、标签分布不均衡
8 Bootstrapping
概念
cv 和 bootstrapping 都是重采样 (resampling) 的方法。机器学习中常用的 bagging 和 boosting 都是 bootstrapping 思想的应用。
bootstrapping 的思想是依靠自己的资源,称为自助法,它是一种有放回的抽样方法。
-
数据假设要分成10组,则先设置一个采样比例,比如采样比例70%。则10组数据是每次从原始数据集中随机采样总数70%的数据构成训练集1,没有选中的样本作为测试集1;然后把数据放回,再随机采样总数70%的数据构成训练集2,没选中的作为测试集2……以此类推,放回式采样10组。
-
训练生成10个模型
-
计算平均测试误差来评估当前参数下的模型性能
解决问题
解决分组的随机性
但以上交叉验证的方法都有一个问题,就是在数据分组的时候缺乏随机性,以 k折交叉验证 为例,每个数据样本只能固定属于 k 个子集中的一个,可能会造成对于最终结果的影响。于是有人提出了 bootstrapping。
9 时间序列交叉验证
概念
时间序列数据是在不同时间点收集的数据。由于数据点是在相邻时间段收集的,因此观测值之间可能存在相关性。这是区分时间序列数据与横截面数据的特征之一。
在时间序列数据的情况下如何进行交叉验证?
-
在时间序列数据的情况下,我们不能选择随机样本并将它们分配给训练集或验证集,因为使用未来数据中的值来预测过去数据的值是没有意义的。
-
由于数据的顺序对于时间序列相关问题非常重要,所以我们根据时间将数据拆分为训练集和验证集,也称为“前向链”方法或滚动交叉验证。
-
我们从一小部分数据作为训练集开始。基于该集合,我们预测稍后的数据点,然后检查准确性。
-
然后将预测样本作为下一个训练数据集的一部分包括在内,并对后续样本进行预测。