机器学习项目:探索性数据分析前还是后拆分训练/测试集?

17

在进行任何探索性数据分析之前,是将数据拆分为训练集和测试集还是仅基于训练数据进行所有探索?

我正在开展我的第一个完整的机器学习项目(课程毕业项目的推荐系统),并且正在寻求操作顺序的澄清。 我大致的概要是导入和清理数据,进行探索性分析,训练模型,然后在测试集上进行评估。

我现在正在进行探索性数据分析 - 最初没有特别的内容,只是从变量分布等方面入手。 但我不确定:我应该在探索性分析之前或之后将数据拆分为训练集和测试集呢?

我不想通过检查测试集来潜在地污染算法训练。 然而,我也不想错过可能反映真实信号的视觉趋势,而我的肉眼在过滤后可能看不到,因此可能会错过在设计算法时调查一个重要和相关的方向。

我查看了其他的帖子,比如这个,但我发现它们更多地涉及正则化或对原始数据的实际操作。我找到的答案各不相同,但优先考虑先进行拆分。然而,在将数据拆分之前,我不打算对数据进行任何实际操作(除了检查分布并可能进行某些因子转换)。

在您自己的工作中,您会怎么做以及为什么?

感谢您帮助新程序员!


假设完整数据足够小,易于处理(即适合内存),我总是使用完整集进行EDA。只有在建模时才会拆分为测试/训练集。 - Conor Neilson
2
这个问题对于SO来说有点偏题(它更倾向于“基于观点”,并不是关于编码本身的),但它仍然是一个非常好的问题。这里有一个角度;你可能会在CrossValidatedRStudio Community上找到其他人或者其他感兴趣的听众。 - alistaire
3
EDA不需要拆分。EDA只是指导您未来的步骤。观察任何趋势可能有助于指导您的特征选择和/或工程。EDA也可以帮助您更好地清理数据。机器学习的效果取决于您的数据质量。 - NelsonGon
这是一个关于正确的机器学习数据科学流程的好问题。 - msarafzadeh
3个回答

6
为了回答这个问题,我们应该想一想在机器学习中为什么要将数据分成训练集、验证集和测试集(也可以参考这个问题)。 训练集用于模型开发。我们通常会仔细研究这些数据,以获取特征工程和机器学习模型的一般结构的想法。然后,我们使用训练数据集来训练模型。 通常,我们的目标是生成不仅在训练数据上表现良好,还在以前未见过的数据上表现良好的模型。因此,我们希望避免捕捉当前可用数据的特殊性而不是未来将看到的数据的一般结构(“过度拟合”)。为了做到这一点,我们评估我们正在训练的模型的质量,通过评估其在另一个数据集上的性能,即验证数据,并选择在验证数据上表现最佳的模型。 一旦训练了我们的最终模型,我们通常希望对其性能进行无偏差的估计。由于我们已经在模型开发过程中使用了验证数据(我们选择了在验证数据上表现最佳的模型),因此我们不能确定我们的模型在未见数据上的表现是否同样良好。因此,为了评估模型质量,我们使用新批次的数据进行性能测试,即测试数据
这个讨论给出了你的问题的答案:我们不应该使用测试(或验证)数据集进行探索性数据分析。因为如果我们这样做,我们会冒着将模型过度拟合到我们有的数据的特殊性的风险,例如通过为测试数据工程化的特征。同时,我们将失去获取模型性能无偏差估计的能力

1
我会把问题反过来; 使用测试集是否有害?
建模的目标是得到一个方差小(偏差小)的模型:这就是为什么测试集要保留一些数据,以评估模型在新数据上的表现(即其方差)。如果您在建模过程中使用测试集,则无法进行评估,而且会导致数据过拟合。
探索性数据分析(EDA)的目标是了解正在处理的数据;特征的分布、它们之间的关系、它们的动态等。如果将测试集留在数据中,是否存在“过度拟合”数据理解的风险?如果是这种情况,您将在70%的数据上观察到一些不适用于剩余30%(测试集)的属性…考虑到分割是随机的,这是不可能的,或者您非常不幸。

0

根据我的理解,在机器学习管道中,应该在将数据拆分为训练集和测试集之前进行探索性数据分析。

以下是我的原因:

  • 数据可能在一开始并未清洗。它可能存在缺失值、不匹配的数据类型和异常值。
  • 需要了解数据集中每个特征与目标变量的关系。这将有助于了解每个特征相对于业务问题的重要性,并有助于推导出其他特征。
  • 数据可视化也将有助于从数据集中获取见解信息。

完成上述操作后,我们可以将数据集拆分为训练集和测试集。因为训练集和测试集中的特征必须相似。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接