K-fold交叉验证后如何确认最终模型权重
问题背景
- 我在一份数据集上训练yolov10,数据集被我随机划分成了train、val、test数据集,它们的比例是8:1:1
- 多次随机划分数据集并多次重复训练yolov10后,我将得到多份yolov10的best.pt权重,这几份best.pt在test集上的测试结果相差甚远
初步分析原因:数据集中有的数据比较简单,有的数据比较复杂,随机划分数据集的时候,恰好把复杂数据或简单数据划分到test集上,从而导致上述问题
1. 解决问题的思路
要解决这个问题,我快速联想到了K-Fold Cross Validation(后续简称cv),因为cv给我的直观记忆感受就是能让大部分的数据进入到训练当中。关于cv,我们常见的概念图如下,图片来自B站up主:小萌Annie
1.1. 衍生问题
- 问题1,根据上图所描述来看,test集是不动的,这仍然无法解决我遇到的问题,即
随机划分数据集的时候,恰好把复杂数据或简单数据划分到test集上,导致训练的时候在val集上效果不错,但是test集上拉胯,亦或着相反。
- 问题2:我在实践yolo交叉验证后,
假设我实践时K-fold中的K=5,那么我训练出来了5份best.pt权重文件,最后我应该使用哪一份权重作为我的最终yolov10的权重,并作用test集上做最终测试
?
2. 重新认识K-Fold Cross Validation
1.cv是用来评估一个模型在一份数据集上性能的工具,它是评估手段,而不是训练手段
。换句话说K-Fold Cross Validation仅评估yolov10在某数据集上的性能,而并不决定最终的yolov10模型权重。
2.K-Fold Cross Validation已经完成了对模型性能的评估,test集不需要保留。
换句话说,在执行K-Fold Cross Validation的时候,应该把所有的数据都用于K-Fold Cross Validation,不需要单独保留一份test集。
3. 如果有多个模型(yolov10或mobilenet或resnet),那么使用cv完成了模型性能评估后,就可以决定使用哪个模型了。在完成cv后,模型的权重如何决定?使用所有数据重新训练,得到的就是最终权重
,因为性能在之前的cv已经评估过了,为了最大化利用数据集,全部数据都用来训练。
3. 参考资料
- stack overflow 论坛
- 博客
- 《统计学习方法》—第2版—李航著,P24页
- 《机器学习》—周志华著,P26页