资料外泄你好
我已经阅读了几篇有关测试和培训小组之间数据泄漏的文章。 避免泄漏的常见建议:
1在进行任何归一化,标准化和缺失值估算之前,将数据库分为训练集和测试集
2在时间序列的情况下,避免随机分裂。 确定一个切入点,并用它来分离训练和测试集。
有什么意见,建议,有用的读物吗?
菲利斯
分析工具回复:数据泄漏我的2美分:
如果您有时间序列数据,我倾向于认为项目2是更大的问题,除非您进行大量插值。请考虑数据中的噪声源,如果其中的任何噪声发生在多行中,或者行是否以某种方式链接到前后的行(监视储罐的液位随时间变化,则储罐需要花费多于一排的噪音) (例如一个新的稳定状态),则您不能按行拆分数据,并且期望验证或测试集独立于训练。
相反,您可以考虑将数据分成更大的块进行测试和验证,例如:
- 识别过程进行一些“重大”变化的新时期,并将稳态运行的持续时间保持在同一组中(更难但更好),或者
- 使用足够长的时间段,以确保它们代表不同的运行条件,但足够短的时间段,以使其不包含超过1个运行条件,并将该时间段中的所有行都保留在同一验证组中(更容易,可能仍然面临相同的风险)
- 使用上面确定的时间段,可以使用变量的平均值或标准差或其他函数的数据浏览器,将每个运行汇总为一行。 (最好)
无论哪种情况,您都可以考虑排除组之间的过渡期。
我的个人经验:自从开始使用这些方法中的至少一种以来,验证和测试组统计数据代表了对模型预测能力的更合理的期望。
回复:数据泄漏这是我的有限经验。
建模非常复杂(正确的模型选择,数据准备,数据拆分,元数据调整...)。
一个好的,稳健的模型独立于拆分,元数据,模型类型...
培训和测试集都需要代表该过程,但是测试集并不需要那么全面。 培训/测试是判断结果的必要条件,因为@ih已经提到过。
对于拆分,可使用stratify选项控制拆分。 但是对于建模和拆分,您都需要流程知道如何做到最好。
对于复杂的模型,当结果至关重要时,我尝试测试不同的模型,不同的元数据和不同的验证列。 如果没有重大差异,就没有问题。 这在JMP(Pro)中非常容易完成。
最后,只有该测试为您提供答案,是否没有泄漏。 但老实说,当我可以肯定有一个好的模型时,我不会介意泄漏。
回复:数据泄漏我想知道我们是否混淆了两件事:泄漏和过度拟合。我认为它们是完全不同的。过度拟合始终是预测建模的潜在问题,而防止过度拟合的通常方法是进行验证,并且如果您有足够的数据,则还需要单独的测试数据集。根据我的经验,与其他情况相比,JMP过度拟合的问题更少,因为许多其他调整参数也有助于防止这种情况。例如,对于决策树,设置相对较高的最小拆分大小将有助于避免过度拟合。最好有单独的测试数据来评估您的模型是否能够对新数据产生现实的预测。我认为这对于时间序列数据尤为重要。
我认为泄漏是完全不同的问题。泄漏是一个错误指定的模型。您使用的因素只能与您尝试预测的时间同时知道。例如,如果您要预测客户保留率,并且其中一个因素是今年的购买量,那么您将仅拥有保留客户的数据,而那些没有保留客户的数据将丢失。在这种情况下,今年采购量的因素将完全预测客户保留率,但这不是一个有用的模型。我认为这就是泄漏。
我不认为通过具有不同的训练/验证/测试数据集可以防止或检测到泄漏。您可以通过以下三种方法中的任何一种来检测泄漏:在训练数据上建立一个完美的模型(或几乎是这样)就足以怀疑可能存在泄漏。我认为最好的预防泄漏方法是仔细考虑因素并了解如何以及何时进行测量。如果模型看起来太好而不能成立,那可能是由于泄漏(或者可能只是一个很好的模型)。但是我认为这不是任何技术手段都能回答的问题。
我很想听听其他人对此有何评论。
回复:数据泄漏亲爱的@dale_lehman ,是的,您是对的,至少在我考虑总体目标时,我至少正式地将其混合在一起,以建立一个良好而强大的模型。 避免泄漏的目的是为了避免在测试集中看到数据。 我在这里找到了一些其他解释:
机器学习中的数据泄漏。 如何防止减少...的问题?通过德文·索尼(Devin Soni):crown:|走向数据科学
但是,当我们通常随机划分训练和测试集时,该如何有意地做到这一点? 我还认为,在过程模型类别中,训练和测试集都来自同一过程。 考虑预测时,可能会有所不同。
回复:数据泄漏您链接到的文章对数据泄漏非常困惑。它混淆了训练和验证/测试数据上的差异性能(过拟合)的想法,而训练和测试数据之间没有明确的界限(这是考虑泄漏的一种方法)。我相信,这两个概念是截然不同的。当模型适合训练数据而不适合测试数据时,这就是过度拟合的一个示例。泄漏不会解决这个问题-实际上,如果存在泄漏,它也会出现在培训数据中。此外,如果测试数据是随机选择的,则只要在测试数据中存在泄漏,训练数据中都应发生泄漏(反之亦然)。这是由于数据中具有用于预测响应的信息特征而导致的,但是在进行预测时尚不知道。
时间序列数据的含义不太清楚,因为测试数据不是整个数据集的随机选择(可能是随机时间时期)。大多数时间序列模型都将使用过去的数据来预测未来-如果您使用以后的数据来预测以前的数据,则会发生泄漏。过度拟合将使用时间段来预测用于构建模型的时间段的子集,即不将时间段分开。即使在时间序列模型中避免了过拟合和泄漏,也可以假设用于构建模型的时间段与您要预测的时间段非常相似。如果周期不相似(例如,如果力的变化使模型不再适用),那么我会说模型不是很好,但是我不会称之为泄漏,也可能不会称之为过度拟合。
回复:数据泄漏你好@ FR60 ,
我对您提出的具体观点的看法:
1.如果要标准化和/或规范化数据,我认为在拆分数据集之前最好这样做。 至于缺失值的估算,您需要注意这一点。 有时丢失的数据可以提供信息,而有时则不能。 同样,JMP推算值的方式可能不适用于您的特定数据。 它可能会错误地估算缺失的数据,并在数据中引入人为的行为,从而会错误地影响模型。
2.对于时间序列,如果您确实使用时间序列来预测和预测将来的事件,那么我认为您不会拆分数据集-至少不是在JMP中使用时间序列平台,它们在那些平台上没有“验证”列。 但是,如果您想要一个独立的数据集来比较不同的预测模型,以查看哪个模型最适合将来的未使用数据,那么是的,我会在某个时候拆分数据集,并使用该数据集生成预测模型并保存将这些公式添加到数据表中,并查看它们如何很好地预测未使用的数据。 您可以使用简单的Fit Y by X并查看R ^ 2值,以查看哪个模型最能预测结果,或者查看实际数据与建模数据之间的残差,以查看残差之和最小或类似的值。 。
不过,总的来说,我要做的是将数据表80/20分为训练和测试数据集。 然后,我将测试数据分离到一个完全不同的数据表中,以使我建立的模型没有机会使用测试数据。 这不仅仅是简单地“隐藏”和“排除”数据,而且消除了算法意外使用测试数据的任何可能性。 然后,使用“培训”设置数据表,创建验证列或仅使用平台的验证部分选项,然后将其80/20再次分为训练/验证,以减少过度拟合。 在使用不同平台生成多个不同模型之后,我将使用测试数据集来查看哪个模型最能预测未使用/看不见的数据。
希望这可以帮助,
DS
回复:数据泄漏我发现Kaggle中的本教程非常有趣。
再次强调避免在对数据进行训练和测试集拆分之前对数据应用任何归一化和缺失值插补。
https://www.kaggle.com/alexisbcook/data-leakage
乔·菲利斯