如何最好地评估时间序列预测算法?

机器算法验证 机器学习 预测模型 预言
2022-04-02 16:52:24

在时间序列上训练和评估预测算法的最佳实践是什么?

对于在批处理模式下训练的学习算法,天真的程序员可能会将原始数据集[(sample, expected prediction),...]直接提供给算法的train()方法。这通常会显示人为的高成功率,因为​​该算法将通过使用未来的样本来有效地“作弊”,从而为对早期样本所做的预测提供信息。当您实际尝试使用经过训练的模型来实时预测新数据时,它可能会表现得很糟糕,因为它不再有任何未来数据可以依赖。

我目前的方法是实时训练和评估。对于 N 个训练样本,按时间顺序排列,其中每个样本是由输入 A 和预期预测输出 B 组成的元组,我将 A 输入到我的算法中并得到实际结果 C。我将其与 B 进行比较并记录错误。然后我将样本添加到本地“过去”子集中,并仅在该子集上批量训练一个新模型。然后我对每个训练样本重复这个过程。

或者,把它放在伪代码中:

predictor = Predictor()
training_samples = []
errors = []
for sample in sorted(all_samples, key=lambda o: o.date):
    input_data, expected_prediction = sample

    # Test on current test slice.
    actual_prediction = predictor.predict(input_data)
    errors.append(expected_prediction == actual_prediction)

    # Re-train on all "past" samples relative to the current time slice.
    training_samples.append(sample)
    predictor = Predictor.train(training_samples)

这似乎非常彻底,因为它模拟了如果用户必须在每个时间步进行预测,他们将被迫做什么,但显然,对于任何大型数据集,这将非常慢,因为你正在乘以算法的训练时间(对于许多算法和大型数据集来说很高)每个样本。

有更好的方法吗?

1个回答

您提出的建议在预测文献中被称为“滚动起源”评估。是的,这种评估预测算法的方法被广泛使用。

如果您发现性能是一个瓶颈,您可以进行二次抽样。不要使用所有可能的来源。相反,使用例如每五个可能的来源。(确保您不会在数据中的二次抽样来源和季节性之间引入不必要的混淆。例如,如果您使用每日数据,请不要使用每 7 天作为来源,因为那样您实际上只是在评估预测质量星期二,或仅在星期四等)

再说一次,你真的不需要每次向前滚动原点时都从头开始训练你的模型。从最后训练的模型开始。(例如,在指数平滑中,只需使用自上次训练以来的新数据更新您的组件。)这应该会大大减少您的整体训练时间。