通过这篇文章,我想探讨一个经常被提问者和回答者忽视的问题:“你如何将数据集划分为训练集和测试集?”
当处理一个监督问题时,通常的做法是将数据集分成(至少)两部分:训练集和测试集。训练集用于研究现象,而测试集用于验证学习到的信息是否可以在“未知”数据上复制,即之前阶段不存在的数据。
许多人通常遵循标准、明显的途径来做出这个决定。常见的、令人不感兴趣的答案是:“我随机划分可用数据,保留 20%到 30%作为测试集。”
那些更进一步的人会加入分层随机抽样的概念:即在保持一个或多个变量固定比例的同时随机抽样。想象一下,我们处于一个二元分类场景中,并且有一个具有 5%先验概率的目标变量。在目标变量上分层随机抽样的意思是在训练集和测试集中保持目标变量先验的 5%比例。
这种推理有时是必要的,例如,在非常不平衡的分类场景中,但这并不会给这个问题增添多少兴奋感。
这个问题比看起来更难,正确的答案来自平凡:“这取决于。”
为了简单起见,让我们继续在二元分类场景中讨论。
你是否曾经需要训练一个算法来预测一个可变现象并使其进化?
在现实世界场景中划分的复杂性
想象一下需要创建一个能够预测购买产品倾向的算法。在这种情况下,区分真实与个人、主观与客观是困难的。想象一下有一个提供消费者信息的数据库。认为一些消费者在购买或不购买你的产品时行为不同是奇怪的,这是正常的,因为可用的数据可能无法捕捉到我们想要建模的决策的所有潜在动机。换句话说,我们是在说一些因素可能是外生的,甚至是伪随机的。
在 Midjourney 中创建的图像
现象本身取决于市场,因此是可变的。如果竞争对手大幅降低价格会发生什么?如果新产品开始抢占市场份额会发生什么?如果产品过时,其消费逐渐开始下降会发生什么?
我有一个好消息要告诉你:尽管有这么多坏消息,你仍然可以做一些好事来支持你的业务并创建一个性能良好的模型,但你需要采取正确的预防措施。
一个没有耐心的读者可能会想:但这一切与训练集和测试集之间的划分有什么关系呢?它与这一点有很大关系,但在连接所有这些点之前,让我先对测试集的概念进行一下哲学思考。
测试集应该尽可能接近模型在生产中遇到的真实数据集。因此,它应该作为最后的防线,直到所有最隐蔽的疑虑都得到解决。在测试集上良好的表现应该让我们在使用模型后能够安心入睡,因此它应该构建来为我们准备生产部署的目标。
一种可能的策略可能是根据时间来划分训练集和测试集。例如,将最后两个月留给测试集。这种推理基于这样一个概念,即前几个月不可避免地代表了生产阶段将到达的真实数据的最佳代表。可能合理地认为,最近可用的数据与未来我们将面对的未知数据最为接近。然而,这种策略并非没有缺陷。以这种方式解决问题会在模型评估中引入时间扭曲。
让我们考虑一个极端案例,比如一个强烈季节性的现象。想象一下冰淇淋销售的历 史序列。完全依赖最后可用的几个月意味着做出低效的决策。风险是倾向于适应之前时刻的模型,而不是一个更好的泛化模型。想象一下将夏季月份留在测试集中的时间划分;风险是倾向于预测高于平均值的模型,反之亦然在冬季期间。
Midjourney 创建的图像
这是因为,对于每一种季节性现象,最初的假设不再成立。在这种情况下,我们的数据集的最后时刻并不一定是最接近生产数据的。可能在这种情况下,最接近生产数据的数据可能是前一年或前一个季节的数据。在这种情况下,我更喜欢通过按时间分层现象来抽样,以评估不同时间组件的性能。
高级策略和最终考虑
我将通过一个例子来尝试澄清。我们在保持月份和年份比例不变的情况下,随机选择数据集的 25%。这使我们能够通过分析不同时间组件的测试性能来评估现象的稳定性。
在某些特定场景下,我选择了两种方法:既向整个数据集的测试集引入随机元素,也引入一个仅限于最后一段时间的时序元素。
我想了解“旧”数据如何同时预测同一时间段内的新数据(测试集中的“旧”数据)和紧接着下一时刻的新数据。如果两者之间的性能有显著差异,这可能表明预测数据的可靠性下降或所研究现象的模式可能发生潜在变化。
我认为,在你的情况下,可能的一个好的策略可能是另一个策略,也许是一个尚未发现的策略!
我试图表达的是,遗憾的是,没有一条金科玉律可以遵循,但唯一可行的途径是根据正在分析的问题仔细构建测试数据集。
在试图理清这个复杂的网络时,我试图通过牢记这些问题来实现:
-
我该如何创建一个与生产数据非常相似的测试数据集?
-
我选择的策略是否允许我尽可能彻底地评估模型的性能?
-
当我发布解决方案时,我的数据集能否让我安心入睡?
记住,这些问题即使在涉及不可变现象的情况下也是适用的。
让我们以该领域最著名的游乐场之一为例:想象一下面对将狗和猫的图像进行分类的问题。在这种情况下,没有任何可变因素。记住这一点:狗始终是狗,猫始终是猫。然而,如果我们只包括贵宾犬在测试集中,我们将选择最佳的预测贵宾犬的模型,而无法对腊肠犬做出预测。
不幸的是,唯一的规则就是没有规则。
1131

被折叠的 条评论
为什么被折叠?



