满堂花醉三千客,一剑霜寒十四洲。这篇文章主要讲述你真的会用K折交叉吗? 对于K折交叉的思考| 防止K折交叉踩坑相关的知识,希望能为你提供帮助。
作者碎碎念本文目的:
对于K折交叉,想必大家都知道是什么原理。但是在具体实践中让你写的时候,你可能就会突然疑惑:“咦?道理我都懂,可是这个玩意儿到底怎么用。”
本文就是为了探讨一下什么时候 怎么用 K折交叉验证。
K折交叉(k-fold cross validation)提到K折交叉,我想大部分人都了解其原理了。但是在这里还是先讲一下什么是K折交叉,防止有初学者是进来看什么是K折交叉的。
【你真的会用K折交叉吗( 对于K折交叉的思考| 防止K折交叉踩坑)】简言之,就是将数据随机分为K份,使用其中的K-1份依次进行训练,使用剩下的1份作为测试集,比较常见的有五折交叉、十折交叉。
但是实际写代码的时候遇到了问题,现有以下两种K折交叉方法:
方案1 不预先分出测试集
就是我们看书看博客最常见的说法。
- 将数据随机均分k份。
- 使用其中1份做测试集,剩余k-1份做训练集。
- 通过 k 次训练后,我们得到了 k 个不同的模型。
数据量超级少,精度根本提不到85%。到最后以至于我觉得我的2折交叉方法是错的。
文章图片
分析看到这里是不是突然开始迷惑了?那我到底该用哪一种?
我们来分析一下:
- 方案二,预先划分出测试集,训练之后也得到五个模型,但是取出其中较好的一个,测试集之外的所有数据合起来对其二次训练,训练之后作为最终的模型,并使用测试集评价其效果。
- 方案一,不提前留出测试集,直接所有数据放入模型中一边训练一边测试。这样我们最终会获得5个不同的模型,其之间的效果也会存在差异。
答案是选不出来,因为你没有单独的测试集,五个模型的数据不用,你无法最终验证究竟哪个模型的实际效果更好。
那你可以说:那我也和方案2一样,选出5个中看起来最好的那个模型的参数,然后把所有的数据塞回去重新训练……
文章图片
你清醒一点,你一开始就没划分测试集,所以你不能把所有的数据再组合起来塞回去训练。因为训练完了你也没测试集看你训练的结果。
那你又说:得到五个模型之后,我再把数据集划分出来,只取所有数据中的一部分作为训练集,剩下一部分测评模型。
文章图片
清醒一点啊!!你怎么敢的!这属于学术作弊!!!你那五个模型怎么来的?所有数据训练出来的K-1份训练出来的!你这属于用训练集测试集混着用了!
文章图片
第二波分析:
先说个题外话,我们需要注意数据划分的作用:
- 训练集:训练模型,获得模型参数
- 测试集:测试模型效果
- 验证集:调整模型超参数
换句话说就是在训练过程中手动调参,调整模型的超参数。
现在有两个模型放在你面前:
- 使用训练集训练,使用测试集测试,效果不好再回去调一调模型超参数。
- 使用训练集训练,使用验证集测试,效果不好回去调一调,调好之后使用测试集测试。
因为第二个模型是在完全陌生的数据上进行测试,达到了某个效果。
而第一个模型是在对应的测试集上进行调参得到的最终效果,他的“好”可能仅限于那块测试集的数据,在其他数据上效果不一定比得过第二个模型。
现在回到我们的K折交叉。
方案1中只划分了训练集和测试集,如果你要调参,直接使用测试集调。
方案2中划分了训练集、验证集、测试集,你调参用验证集调,测试集仅作为最终模型测试。
那现在我们就明白了:
- 方案1中:使用测试集调整超参数的话,我们是尽力找到一个超参数能让所有的K-1个模型表现都更好一点,是为了找到比较好的一组超参数。
- 方案2中:使用验证集调整超参数,选出五个模型中看起来最好的,再使用训练集之外的所有数据再训练,最终使用测试集测试效果,这是为了选出一个最终可用的模型。
所以什么时候用哪种?方案1 不预先分出测试集:适用于评价模型效果,但是你没办法选出一个具体参数的模型。
就是当你说:我这个模型好!
好在哪里?
我进行K折交叉!出来的五个模型在我设计的超参数之下准确率都不错,所以我这个模型设计的挺好。
那让我用用你这个模型,什么参数下效果最好?
那我就不知道了,选不出来。
方案2 提前留出测试:适用于选择合适的模型。
我需要最终得到一个模型,你必须得要一个具体的模型,不仅有超参数,还要有一组能让模型表现“最好”的参数。这时候你就需要用方案2。
作者碎碎念,本文的写作初衷月初时候写大作业,要求使用2折交叉验证,
起初我用的方案1,就是提前分出来测试集。然后我闲着没事和师姐交流了一下,师姐说:
???我突然就开始怀疑人生,是我做错了吗?
然后我开始查资料,越查越迷惑。直到最后师哥给我解答了疑惑:
推荐阅读
- [OpenCV实战]19 使用OpenCV实现基于特征的图像对齐
- [OpenCV实战]20 使用OpenCV实现基于增强相关系数最大化的图像对齐
- Unity3D-UGUI篇Unity3D中UGUI的屏幕适配
- 图解transformer
- Unity3D日常开发实现角色移动行走之CharacterController组件
- 数据分析之特征创造——降维算法
- Unity3D插件A*Pathfinding插件分享《A*寻路插件》
- [ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(下)-- 非递归方法实现
- Steam 最新VR 游戏畅销榜——这几款游戏绝对值得一玩~不来看看你可就错过啦!