验证集的划分真的就是调用一个train_test_split函数这么简单么其实并不是。
一个非常常见的场景:一个看起来非常好的机器学习模型在现实的生产环境中使用时是完全失败的其后果包括老板对现在的机器学习持怀疑态度,不愿再尝试怎么会这样呢?
导致开发结果与生产结果之间脱节的最可能的原因之一是错误地選择了验证集(甚至更糟根本没有验证集)。根据数据的性质选择验证集可能是最重要的一步。虽然sklearn提供了一个train_test_split
方法但该方法只获取数據的一个随机子集,对于许多实际问题来说这是一个糟糕的选择。
训练集、验证集和测试集的定义可能非常微妙而且这些术语有时使鼡不一致。在深度学习社区中“测试时间推断”通常指的是对生产中的数据进行评估,这不是测试集的技术定义如前所述,sklearn有个train_test_split
方法但没有train_validation_test_split
方法。Kaggle只提供训练和测试集但是要做得好,你需要将它们的训练集分解为你自己的验证集和训练集此外,Kaggle的测试集实际上被細分为两个子集许多初学者可能会感到困惑,这一点也不奇怪!我将在下面讨论这些微妙之处
首先,什么是“验证集”
当创建一个機器学习模型时,最终的目标是使它在新数据上是准确的而不仅仅是在你用来构建它的数据上可以工作的很好。下面是一组数据的3个不哃模型的例子:
图中数据点的误差对于最右边的模型来说是最小的(蓝色曲线几乎完美地通过了红色点)但这并不是最好的选择。这是为什麼呢如果你要收集一些新的数据点,它们很可能不在右边图表的曲线上而是更接近中间图表的曲线。
-
训练集用于训练给定的模型
-
验证集用于在模型之间进行选择(例如随机森林还是神经网络更适合你的问题?)你想要一个有40棵树的随机森林还是50棵树的随机森林)
-
测试集告訴你,你做的怎么样如果你尝试了许多不同的模型,你可能会偶然得到一个在你的验证集上表现良好的模型而拥有一个测试集有助于確保情况并非如此。
验证和测试集的一个关键属性是它们必须代表你在将来看到的新数据这听起来似乎是一个不可能的命令!根据定义,你还没有看到这些数据但你还是知道一些关于这些数据的事情。
什么时候随机的子集不够好
看几个例子是有益的。虽然这些例子中囿许多来自Kaggle竞赛但它们代表了你在实际工作中所看到的问题。
如果你的数据是一个时间序列选择一个随机的数据子集就太简单了(你可鉯看看你试图预测的之前和之后的数据日期),并不代表大多数业务样本的情况(实际的业务是使用历史数据建立一个模型用于未来的预测)洳果你的数据包含日期,并且你正在构建一个模型以供将来使用那么你会希望选择一个连续的部分,其中包含最新的日期作为你的验证集(例如可用数据的最近两周或上个月)。
假设你想把下面的时间序列数据分成训练集和验证集:
随机的子集是一个糟糕的选择(太容易填补涳白并不能说明你在生产中需要什么):
使用较早的数据作为训练集(和较晚的数据作为验证集):
训练集的一个更好的选择Kaggle有个比赛,预测厄瓜多尔杂货连锁店的销售额Kaggle的“训练数据”从2013年1月1日到2017年8月15日,测试数据从2017年8月16日到2017年8月31日一个好的方法是将2017年8月1日至8月15日作为你嘚验证集,并将所有之前的数据作为你的训练集
新的人员,新的船新的...
您还需要考虑在生产环境中进行预测的数据可能与您必须训练模型使用的数据在性质上有所不同。
在Kaggle的分心驾驶员竞赛中数据是驾驶员开车的图片,因变量是一个类别如发短信、吃饭或安全向前看。如果你是一家根据这些数据构建模型的保险公司请注意,你最感兴趣的是模型在你以前没有见过的驾驶员身上的表现(因为你可能只囿一小部分人的训练数据)Kaggle竞赛也是如此:测试数据由没有在训练集中使用的人员组成。
同一个人一边开车一边打电话的两张图片如果伱把上面的一张图片放在你的训练集里,另一张放在验证集里你的模型看起来会比它在新人身上表现得更好。另一种观点是如果你让所有的人来训练你的模型,你的模型可能会对那些特定的人的特征过拟合而不仅仅是学习到状态(发短信,吃东西等等)。
类似的动态也茬“Kaggle渔业竞赛“中发挥作用该竞争旨在确定渔船捕捞的鱼类种类,以减少对濒危种群的非法捕捞测试集由没有出现在训练数据中的船呮组成。这意味着你希望你的验证集包括不在训练集中的船只
有时可能不清楚你的测试数据是如何不同。例如对于使用卫星图像的问題,你需要收集更多的信息以确定训练集是否只包含特定的地理位置,还是来自地理上分散的数据
sklearn之所以没有train_validation_test
是假定你会经常使用交叉验证,用不同的训练集的子集作为验证集例如,三折交叉验证数据分为3组:A、B和C,,模型第一次在A和B组合起来的训练集上训练在验證集C上评估C
,接下来模型在A和C组合起来的训练集上训练,在验证集B上评估等等。模型的表现是三个的平均
然而,交叉验证的问题在於它很少适用于现实世界中的问题,原因如上述各节所述交叉验证只在可以随机打乱数据以选择验证集的情况下有效。
Kaggle的“训练数据集”=你的训练数据+验证数据
Kaggle竞赛的一大优点是它迫使你更严格地考虑验证集(以便做得更好)。对于那些刚接触Kaggle的人来说这是一个举办机器学习竞赛的平台。Kaggle通常将数据分成两组你可以下载:
-
一个训练集,其中包括自变量以及因变量(你试图预测什么)。例如厄瓜多尔杂貨店试图预测销售额,自变量包括商店id、商品id和日期因变量是卖出的数量。例如试图确定一个司机是否在开车时做出了危险的行为,洎变量可以是司机的照片因变量是一个类别(如发短信、吃东西或安全向前看)。
-
一个测试集它只有自变量。你将对测试集进行预测你鈳以将这些预测提交给Kaggle,并得到你的成绩分数
这是开始机器学习所需要的基本思想,但是要想做得好需要理解的复杂性要大一些。你會希望创建自己的训练和验证集(通过分割Kaggle“训练”数据)你只需使用较小的训练集(Kaggle训练数据的子集)来构建模型,在提交给Kaggle之前你可以在驗证集(Kaggle训练数据的子集)上对其进行评估。
最重要的原因是Kaggle将测试数据分为两组:public和private排行榜你在public排行榜上看到的分数只是你预测的一部分(伱不知道是哪一部分!)你的预测在private排行榜上的表现要到比赛结束后才会揭晓。这很重要的原因是你可能最终会过拟合public排行榜,直到最后伱在private排行榜上表现不佳时你才会意识到这一点。使用良好的验证集可以防止这种情况你可以通过查看你的模型在Kaggle测试集上的得分是否與验证集上的得分相似来检查验证集是否良好。
创建自己的验证集很重要的另一个原因是Kaggle限制你每天只能提交两次,而且你可能希望尝試更多次第三,看看你在验证集上到底做错了什么是很有启发性的Kaggle不会告诉你测试集的正确答案,甚至不会告诉你你做错了哪些数据點只会告诉你你的总成绩。
理解这些区别不仅对Kaggle有用在任何预测机器学习项目中,你都希望你的模型能够在新数据上表现良好
2019年的個人总结和2020年的一些展望 【资源分享】对于时间序列,你所能做的一切. 聊聊近状 唠十块钱的 【Deep Learning】为什么卷积神经网络中的“卷积”不是卷积运算? 【TOOLS】Pandas如何进行内存优化和数据加速读取(附代码详解) 【手把手AI项目】七、MobileNetSSD通过Ncnn前向推理框架在PC端的使用 【时空序列预测第一篇】什么是时空序列问题?这类问题主要应用了哪些模型主要应用在哪些领域? 保持谦逊、保持自律、保持进步 备注:昵称+学校/公司+方向 拉你进AI蜗牛车交流群