问题建模之交叉验证

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/jingshuiliushen_zj/article/details/83018014

在离线环节,需要对模型进行评估,根据评估指标选择最佳模型。这就需要交叉验证。
下面介绍几种常用的交叉验证方法。

一、留出法

留出法非常简单,就是将数据集划分为训练集合测试集,它甚至不能看做是一种交叉验证,因为它并没有交叉的操作。
这种方法的缺点是:
1、划分测试集数据量对结论有影响。测试集数据量小,模型可信度不高;训练集数据量小,模型效果可能不够好。通常的做法是,2 /3 数据作为训练集,1 /3 数据作为测试集。
2、划分哪些样本作为测试集可能会导致数据分布发生变化,进而影响实验结论。

针对上述缺点,我们会进行多次留出法实验,每次随机划分,最终将多次得到的实验结论进行平均。

另外实际工作中有一种普遍的应用场景广泛使用留出法:数据有明显的时间序列因素,即线上数据的时间都在离线数据集之后,这种情况下应该根据时间对离线数据集划分训练集和测试集,使测试集时间分布在训练集时间之后。
比如,在2017 年6 月初需要训练模型,可以采用2017 年1 月到2017 年4月的数据作为训练集,2017年5月的数据作为测试集。

二、K 折交叉验证

K折交叉验证就是将数据集D 划分成K份互斥数据集,一般是平均分配使每份数据量接近并且数据分布尽可能一致。每次用一份数据测试,其余K-1份数据训练,需要迭代K轮得到K个模型;最后再将K份测试结果汇总到一起评估一个离线指标。

K折交叉验证的稳定性与K取值有很大关系。K值太小实验稳定性依然偏低,K值太大又可能导致实验成本高,K最常用的取值是5和10 。

相比留出法,K折交叉验证更为复杂,需要训练K个模型,但是数据利用率更高。K = 2 时,K折交叉验证和留出法仍有差异,留出法相当于用D1训练D2测试,得到测试结果cv_score1 ,而2折交叉验证还会用D2 训练D1测试,得到测试结果cv_score2,再取两次结果的平均值。另外,K折交叉,验证也可能因为单次K份数据划分导致数据分布发生变化而引入偏差,因此也经常会进行多次K折交叉验证后求平均。比如进行10 次5 折交叉验证,这10 次划分5 折交叉验证得到的数据会不同。

两个变种:

  1. 留一法(Leave-One-Out, LOO ) :假定数据集D 中有N条数据,当K折交叉验证的K=N 时,就是留一法,即每一条样本当测试集,其余数据作训练。LOO策略的优缺点都很明显。训练N个模型,每个模型都基本用到了全部的数据,得到的模型和全部数据D得到的模型更相似,并且不再受随机样本划分方式的影响,因为划分方式只有一种了。但是当样本量N很大时,计算成本非常高,计算甚至不可行,而且每个模型只有一条测试数据,不能有效帮助每个模型调参达到最优。但是在数据稀疏时,LOO很适用。
  2. 分层K折交叉验证( Stratified k”Fold ):在类不均衡情况下常用该方法,该方法对每个类别进行K折划分,使每份数据中各类别的数据分布与完整数据集分布更一致。

猜你喜欢

转载自blog.csdn.net/jingshuiliushen_zj/article/details/83018014