目录
3.1.3模型检验
1、背景
在前面的章节中,时不时地提到模型检验或者交叉验证等词汇,特别是在对不同模型的配置、不同的特征组合,在相同的数据和任务下进行评价的时候。究其原因,是因为仅仅使用默认配置的模型与不经处理的数据特征,在大多数任务下是无法得到最佳性能表现的。因此,在最终交由测试集进行性能评估之前,自然希望可以尽可能利用手头现有的数据对模型进行调优,甚至可以粗略地估计测试结果。
备注:尽管在许多章节中所使用的测试数据是从原始数据中采样而来,并且多数知晓测试的正确结果;但是这仅仅是为了学习和模拟的需要。一些初学者因此经常拿着测试集的正确结果反复调优模型与特征,从而可以发现在测试集上表现最佳的模型配置和特征组合。这是极其错误的行为!
事实上,真正在竞赛平台上实践机器学习任务时就会发现,您只可以提交预测结果,并不可能知晓正确答案。如果更加严格一些,只给一次提交预测结果的机会,那么更不可能期待借助测试集“动手脚”。这就要求充分地使用现有数据,并且通常的做法依然是对现有数据进行采样分割:一部分用于模型参数训练,叫做训练集(Training set);另一部分数据集合用于调优模型配置和特征选择,并且对未知的测试性能做出估计,叫做开发集(Development set)或验证集(Validation set)。根据验证流程复杂度的不同,模型检验方式分为留一验证与交叉验证。
备注:如果读者在量化投资公司从事股票预测研究,所能获取的永远是过去股票价格的走势,未来的股票价格永远是所设计模型的测试,并且机会只有一次。虽然可以借由过去的股票价格对模型进行调优,但是这不代表自认为通过验证的优质模型一定可以在未来的股票市场大赚一笔。要对未来抱有一颗“虔诚”的心,因为不会知道最适合测试的模型配置和特征组合;所能做的,之能是相信当下所验证的,并把剩下的一切交给时运。
2、留一验证
留一验证(Leave-one-out cross validation)最为简单,就是从任务提供的数据中,随机采样一定比例作为训练集,剩下的“留做”验证。通常,取这个比例为7:3,即70%作为训练集,剩下的30%用做模型验证。不过,通过这一验证方法优化的模型性能也不稳定,原因在于对验证集合随机采样的不确定性。因此,这一方法被使用在计算能力较弱,而相对数据规模较大的机器学习发展的早期。当拥有足够的计算资源之后,这一验证的方法进化成为更加高级的版本:交叉验证。
3、交叉验证
交叉验证(K-fold cross-validation)可以理解为从事了多次留一验证的过程。
备注:每次检验所使用的验证集之间是互斥的,并且要保证每一条可用数据都被模型验证过。
以5折交叉验证(Five-fold cross-validation)为例,如图3-5所示。
全部可用数据被随机分割为平均数量的5组,每次迭代都选取其中的1组数据作为验证集,其他4组作为训练集。
交叉验证的好处在于,可以保证所有数据都有被训练和验证的机会,也尽最大可能让优化的模型性能表现得更加可信。