是的,随机训练测试拆分会导致数据泄漏,如果传统的 k-fold 和 leave-one-out CV 是遵循的默认程序,则会发生数据泄漏。泄漏是传统 CV 不适用于时间序列的主要原因。当你不应该使用这些交叉验证器时会夸大性能指标,因为它们允许训练模型作弊,因为“来自未来”的观察(后验样本)泄漏到训练集中。
由于时间序列数据是按时间排序的,因此我们希望保持必须使用过去的观察来预测未来的观察这一事实。标准交叉验证算法中的随机化不保留时间顺序,我们最终使用在后验样本上训练的模型对某些样本进行预测。虽然这对于某些应用程序来说并不是一个大问题,但如果时间序列数据通常沿时间轴强相关,它就会成为一个关键问题。传统 CV 的随机化使得验证集中的每个样本都可能在训练集中存在大量强相关样本。这违背了拥有验证集的目的:模型本质上已经“知道”验证集,
一种解决方案是使用Walk-forward 交叉验证(最接近的包实现是Time Series Split in sklearn),它对每个拆分的完整样本集进行不同的限制,但这会遇到一个问题,即在拆分点附近,我们可能有训练评估时间晚于验证样本预测时间的样本。这种重叠样本不太可能是独立的,导致信息从训练集泄漏到验证集。为了解决这个问题,可以使用吹扫。
吹扫
清除涉及从训练集中删除评估时间晚于验证集中最早预测时间的任何样本。这确保了对验证集的预测没有前瞻偏差。但是由于walk-forward CV还有其他不满,比如在训练折叠构建过程中缺乏对最新数据的关注,因此以下方法正越来越广泛地用于时间序列数据:
组合交叉验证
考虑我们放弃训练集中的所有样本都在验证集中的样本之前的要求。这并不像听起来那样有问题。关键是要确保验证集中的样本合理地独立于训练集中的样本。如果此条件得到验证,验证集性能仍将是新数据性能的良好代理。
组合 K 折交叉验证类似于 K 折交叉验证,不同之处在于我们将验证集包含在j<K样本块。然后我们有K选择j可能的不同分裂。这使我们能够轻松创建大量拆分,只需将j=2或者3,解决了另外两个未提及但清除未解决的问题。
然而很明显,我们不能使用组合 K 折交叉验证。我们必须确保训练集中和验证集中的样本是独立的。我们已经看到净化有助于减少他们的依赖。但是,当验证样本之后出现训练样本时,这还不够。
禁运
我们显然还需要防止验证集右端的训练和验证样本重叠。但是,简单地丢弃任何预测时间发生在前一个验证样本块中的最新评估时间之前的训练样本可能是不够的。在较长时间段内,样本之间可能存在相关性。为了处理这种长期相关性,我们可以在验证集的每个右端之后定义一个禁运期。如果训练样本预测时间落入禁运期,我们只需从训练集中删除样本。必须根据手头的问题和数据集估计所需的禁运期。
组合交叉验证的一个很好的特点是,由于每个样本块在验证集中出现的次数相同,我们可以(任意)将它们分组到整个数据集上的验证预测中(请记住,这些预测已经由在不同训练集上训练的模型制作)。这对于提取整个数据集的性能统计数据非常有用。