什么是创建保留集更合适的方法:删除一些主题或删除每个主题的一些观察?

机器算法验证 机器学习 交叉验证 样本外
2022-03-23 22:10:46

我有一个包含 26 个特征和 31000 行的数据集。它是 38 个主题的数据集。它适用于生物识别系统。所以我希望能够识别主题。

为了有一个测试集,我知道我必须删除一些值。

那么做什么更好,为什么?

  1. (a) 保留 30 个主题作为训练集,移除 8 个主题作为测试集

  2. (b) 保留 38 个科目,但删除每个科目的一些行。所以最后我会得到一个训练集:24800 行 38 个科目和一个测试集:6200 行 38 个科目

4个回答

一个关键的区别是您是否想要:

  1. [最常见的情况]:对新主题的表现进行估计(从与您的数据相同的人群中得出)。
  2. 对来自与样本中相同主题的新观察结果进行性能估计。

更常见的情况是案例编号 (1)。例如,您对进入急诊室的人的心脏病发作预测有多准确?如果你是情况(1),你几乎肯定应该做(a)主题交叉验证而不是(b)记录交叉验证。在案例 (1) 中进行记录验证可能会导致对新主题表现的不合理高的虚假估计。

我不完全理解您要做什么(也许这是自学,所以这个问题并不完全现实)。我不知道你在什么情况下。如果你在不太常见的情况下(2),记录明智的验证可能没问题。

统计学的一个普遍主题是仔细考虑什么是独立的,什么是相关的。一般来说,独立观察往往是不同的主题。如果你想预测科目的表现,你必须测试你没有训练过的科目!

为什么是基于主题的交叉验证而不是基于记录的交叉验证?

在典型设置中,即使在对特征进行调节之后,对同一个人的重复观察也会相互关联。因此,通过记录交叉验证,您的测试集并不独立于您的训练集!在完美相关的极端情况下,您将在训练集和测试集中获得完全相同的观察结果!您将在测试集上进行训练!在交叉验证中测量的表现不能预测新科目的表现。

例如,最近的这篇论文将记录方式的交叉验证称为“Voodoo 机器学习”。

这么少的科目怎么办...

也许一些比我更有交叉验证经验的评论者可以加入,但对我来说,这看起来像是的可能候选者(也就是省略了一个交叉验证)?k=n

为了最大限度地利用训练数据,您可以做的就是留出一个主题进行交叉验证。每次迭代,测试不同的保留主题并训练所有其他主题。

如果主题都非常不同,您可能实际上接近,并且可能希望在训练集中放置尽可能多的独立主题。n=38

我认为 Matthew Gunn 的回答是正确的,但在我看来,“记录明智”的简历可以涵盖两个不同的概念:

  1. 无论主题或时间如何,记录都被随机划分为多个折叠。

  2. 记录被划分为基于时间的折叠,没有折叠用于包含测试折叠开始之后的数据的训练。

在第一种情况下,数据的任何时间序列性质都会受到影响,因为您的训练集可以包含测试集之前和之后的数据。训练/测试的原理是训练数据代表现在已知的数据,而测试数据代表尚未见过的数据(可能从字面上看来自未来)。

也许时间序列自相关会影响选项 #2。也许模型的时间元素并不重要,因此“过去”和“未来”的观察结果可能是相同的。在这些情况下,#1或#2都不是要走的路。

如果只有季节性而没有趋势,似乎可以在某些科目的训练中包含“未来”以预测新科目(他们将受到相同的季节性影响)。如果有趋势,关于未来的培训应该了解一些你在生产中使用模型时真的不知道的未来。

在 OP 的示例中,听起来主题方面很好。但是,如果趋势和时间序列问题是模型的一部分,我会尝试使用基于主题和时间的分区,以便您在特定时间点之前对一组主题进行训练,然后在之后对其他主题进行测试那个特定的时间点。

这实际上取决于您如何设想希望通过训练/测试拆分来模拟的设置。为了使事情具体化,假设每一行描述了一个受试者在一个晚上的睡眠质量。

  1. 有可能,未来每个受试者都会先来到睡眠实验室,为你提供几个晚上的睡眠质量。之后,您需要预测这些受试者未来夜间的睡眠质量。在这种情况下,您将使用您的选项 b)。sklearn中,您可以使用sklearn.model_selection.StratifiedShuffleSplit

  2. 未来可能会有几个受试者先来到睡眠实验室,为你提供几个晚上的睡眠质量。之后,您将需要预测其他受试者未来夜间的睡眠质量。在这种情况下,您将使用您的选项 a)。sklearn中,您可以使用sklearn.cross_validation.LeavePLabelOut

为了插话,我假设该应用程序是预测未知主题。这意味着(无论您是否有时间序列或固有的无序重复测量)需要进行拆分以便测试未知对象 => 拆分 a)

不过,考虑到您只有 38 个主题,您应该考虑重新采样验证。根据我使用类似小样本量(尽管功能更多)的经验,简而言之,这里有一些建议:

  • 进行基于主题的自举或迭代交叉验证。它们允许评估模型的稳定性,这对于小样本问题至关重要。如果不稳定性是一个问题,结果甚至可以用于聚合模型。

  • 不要留下一个主题。它既不允许测量模型稳定性,也不允许降低它。此外,在某些情况下,由于样本量小(与预期的最小悲观偏差相反),它会受到很大的悲观偏差。

  • 如果您使用典型的分类品质因数,例如准确度、灵敏度、特异性等,并且任务是正确分类受试者:请注意关键问题是衡量性能,因为测试结果的不确定性取决于绝对数量的测试用例。例如,在 17 个真正阳性的受试者中观察到 17 个正确的预测对应于 95% 的置信区间,灵敏度范围从大约 80% 到 100%。
    换句话说,您将无法在此基础上进行数据驱动的模型优化。

  • 这也意味着您不需要设置三组拆分(嵌套交叉验证),因为您会在此处浪费资源进行统计上无意义的比较 - 您的优化几乎肯定会失败(尽管您可能不会注意到,如果您不要检查稳定性)。

  • 对于建议的 5 (3) 个测试/优化/验证对象的二项式置信区间的相同计算产生 95% ci,所有正确范围低至 50% (30%),因此基于完美的测试结果,您的置信区间仍将包括 50/ 50猜!

我们写的一些关于这些主题的论文: