在机器学习领域,特别是涉及到模型的调参与优化部分,k折交叉验证是一个常常使用到的方法,本文就结合示例对它作一个简要介绍。 该方法的基本思想就是将原训练数据分为两个互补的子集,一部分作为训练数据来训练模型,另外一部分作为验证数据来评价模型。(如下将前述的两个子集的并集称为原训练集,将它的两个互补子集分别称为训练集和验证集;此处要区别验证集与测试集,验证集是原训练集的一个子集,而测试集相对于原训练集而言。) 图示以下: 机器学习
k折,就是将原训练集分为k份,其中k-1份做训练集,另外一份做验证集。性能
k折交叉验证的基本思路以下: 第一步,不重复地将原训练集随机分为 k 份; 第二步,挑选其中 1 份做为验证集,剩余 k-1 份做为训练集用于模型训练,在训练集上训练后获得一个模型,用这个模型在验证集上测试,保存模型的评估指标; 第三步,重复第二步 k 次(确保每一个子集都有一次机会做为验证集); 第四步,计算 k 组测试指标的平均值做为模型精度的估计,并做为当前 k 折交叉验证下模型的性能指标。学习
一般状况下,k通常取10;当原训练集较小时,k能够大一点,这样训练集占总体比例就不至于过小,但训练的模型个数也随之增多;原训练集较大时,k能够小一点。测试
###1 使用k折交叉验证反映模型平均性能优化
为了贴近实用,下面以一个鸢尾花分类的例子具体说明该验证方法的细节:blog
上图是在没有使用k折交叉验证的状况下,一个模型初次训练以后的准确率,并不能表明模型的平均性能。方法
使用了k折交叉验证方法后,准确率状况以下,大体能够反映该模型的平均水平:im
###2 借助k折交叉验证调整模型超参数数据
当所需训练的模型须要调节超参数时,能够在多个不一样的超参数下用训练集训练多个模型,选择在验证集上有最佳性能的超参数值,最后用测试集作一次测试,以获得推广偏差率的预估。db
为了不浪费过多训练数据在验证集上,交叉验证即是经常使用方法:训练集分红互补的子集,每一个模型用不一样的训练子集训练,再用剩下的验证子集验证。一旦肯定模型类型和超参数,最终的模型使用这些超参数在所有的训练集(即上文所述的原训练集)上进行训练,用测试集获得推广偏差率。
从上图中能够知,对于每个超参数值,选用10折交叉验证,选择12~18的超参数值最好,大于18以后,准确率开始降低(过拟合)。 注意:此处的准确率是在验证集上的准确率;在细节处理上,因为模型较小,针对每个超参数,准确率是在10个(由于是10折交叉验证)验证集上的平均准确率。