Kaggle大赛经验:如何(以及为什么)创建一个好的验证集

简介: 本文作者通过大量的Kaggle比赛记录,总结发现了想要训练一个完美的机器学习模型,自己创建一个验证集的重要性及如何创建的方法。

一个创建机器学习模型过程中非常常见的情况:一个看似完美的机器学习模型在创建的过程中完全失败。这个后果让很多人感到困惑,这怎么可能发生?

导致开发与结果之间脱节的最可能的罪魁祸首之一是一个不好的验证集(甚至更糟,根本没有验证集)。根据数据的性质,选择验证集可能是最重要的一环。虽然sklearn提供了一个train_test_split方法,但是这个方法需要一个随机的数据子集,这对于许多现实世界的问题来说是一个不好的选择。

训练,验证和测试集的定义可以相当细致,而且这些术语有时会被不一致地使用。在深度学习社区中,“测试时间推理”常常用来指创建中的数据评估,这不是测试集的技术定义。如上所述,sklearn有一个train_test_split方法,但没有train_validation_test_split。Kaggle只提供训练集和测试集,你需要将他们的训练集分成你自己的验证集和训练集。而且,事实证明,Kaggle的测试集实际上也是被细分为两组。许多初学者可能会感到困惑,我将在下面讲解这些让大家困惑的地方。

首先,什么是“验证集”?

验证集是用来对学习出来的模型,调整分类器等参数,如在神经网络中选择隐藏单元数。在创建机器学习模型时,最终的目标是要准确掌握新数据,而不仅仅是用于构建数据的数据。考虑下面一组数据的例子:

4e4488be0cc36b5f280fe3751a2d8e9aba9780ca

图中数据点的误差对于最右边的模型是最低的(蓝色曲线几乎完美地通过红色点),但它不是最好的选择。这是为什么?如果你要收集一些新的数据点,他们很可能不会在右边的曲线上,但会更接近中间曲线。

其基本思想是:

  • 训练集用于训练给定的模型。
  • 验证集用于在模型之间进行选择(例如,随机森林或神经网络是否更适合你的问题?你是否想要一个拥有40棵树或50棵树的随机森林?)。
  • 测试集告诉你如何完成。如果你已经尝试了很多不同的模型,你可能会偶然得到一个在你的验证集上做得很好的测试集,并且有一个测试集有助于确保事实并非如此。

什么时候是一个随机子集不够好?

我们通过看几个例子来进行区分,尽管这些例子中有很多来自Kaggle比赛,但它们代表了你在工作场所会遇到的问题。

1.时间序列

如果你的数据是一个时间序列,选择一个随机的数据子集将会非常容易(你可以在你试图预测的日期之前和之后查看数据),而不是代表大多数商业用例(你在哪里正在使用历史数据建立未来使用的模型)。如果你的数据包含日期,并且你正在构建要在将来使用的模型,那么你将需要选择一个包含最新日期的连续部分作为验证集(例如,可用数据的最后两个星期或上个月)。

假设你想将下面的时间序列数据拆分为训练集和验证集:

c5c5379eed3d10f2ba7b9615ab583cfa459bc422

一个随机子集是一个不好的选择:

86360747baff9e4818b602a8238eae8902901333

使用较早的数据作为你的训练集(以及后面的验证集数据):

20357ae953c966593f5dd29fcfc53e5a7d3e7cc6

Kaggle目前有一个竞赛是预测厄瓜多尔连锁超市的销售。Kaggle的“训练数据”是从2013年1月1日至2017年8月15日,测试数据是2017年8月16日至2017年8月31日。一个好的方法是使用2017年8月1日至8月15日作为你的验证集,所有的早期数据作为你的训练集。

2.交叉验证

sklearn没有train_validation_test的原因是假设你经常使用交叉验证,在交叉验证中,是将不同的训练集子集作为验证集。例如,对于3倍交叉验证,将数据分成3组:A,B和C。首先将A和B组合的模型作为训练集进行训练,然后在验证集C上进行评估。将A和C模型训练集作为训练集,并在验证集B上进行评估。将B和C的模型训练集做为训练集,并在验证集A上进行评估。最后对3个模型的性能进行平均。

然而,交叉验证的问题在于,由于上述所有原因,它很少适用于现实世界的问题。交叉验证只适用于你可以随机混洗数据以选择验证集的情况。

个人参赛体会:Kaggle的“训练集”=你的训练集+验证集

关于Kaggle比赛的一件好事是他们强迫你更严格地考虑验证集(为了做得更好)。对于那些刚刚接触Kaggle的人来说,这是一个举办机器学习大赛的平台。Kaggle通常会将数据分成两组,你可以下载:

1.     一个训练集,其中包括自变量,以及因变量(你试图预测的)。以厄瓜多尔杂货店试图预测销售量为例,自变量包括商店编号,商品标识和日期; 因变量是销售的数量。以试图确定驾驶员是否在车轮后面进行危险行为为例,自变量可以是驾驶员的图片,因变量是类别(如发短信,吃东西或安全地向前看)。

2.     一个只有自变量的测试集。你将对测试集进行预测,你可以将其提交给Kaggle,并获取你的预测等成绩。

这是开始使用机器学习所需的基本思想,你将需要创建自己的训练集和验证集(通过拆分Kaggle“训练”数据)。你只需使用较小的训练集(Kaggle的训练数据的子集)来构建模型,然后在提交给Kaggle之前,可以在验证集(也是Kaggle的训练数据的子集)上对其进行评估。

最重要的原因是Kaggle将测试数据分为两组:公共和个人排行榜。你在公开排行榜上看到的分数只是你预测的一个子集(而且你不知道哪个子集!)。在比赛结束之前,你对个人排行榜的预测不会被揭示。你可以通过查看你的模型是否具有与Kaggle测试集相似的分数来检查你的验证集是否有用。

另一个创建自己的验证集非常重要的原因是,Kaggle每天限制你两个提交内容,但是你可能想要进行更多的实验。第三,自己创建自己的验证集能够确切地看你在验证集上出现了什么问题,Kaggle并没有告诉你测试集的正确答案,甚至是你错误的数据点,只是你的总分。

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《How (and why) to create a good validation set》

作者:Rachel Thomas

译者:虎说八道,审校:

文章为简译,更为详细的内容,请查看原文


相关文章
|
10月前
|
传感器 数据采集 算法
LET数据集来魔搭了!开源首批超60,000分钟全尺寸人形机器人真机数据
国内最大全尺寸人形机器人真机数据集“LET数据集”正式发布,首批开源超6万分钟高质量数据,覆盖6大真实场景,支持多模态融合与标准化应用,助力具身智能研发,已在魔搭社区开放共享。
817 1
LET数据集来魔搭了!开源首批超60,000分钟全尺寸人形机器人真机数据
|
6月前
|
机器学习/深度学习 算法 Apache
CEH特征引擎:重新定义实时视觉的“速度-精度”边界
CEH是首个在普通CPU上实现“高密度特征+高帧间匹配+亚像素精度”的全能特征引擎,速度超BRISK、效率领先SIFT一个数量级,零GPU依赖、零专利风险,纯C++开源,完美适配嵌入式与边缘设备。
618 49
|
11月前
|
供应链 安全 数据可视化
2025年MES系统厂商排名揭晓:深度解析头部企业如何破解生产数智化难题
树根科技MES系统以“软件+咨询”模式深度融合精益生产与数智化技术,依托根云平台实现设备互联、数据集成与流程固化。其微服务架构支持灵活配置,覆盖计划、生产、质量、仓储等全场景,助力企业提升交付率、缩短周期、实现全流程追溯,为中大型离散制造企业提供高适配、可扩展的智能工厂解决方案。
439 2
|
10月前
|
数据采集 Java 调度
从10个协程到1000个协程:性能下降的背后究竟发生了什么?
本文探讨了异步程序中常见的误解“协程越多越快”,并通过一个实际的异步抓取学术论文元数据的例子来阐明这一点。文章首先解释了协程过多可能导致的效率低下的原因,包括事件循环的调度限制、网络瓶颈、代理并发限制以及Python协程切换的成本。接着,文章提供了一个使用代理、从DOAJ抓取开放论文元数据并存入SQLite数据库的完整异步代码示例,并强调了合理设置并发量的重要性。最后,文章总结了初学者在编写异步抓取程序时容易遇到的几个陷阱,并提供了相应的解决方案。
402 2
|
10月前
|
人工智能 算法 架构师
你的团队是"精锐特种兵",还是"草台班子"?就差这一份"源代码"
针对技术团队管理混乱、过度依赖个人的痛点,提出用AI指令将经验转化为标准SOP的解决方案。通过工程化思维重构管理流程,实现团队经验的"开源"与"复用",释放核心人才价值。
723 10
|
10月前
|
人工智能 前端开发 JavaScript
告别"玄学调试":用这份指令让AI成为你的"赛博华佗"
调试占用了开发者50%的时间?本文提供一套专业的AI调试指令,将大模型转化为"拥有10年经验的代码医生"。通过结构化的诊断-修复-预防流程,告别低效的"玄学调试",实现从"修好Bug"到"根治隐患"的质变。
762 6
|
人工智能 数据挖掘 Linux
Centos安装Python3.7(亲测可用)
本指南详细介绍了在基于Linux(以CentOS系统为例,使用yum包管理器)的系统上安装Python 3.7版本的完整流程。Python是一种广泛使用的高级编程语言,在各种领域如软件开发、数据分析、人工智能和区块链开发等都有着重要的应用。
1009 2
|
自动驾驶 安全 机器人
ROS2:从初识到深入,探索机器人操作系统的进化之路
前言 最近开始接触到基于DDS的这个系统,是在稚晖君的机器人项目中了解和认识到。于是便开始自己买书学习起来,感觉挺有意思的,但是只是单纯的看书籍,总会显得枯燥无味,于是自己又开始在网上找了一些视频教程结合书籍一起来看,便让我对ROS系统有了更深的认识和理解。 ROS的发展历程 ROS诞生于2007年的斯坦福大学,这是早期PR2机器人的原型,这个项目很快被一家商业公司Willow Garage看中,类似现在的风险投资一样,他们投了一大笔钱给这群年轻人,PR2机器人在资本的助推下成功诞生。 2010年,随着PR2机器人的发布,其中的软件正式确定了名称,就叫做机器人操作系统,Robot Op
1200 14
|
开发框架 前端开发 JavaScript
使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理
使用Vue-TreeSelect组件实现公司-部门-人员级联下拉列表的处理
|
SQL 安全 网络安全
网络安全攻防实战:黑客与白帽子的较量
【6月更文挑战第29天】网络安全战场,黑客与白帽子的博弈日益激烈。黑客利用漏洞扫描、DDoS、SQL注入等手段发起攻击,而白帽子则通过防火墙、入侵检测、数据加密等技术防守。双方在技术与智慧的较量中,未来将更多融入AI、区块链等先进技术,提升攻防效率与安全性。面对网络威胁,提升技能与意识至关重要。