美文网首页ML/DL首页投稿(暂停使用,暂停投稿)我是程序员
Kaggle大赛经验:如何(以及为什么)创建一个好的验证集

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

作者: 阿里云云栖号 | 来源:发表于2018-01-26 10:40 被阅读143次

摘要: 本文概述了学习数据挖掘与数据科学的七个步骤,每一步都给出了详细的学习资源,便于初学者按照指南开展数据挖掘与数据科学的学习。

想知道如何学习数据挖掘和数据科学吗?本文概述了七个步骤,指出的资源能让你成为一名数据科学家。

作者为Gregory Piatetsky,是一名数据挖掘与数据科学方面的专家。

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

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

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

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

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

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

其基本思想是:

训练集用于训练给定的模型。

验证集用于在模型之间进行选择(例如,随机森林或神经网络是否更适合你的问题?你是否想要一个拥有40棵树或50棵树的随机森林?)。

测试集告诉你如何完成。如果你已经尝试了很多不同的模型,你可能会偶然得到一个在你的验证集上做得很好的测试集,并且有一个测试集有助于确保事实并非如此。

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

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

1.时间序列

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

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

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

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

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

相关文章

网友评论

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

    本文链接:https://www.haomeiwen.com/subject/ekdiaxtx.html