数据泄露你好
我读过几篇关于测试组和训练组之间数据泄漏的文章。 避免泄漏的常见建议:
1 在进行任何归一化、标准化和缺失值插补之前,将数据库拆分为训练集和测试集
2 在时间序列的情况下避免随机分割。 确定一个时间切割点并用它来分离训练集和测试集。
有什么意见、建议、有用的读物吗?
菲利斯
数据混合和清理回复:数据泄露你好@FR60 ,
不幸的是,我无法确认 JMP 是否针对每个平台或在每种情况下都这样做。
我确实知道,在 JMP 的几个建模平台中,当您获得估算报告时,通常会有一个用于按比例估算的报告。 您还可以在 Fit Y by X 平台中看到这一点。 在那里,如果您将一条线、多项式或任何函数拟合到数据,JMP 会返回一个以拟合函数为中心的公式。 因此,如果拟合为 y=a*x+b*x^2 +c,则 JMP 返回的函数实际上是 y=a*(x-x0)+b*(x-x1)^2+c,其中 x0 x1 和 x1 是常数。 除非您明确告诉它不要这样做,否则它会执行此操作。
我的理解是 JMP 这样做是因为将数据居中时对 a、b 和 c 的估计比不居中时更准确。 如果 JMP 对每个平台都这样做,我不会感到惊讶,但我不知道。 它们在生成 DOE 时对所有数据进行编码,因此即使您输入实际值,在程序后端,它也会使用 -1、0、1 等编码值来表示 DOE 中的低、中、高设置。 它实际上并不使用您可能输入的真实数字。
为了获得有关该主题的完整确认,我会直接写信给 JMP 工作人员,或与支持您所在区域的系统工程师交谈。 最好知道这是否是平台相关的事情,或者是通过 JMP 全面完成的。
谢谢!,
DS
回复:数据泄露嗨戴德里奇
非常感谢您的评论。
关于训练测试泄漏,几个博客中报告的建议是在进行任何数据预处理之前分割数据。 例如,如果我们想要标准化 0 到 1 之间的所有预测变量,我们应该在分割数据之前,然后仅使用训练数据计算最小值/最大值,然后也使用这些值标准化验证和测试数据。 其他类似类型的数据管理(例如 z 标准化或缺失值插补)也是如此。 当然,如果使用交叉验证,则需要按照上述相同的方法来实施更复杂的计算。
现在让我们进入问题。 您在邮件中写道:
”我现在明白为什么在分割后标准化/规范化数据可能很重要,这是有道理的。 据我了解,JMP 通常会在计算过程中在幕后执行此操作,然后在将其制成报告时重新调整比例”
这意味着使用 JMP 我们不需要担心训练测试泄漏,因为 jmp 算法内部避免了这种情况?
如果是这样,这对我来说太好了。
请问您能确认一下吗?
谢谢菲利斯
回复:数据泄露你好@FR60 ,
我可以看出在这方面可能存在一些混乱。 您提到的分裂和泄漏有两种,就像您在 Kaggle 引用这篇文章时一样,而且@dale_lehman对此也发表了评论。
一种划分是确保用于训练模型的数据不包括仅在结果中已知的数据。 这就是 Kaggle 所说的“目标泄漏”。 另一个是“训练测试污染”,您要确保测试数据不会进入训练或验证集。 第二个是我更常提到的——我的数据集通常不包含预测变量之后已知的列,因此“目标泄漏”对我来说并不常见,而“训练测试”污染”是。
对于 JMP,也许更容易将数据拆分视为按行拆分 ==“训练测试污染”与按列拆分 ==“目标泄漏”。 根据您的数据结构,您可能只执行其中一项操作或同时执行两项操作。
我现在明白为什么在分割后标准化/规范化数据可能很重要,这是有道理的。 据我了解,无论如何,JMP 通常都会在计算过程中在幕后执行此操作,然后在将其制成报告时重新调整比例。
回到你原来的帖子,我想这取决于你的数据需要如何分割以及它的结构如何——它是垂直时间结构还是水平结构。 这可能决定您是否对时间数据进行按行或按列分割。 但是,我会应用类似的逻辑来决定何时剪切时间序列。 如果某个时间点结果可能会作为预测变量输入到模型中,那么您肯定需要在此之前进行削减。 我不确定您如何以正确的方式解决“火车测试污染”问题。 如果您尝试进行预测或时间序列分析,JMP 实际上可以很好地使用所有数据。 您可以根据历史时间数据决定向前预测多少个周期,并且输出具有置信区间等。
很好的讨论!,
DS
回复:数据泄露另一篇关于数据预处理期间数据泄漏的文章。
https://machinelearningmastery.com/data-preparation-without-data-leakage/
回复:数据泄露我发现 Kaggle 中的这个教程非常有趣。
再次强调,在将数据分割到训练和测试集中之前,避免对数据应用任何标准化和缺失值插补。
https://www.kaggle.com/alexisbcook/data-leakage
再见菲利斯
回复:数据泄露你好@FR60 ,
针对您提出的具体问题,我的看法是:
1.如果要标准化和/或规范化数据,我认为最好在拆分数据集之前进行。 至于缺失值插补,您需要小心。 有时缺失的数据可以提供信息,有时却不能。 此外,JMP 估算值的方式可能不适合您的特定数据。 它可能会错误地估算缺失的数据,并在数据中引入人为行为,从而错误地影响模型。
2. 对于时间序列,如果您确实使用时间序列来及时预测和预测未来事件,我认为您不会拆分数据集 - 至少不会使用 JMP 中的时间序列平台,他们在这些平台中没有验证列。 但是,如果您想要一个独立的数据集来比较不同的预测模型,看看哪一个最适合未来未使用的数据,那么是的,我会在某个时刻分割数据集,并使用它来生成预测模型并保存将这些公式添加到数据表中,看看它们预测未使用数据的效果如何。 您可以使用简单的 Fit Y by X 并查看 R^2 值来查看哪个模型预测结果最好,或者查看实际数据和建模数据之间的残差以查看哪个残差总和最小或类似的东西。
不过,总的来说,我所做的是将数据表按 80/20 分成训练数据集和测试数据集。 然后,我将测试数据分离到一个完全不同的数据表中,以便我构建的模型没有机会使用测试数据。 这不仅仅是简单地“隐藏”和“排除”数据,还消除了算法意外使用测试数据的任何可能性。 通过“训练”集数据表,我要么创建一个验证列,要么只使用平台的验证部分选项,再次将其按 80/20 分成训练/验证,以减少过度拟合。 在使用不同平台生成多个不同模型后,我使用测试数据集来查看哪个模型最能预测未使用/未见过的数据。
希望这可以帮助,
DS
回复:数据泄露您链接到的文章对数据泄漏非常困惑。它混合了训练和验证/测试数据(过度拟合)的差异性能的概念,以及训练和测试数据之间缺乏明确的界限(这是考虑泄漏的一种方式)。我认为这两个概念是不同的。当您的模型适合训练数据而不是测试数据时,这就是过度拟合的一个例子。泄漏不能解释这一点 - 事实上,如果存在泄漏,它也会出现在训练数据中。此外,如果测试数据是随机选择的,那么无论何时训练数据出现在测试数据中,泄漏都应该发生在训练数据中(反之亦然)。它是由于数据中具有用于预测响应的信息特征而产生的,但在进行预测时无法知道这些特征。
时间序列数据的情况不太清楚,因为测试数据不是整个数据集的随机选择(可能是随机时间)时期)。大多数时间序列模型将使用过去的数据来预测未来 - 如果您使用较晚的数据来预测较早的数据,则会出现泄漏。过度拟合将使用一个时间段来预测用于构建模型的时间段的子集 - 即,不将时间段分开。即使在时间序列模型中避免了过度拟合和泄漏,也可以假设用于构建模型的时间段与您尝试预测的时间段足够相似。如果周期不相似(例如,如果力的变化使模型不再相关),那么我会说模型不是很好,但我不会称之为泄漏,也可能不会称之为过度拟合。
回复:数据泄露亲爱的@dale_lehman ,是的,你是对的,我混合了它,至少在形式上,因为我考虑了总体目标,即拥有一个良好且强大的模型。 避免泄漏被定义为一个目标,而不是在测试集中已经看到的数据。 我在这里找到了一些额外的解释:
机器学习中的数据泄露。 如何预防减少……的问题作者:德文·索尼 :crown: |走向数据科学
但是,当我们通常随机划分训练集和测试集时,如何有意地做到这一点呢? 我更认为在流程模型类别中,训练和测试集都来自同一个流程。 当考虑预测时,情况可能会有所不同。
回复:数据泄露我想知道我们是否混淆了两件事:泄漏和过度拟合。我认为他们是非常不同的。过度拟合始终是预测建模的一个潜在问题,防止它的通常方法是进行验证,如果有足够的数据,还需要一个单独的测试数据集。根据我的经验,使用 JMP 时,过拟合问题比其他情况要小,因为许多其他调整参数也有助于防止过拟合。例如,对于决策树,设置相对较高的最小分割大小将有助于避免过度拟合。尽管如此,使用单独的测试数据来评估您的模型是否能够对新数据产生现实的预测仍然是一个好主意。我认为这对于时间序列数据尤其重要。
在我看来,泄漏是一个完全不同的问题。泄漏是错误指定的模型。您所使用的因素只有在您尝试预测的同时才知道。例如,如果您尝试预测客户保留率,而您的因素之一是今年的购买量,那么您将仅拥有保留客户的数据,而不会保留未保留客户的数据。在这种情况下,今年的购买因素将完美地预测客户保留率,但这不是一个有用的模型。我认为这就是泄漏。
我不认为通过使用不同的训练/验证/测试数据集可以防止或检测泄漏。您可能会检测到这 3 个中任何一个的泄漏:训练数据上的完美模型(或接近完美的模型)足以怀疑可能存在泄漏。我认为预防泄漏的最佳方法是仔细考虑这些因素并了解如何以及何时测量它们。如果一个模型看起来好得令人难以置信,那么它可能是由于泄漏(或者,它可能只是一个非常好的模型)。但我不认为这是任何技术手段都能回答的问题。
我很想听听其他人对此有何看法。
回复:数据泄露这是我有限的经验。
建模相当复杂(正确的模型选择、数据准备、数据分割、元数据调整......)。
一个好的机器人模型独立于分割、元数据、模型类型......
训练集和测试集都需要具有代表性,但测试集不需要那么全面。 需要进行培训/测试来判断结果,因为@ih已经提到了。
对于分割,可以使用 stratify 选项来控制分割。 但对于建模和分割,您需要流程知道如何最好地做到这一点。
对于复杂的模型,当结果至关重要时,我尝试测试不同的模型、不同的元数据和不同的验证列。 当没有重大差异时,就没有问题。 这在 JMP (Pro) 中很容易完成。
最后只有这个测试才能给你答案,是否不漏水。 但老实说,当我确信有一个好的模型时,我不介意泄漏。
回复:数据泄露我的2分钱:
如果您有时间序列数据,我倾向于认为您的第 2 项是更大的问题,除非您进行大量插值。考虑数据中的噪声源,如果其中任何一个出现在多行中,或者行以某种方式链接到之前和之后的行(随着时间的推移监控水箱液位,当水箱需要超过 1 行才能到达例如,一个新的稳定状态),那么您就不能按行分割数据并期望验证或测试集独立于训练。
相反,您可能会考虑将数据拆分为更大的块进行测试和验证,例如:
- 确定流程发生一些“重大”变化的新时期,并将稳态运行的持续时间保持在同一组中(更难但更好),或者
- 使用足够长的时间段,以便您确信它们代表不同的运行条件,但又足够短,以便它们不包含超过 1 个运行条件,并将该时间段中的所有行保留在同一验证组中(更容易,但仍可能面临相同的风险) )
- 使用上面确定的周期,将每个运行汇总到一行中,可能使用变量的平均值或标准差,或其他功能数据浏览器。 (最好的)
无论哪种情况,您都可以考虑排除组之间的过渡期。
我的个人经验:自从开始使用至少其中一种方法以来,验证和测试组统计数据代表了对模型预测能力更合理的期望。