如何在训练集和测试集中拆分我的数据集,以防止数据泄漏?

数据挖掘 机器学习 阶级失衡 多类分类 数据泄露
2022-03-04 13:38:59

我意识到这可以被认为是这个问题的重复,在训练集和测试集中使用同一个人的样本是否被认为是数据泄漏?,其中规定“测试数据不应以任何方式与训练数据相关联”,以防止数据泄露。但是,如果无法在火车和测试集中拆分数据集,并且它们之间没有任何联系,我应该如何继续?

我的数据集包含 839 个时间序列样本,我想根据 14 个类对其进行分类。然而,这是一个不平衡的数据集,如图1所示。数据集由 16 名志愿者的录音组成。不幸的是,对于其中一些课程,数据仅适用于一些志愿者。2显示,对于某些班级,只有一名特定志愿者的数据可用。在图中,数字给出了可用于该特定类别的样本的志愿者数量。

我想使用单独的测试集验证我的机器学习模型。我最初的想法是将一名志愿者的数据留给测试集。但如上所述,这是不可能的,因为对于两个班级,只有一名志愿者提供数据。我能想出的第二个最佳方法是将来自一名志愿者的数据(其中有 4 个类别中的 12 个可用样本)与两个少数类别的选定几个样本放在一起,这些样本不存在于这个特定的样本中志愿者。这意味着我的测试集将包含 14 个类中的 12 个与训练集完全分离的样本。其他 2 个班级的测试集样本将来自训练模型的同一志愿者(因为这些班级只有一名志愿者的数据可用)。

如上所述,我知道这会引入某种形式的数据泄漏。是否有一个不会引入数据泄漏的好选择(除了添加更多数据)?如果不是,sklearn 的 StratifiedKFold 方法是否是验证我的模型的好选择?(使用 StratifiedKFold 我将使用管道以便仅对折叠的训练部分执行预处理。)

对于这个特定案例的数据泄漏,我真的很高兴得到答案和更多解释。

班级不平衡 每班志愿者的数据可用性

1个回答

在多患者数据集中,典型的交叉验证拆分是留出受试者,请查看:留一个受试者和留一个交叉验证有什么区别 基本上,每个受试者都用作不同折叠的测试受试者。

您的数据集有一些问题。首先,根据您的用例,可能存在或不存在数据泄漏。例如,如果可以先观察到足够多的时间序列样本进行训练,比如说前半部分,那么就可以使用后半部分进行测试。其次,您的两个课程出现在两个单一主题上。对于这两个,你不能根据其他主题的数据设计算法。第三,更重要的是,大多数班级没有足够的样本。例如,eat_soup 类只有 3 个样本。

总之,您应该使用leave-subject-out,但在出现大量主题并且总共有足够样本的类上。