如何拆分数据集以进行时间序列预测?

机器算法验证 交叉验证 分区
2022-01-27 20:01:02

我有一家面包店的历史销售数据(每天,超过 3 年)。现在我想建立一个模型来预测未来的销售(使用工作日、天气变量等功能)。

我应该如何拆分数据集以拟合和评估模型?

  1. 是否需要按时间顺序进行训练/验证/测试拆分?
  2. 然后我会用训练集和验证集进行超参数调整吗?
  3. 对于时间序列问题,(嵌套)交叉验证是一个糟糕的策略吗?


编辑

以下是我在遵循@ene100 建议的 URL 后遇到的一些链接:

  • Rob Hyndman 在理论实践中描述“滚动预测起源” (使用 R 代码)
  • 滚动预测原点的其他术语是“向前优化”(此处此处)、“滚动地平线”或“移动原点”
  • 这些技术似乎不会在不久的将来集成到 scikit-learn 中,因为“对这些技术的需求和开创性尚不清楚”(在此处说明)。

是时间序列交叉验证的另一个建议

4个回答

Rob Hyndman 博客中的此链接包含一些可能有用的信息:http ://robjhyndman.com/hyndsight/crossvalidation/

根据我的经验,将数据拆分为按时间顺序排列的集合(第 1 年、第 2 年等)并检查参数随时间的稳定性对于构建稳健的东西非常有用。此外,如果您的数据是季节性的,或者有另一种明显的分组方式(例如地理区域),那么检查这些子组中的参数稳定性也可以帮助确定模型的稳健性以及拟合是否有意义不同类别数据的不同模型。

我认为统计测试可能很有用,但最终结果也应该通过“气味测试”。

1)从技术上讲,如果您使用 AIC 和类似标准,则不需要进行样本外测试,因为它们有助于避免过度拟合。

3)我看不出你怎么能做标准的简历,因为这意味着训练一个带有一些缺失值的时间序列模型。相反,尝试使用滚动窗口进行训练并预测窗口后面一个或多个点的响应。

我经常从贝叶斯的角度来处理问题。在这种情况下,我会考虑使用过度估算作为一种策略。这意味着为您的数据设置可能性,但忽略您的一些结果。将这些值视为缺失,并使用相应的协变量对这些缺失的结果进行建模。然后循环省略数据。您可以在例如 10 倍 CV 程序中执行此操作。

当在抽样程序中实施时,这意味着在每个步骤中,您都会绘制遗漏数据值的候选值(连同您的参数),并根据您提出的模型评估其可能性。达到平稳性后,给定模型的反事实采样值可用于评估预测误差:这些样本回答了“如果没有这些值,我的模型会是什么样子?”的问题。请注意,这些预测还将继承系数估计中存在的不确定性的不确定性,因此当您将所有预测值收集在一起时,例如 2010 年 3 月 1 日,您将获得该日期的预测分布。

这些值是抽样的事实意味着您仍然可以使用依赖于完整数据系列(例如移动平均值)的误差项,因为您在每一步都有可用的抽样结果值。

在您的情况下,您没有很多选择。你似乎只有一家面包店。因此,要运行样本外测试,您唯一的选择是时间分离,即训练样本将从开始到最近的某个时间点,而保留将从那时到今天。

如果您的模型不是时间序列,那就另当别论了。例如,如果您的销售额,其中是季节性假人、天气等不同外部因素的函数,但不是,那么这不是动态的时间序列模型。在这种情况下,您可以以任何不同的方式创建保留样本,例如随机天子集、过去任何时期的一个月等。yt=f(t)+εtf(t)ys<t