在预测时间序列时,如何在训练后将测试数据合并回模型中?

数据挖掘 时间序列 训练 预测
2021-10-11 14:59:48

构建分类或回归模型时,通常会将数据拆分为训练数据集和测试数据集。测试数据是整体数据的随机选择子集。

完成训练后,丢弃测试数据,并将构建的模型应用于新的未知数据。

但在时间序列的情况下,这是行不通的:您不能只是随机选择测试数据集的任何数据子集,因为数据是有序的。测试数据集必须由后来对数据的观察组成,而训练数据集由对数据的早期观察组成。

例如,假设您有一年中 11 个月的数据,并且您想要预测 12 月的值。您将使用 1 月到 9 月的数据训练您的模型,然后使用 10 月和 11 月的数据对其进行测试。

但是在您成功训练模型后,您将如何处理测试数据?

一方面,使用由 1 月至 9 月数据构建的模型来预测 12 月的值是没有意义的。这样的模型将错过 10 月和 11 月发生的任何重要趋势。

另一方面,如果将 10 月和 11 月的数据带回模型中,模型的参数会发生变化,因此我们不再确定是否会获得与训练模型时相同的准确度只有一月至九月的数据。

这里似乎有一个两难境地。

那么,当使用机器学习模型,尤其是像神经网络这样的非参数模型进行时间序列预测时,如何解决这个问题呢?他们是将测试数据合并到模型中还是丢弃它?

2个回答

我同意 Emre 对您的问题的评论。

如果您有足够的数据,我会尝试通过在数据的不同时间段上训练模型来交叉验证您的模型。例如,在 1 月至 3 月的数据上训练您的模型,然后对 4 月的数据进行预测。然后,您可以根据 2 月至 4 月的数据训练模型,并预测 5 月的数据。本质上是创建一些训练和测试集,以查看您的模型的泛化程度。一旦你觉得你得到了很好的结果,你就可以在所有可用数据上训练你的最终“生产”模型,然后密切关注当真实数据出现时它的表现,并对你看到的内容进行调整。

过去我在加速度计数据上使用了类似的方法来对特定锻炼中的锻炼进行分类,并且效果很好。也许类似的东西对你有用。

对于未来的读者,我的方法是编写一个测试迭代器/评估器,它采用现有数据集并在某个时刻将其分成两部分进行训练和测试。然后在训练集上训练一个新模型,并根据未来的测试集评估其预测。重复整个过程,将切割时刻向前微调一些增量,然后丢弃模型。

我改变了两件事:a)测试数据的数量,因为我想了解模型需要多少历史数据才能解决,b)切割时刻来模拟系统在现实世界中的任何时刻的工作方式及时。

以下是一些示例训练运行。

蓝红线是真实数据。蓝色部分是模型看到的训练数据。红色部分是对模型隐藏的测试数据,因此可用于根据实际情况评估预测。黄线是模型对未来的预测,总是从训练数据的最后开始。性能是通过黄色和红色之间的某种互相关技术来衡量的。

培训 1

培训 2

培训 3

顺便说一句,我不确定我是否理解您将测试数据纳入培训的意思。通常你永远不会这样做,否则它会使结果看起来更准确。实际上,您甚至不应该从测试数据结果中进行参数训练,因为这会间接将属性注入回模型中,而这些属性应该保持不可见,因此使用中间“评估”集来测试每个周期(严格来说是更多的训练数据),测试数据仅在参数固定后用于最终评估。