交叉验证(Cross Validation,有时简称cv)
基本介绍:
1、简单交叉验证
将数据随机打乱分成两份,一部分作为训练集,另一部分作为测试集。(比例一般为训练集70%,测试集30%)。使用训练集在各种条件下训练模型,得到不同的模型,在测试集上验证各个模型的测试误差,从而选出误差最小的模型。
2、K折交叉验证
应用的最多,最实用的就是K折交叉验证(K-fold cross validation)。随机将已给的数据平均切分为K个互不相交的大小相同的子集;然后利用K-1个子集的数据来训练模型,利用余下的1份子集作测试模型;将这一过程对可能的S种选择重复进行,就是说训练K次,产生K个模型;最后选出K次评测中平均测试误差最小的模型。
3、留一交叉验证
K折的特殊情形是K=N(N是给定的数据集容量),称为留一交叉验证。比如样本数量N为1000个,则分成1000份,每份都进行训练。往往在数据缺乏的情况下使用。
(介绍参考自李航的《统计学习方法》)
个人使用经验:
1、一般在使用深度学习算法进行训练时就用简单交叉验证,train和val的比例看情况,保证数据量情况下,即训练不会发生欠拟合的情况下,验证集当然越大越好。k-fold较少使用。因为数据量一般比较充足,如果数据量少的话,就不适合使用dnn进行训练了,会发生欠拟合;数据量如果很大,使用k-fold时间成本又太高,而且如果数据集和模型适合深度学习的话,train loss曲线一般比较丝滑,相
比传统机器学习不易发生过拟合现象, 发生了过拟合,根据loss曲线也能及时切断。
k折交叉验证主要用在传统机器学习上,数据量一般较小,训练集易发生过拟合的情况下。据说10是经验数值,5折用的也比较多,毕竟快。如果2折测试集精度也很高的话,那说明模型泛化能力超好。使用k-fold会产生k个模型,可以挑一个精度最高的模型,不过有时在验证集里精度越高也可能导致泛化性能较差,最好的方法是staking这k个模型,鲁棒性更好,但若用在深度学习时间成本也极高。
留一法,每折中基本所有的样本都用于训练模型,因此最接近原始样本的分布。至今没有用到过,感觉能用到这种验证方案的数据集得有多小,训练出的模型似乎也不是很可靠,不排除吹毛求疵的情况。