Scikit-learn: 为时间序列数据实现 WalkForward 交叉验证器。

创建于 2019-07-15  ·  23评论  ·  资料来源: scikit-learn/scikit-learn

描述


在训练集和测试集之间存在差距的时间序列数据中实现前行 cv。

预期成绩


image

扩大
image

Needs Decision New Feature

最有用的评论

我认为添加更好的时间序列交叉验证在范围内。

所有23条评论

@saninstein为什么差距?

@clstaudt gap 是股票交易模型评估的有用功能。 在价格预测中,非常常见的情况是模型在训练集后立即在数据上表现非常好并随着时间的推移而退化。 因此,在某些情况下,跳过训练集之后出现的少量“好”数据可能很有用。

我认为我们对时间序列相关功能的通常立场是它超出了 sklearn 的范围(至少现在是这样)。 对我来说,一旦我们有样本属性(例如附加到数据的时间戳),重新讨论这个问题是有意义的。

我希望@scikit-learn/core-devs 至少对此有其他意见,但我的投票目前是“无法解决”的决议。

@adrinjalali sklearn 已经有许多好的时间序列模型,

哪个?

@adrinjalali已经在 sklearn 中实现了 TimeSeriesSplit :)

TimeSeriesSplit 是所提出的 WalkForwardCV 的特定情况(可以使用gap=0, expanding=True args 实现),实际上 TimeSeriesSplit 可以很容易地替换为 WalkForwardCV(只需设置我之前提到的默认 args)。

我是股票交易 ML 团队的一员,我们成功地使用了各种 sklearn 功能和 sklearn 兼容库。 缺少合适的 CV 拆分器,我们决定将其贡献回 sklearn,但如果不是这种情况,我们将在内部使用它 :)

TimeSeriesSplit 是所提出的 WalkForwardCV 的特定情况(可以通过 gap=0,扩展=True args 实现),实际上 TimeSeriesSplit 可以很容易地用 WalkForwardCV 替换(只需设置我之前提到的默认 args)。

公平,但是我可能会尝试以向后兼容的方式修补TimeSeriesSplit以添加您需要的功能。 这也有更高的机会被社区接受。

时间序列预测不是 WalkForwardCV 的唯一情况。 当数据集观察按时间排序并且验证需要以相同的方式完成时,它很有用。

例如,当我们尝试使用将“允许”交易的 ml 模型改进现有交易策略时,我们的任务之一是丢失交易过滤分类问题。


公平,但是我可能会尝试以向后兼容的方式修补 TimeSeriesSplit 以添加您需要的功能。 这也有更高的机会被社区接受。

我相信这将是最好的解决方案。

我是一名研究时间序列预测模型的数据科学家。 我认为特定于时间序列的事情超出了 scikit-learn 的范围,所以我开始实现我自己的验证代码,与此线程中描述的方法略有不同。

后来我知道了TimeSeriesSplit的存在,并想知道我是否开始重新发明轮子。 我更愿意将验证代码贡献给现有的、已建立的项目。

由于这种模型评估显然有需求,我仍然想知道它适合哪里。

时间序列的预测需要许多模式。 一世
例如,会认为变压器创建小波特征会
非常有用。

但是,这些不在 scikit-learn 的范围内。 会很有用
创建一个以一致的方式实现所有这些的包。 它
可能会回升势头。

创建一个以一致方式实现所有这些的包会很有用。 它可能会获得动力。

是的。 给我报名。

我们很高兴在https://github.com/scikit-learn-contrib/ 中有这样一个包

然后关闭这个:)

我认为添加更好的时间序列交叉验证在范围内。

另见 #13666 #13204 #6322 #13761

关于范围,我同意@amueller 的观点,即我们应该愿意将其扩展到常见用例。 基本上,我们通常在 scikit-learn 估计器(即 sklearn 包)中假设模型应该或多或少地对样本顺序和特征顺序保持不变。 这不包括时间序列估计量。 但是,我们在交叉验证拆分器中没有这个限制,我们长期以来一直认为样本订单需要注意; 最终,交叉验证是围绕 ML 的核心假设所在。

但正如@amueller也指出的那样,实际上应该在现有的拉取请求中继续对话,将它们推向可接受的状态。

当然,但我担心数据的实际时间戳在拆分中应该很重要(IMO 应该是哪个),而不仅仅是行数的情况。 我认为我们不会很快处理时间戳,是吗?

自从我在https://github.com/scikit-learn/scikit-learn/issues/3202首次提出这个问题以来的 5 年里,这个问题在教学或应用的对话中至少出现了 50 次。 @saninstein ,您是否已决定是否在此处推动包含或 -contrib? 如果您有任何需要帮助来解决问题(某处),我很乐意提供帮助。

我也想贡献一份力量。 在另一个问题中写过关于这个的文章,并希望扩展 TimeSeriesSplit 或合作为此创建另一个包。 我觉得这与 CV 域中的拆分有关,应该在 sklearn 中。
老实说,虽然我现在对去哪里和做什么完全感到困惑,但我想做出贡献。 我很注意我的时间,我想以正确的方式为社区使用它。

@mjbommar我认为正如我和@jnothman上面所说的,我们在前进方面非常开放,并且有一些现有的 PR,特别是 #13761 和 #13204,非常感谢对这两个 API 的反馈。

我认为#13204 看起来是最成熟的,所以也许从那里开始最有意义? 鉴于我们的回复延迟,我不确定@kykosic是否仍在努力?

嗯,虽然#13204 没有实现 WalkForward ......我们要先合并 #13204 然后再实现 WalkForward 吗?
那应该是一个单独的 CV 对象吗?

@amueller在这篇文章出现之前,我已经忘记了#

@kykosic很棒,谢谢!

很好奇为什么这个问题因为#13204 已经完成而关闭。 我认为 #13204 是这个的先决条件。

13204 将gapTimeSeriesSplit ,这是此问题请求的功能。

此页面是否有帮助?
0 / 5 - 0 等级