用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

点击上放关注,All in AI中国

在我的其他帖子中,我谈过很多主题,例如:如何将机器学习和物理结合起来,以及机器学习如何用于生产优化以及异常检测和状态监测。但在这篇文章中,我将讨论时间序列预测中机器学习的一些常见缺陷。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

时间序列预测是机器学习的一个重要领域。这很重要,因为有很多涉及时间成分的预测问题。然而,虽然时间组件添加了额外的信息,但与许多其他预测任务相比,它还使得时间序列问题更难以处理。

这篇文章将介绍使用机器学习进行时间序列预测的任务,以及如何避免一些常见的陷阱。通过一个具体的例子,我将展示如何拥有一个好的模型并把它投入生产,而实际上,该模型可能没有任何预测能力,更具体地说,我将专注于如何评估你的模型精度,并显示如果简单地依赖常见的错误指标,如平均百分比误差,R2得分等。

时间序列预测的机器学习模型

有几种类型的模型可用于时间序列预测。在这个具体的例子中,我使用了长短时记忆网络,或者简称LSTM网络,这是一种特殊的神经网络,可以根据以前的数据进行预测。它广泛应用于语音识别、时间序列分析等领域。但是,根据我的经验,在许多情况下,更简单的模型类型实际上提供了准确的预测。使用诸如随机森林、梯度增强回归和时间延迟神经网络等模型,可以通过一组时延加入到输入中,从而在不同的时间点表示数据。由于TDNN的序列特性,它被认为是前馈神经网络,而不是递归神经网络。

如何使用开源软件库实现模型

我通常使用Keras来定义我的神经网络模型类型,Keras是一个高级神经网络API,用Python编写并且能够在TensorFlow、CNTK或Theano之上运行。对于其他类型的模型,我通常使用Scikit-Learn,这是一个免费的软件机器学习库,它具有各种分类、回归和聚类算法,包括支持向量机、随机森林、梯度增强、k均值和DBSCAN,并设计与Python数值和科学库NumPy和SciPy互操作。

但是,本文的主要内容不是如何实现时间序列预测模型,而是如何评估模型预测。因此,我不会详细介绍模型构建等,因为还有很多其他博客文章和文章涵盖这些主题。

示例案例:时间序列数据的预测

在这种情况下使用的示例数据如下图所示。稍后我将更详细地回到数据,但是现在,我们假设这些数据代表股票指数的年度演变。数据被分成训练和测试集,其中前250天用作模型的训练数据,然后我们尝试在数据集的最后部分预测股票指数。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

由于我不关注模型实现,因此我们直接进入评估模型准确性的过程。仅通过对上图的直接观察,模型预测似乎与实际指标非常接近,表明了良好的准确性。但是,为了更加精确,我们可以通过绘制如下图所示的散点图中的实际值与预测值来评估模型精度,并计算常见误差度量R2得分。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

从模型预测中,我们获得了0.89的R2得分,并且看似真实值和预测值之间匹配良好。但是,正如我现在将更详细地讨论的那样,这种度量和模型评估可能会产生误导。

这是完全错误的......

从上面的数字和计算的误差指标来看,该模型显然给出了准确的预测。然而,实际情况并非如此,这只是一个例子,说明在评估模型性能时,选择错误的准确度度量可能非常具有误导性。在该示例中,为了便于说明,明确地选择数据以表示实际上不能预测的数据。更具体地说,我称之为“股票指数”的数据实际上是使用随机游走过程建模的。顾名思义,随机游走是一个完全随机的过程。因此,使用历史数据作为训练集以学习行为和预测未来结果的想法是不可能的。鉴于此,这个模型怎么可能给我们如此准确的预测呢?我将更详细地回顾一下,最终发现,这一切都归结为(错误的)精确度度量选择。

时间延迟预测和自相关

顾名思义,时间序列数据不同于其他类型的数据,因为时间方面很重要。从积极的方面来说,这为我们在构建我们的机器学习模型提供了额外的信息,不仅输入特性包含有用信息,而且输入/输出随时间变化。然而,虽然时间组件添加了额外的信息,但与许多其他预测任务相比,它还使得时间序列问题更难以处理。

在这个具体的例子中,我使用了一个LSTM网络,它根据以前的数据进行预测。但是,当稍微放大模型预测时,如下图所示,我们开始看到模型实际上在做什么。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

时间序列数据往往具有时间相关性,并且表现出显著的自相关性。在这种情况下,这意味着时间“t + 1”处的索引很可能接近t时刻的索引。如右图所示,模型实际上在做的是,当在时间“t + 1”预测值时,它只是简单使用时间“t”的值作为预测(通常称为持久性)模型)。绘制预测值与实际值之间的互相关(下图),我们可以看到,在滞后1天的时间处有一个明显的峰值,表明该模型仅使用先前的值作为对未来的预测。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

如果使用不当,准确度指标可能会非常具有误导性

这意味着,在根据其直接预测值的能力评估模型时,常见的误差度量(例如平均百分比误差和R2分数)都表明高预测准确性。但是,由于示例数据是通过随机游走过程生成的,因此该模型无法预测未来结果。这突出了一个重要的事实,即通过直接计算常见错误度量来简单地评估模型预测能力可能会产生误导,并且很容易被人误解为对模型准确性过于自信。

平稳性和差分时间序列数据

静止时间序列是其统计特性(例如均值、方差、自相关等)随时间变化的常数。大多数统计预测方法基于这样的假设:通过使用数学变换可以使时间序列近似静止(即,“固定”)。一个这样的基本转换就是数据的时差,如下图所示。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

这种转变的作用是,我们不是直接考虑指标,而是计算连续时间步长之间的差值。

定义模型以预测时间步长之间的值的差异而不是值本身,是对模型预测能力的更强的测试。在这种情况下,不能简单地使用数据具有强自相关性,并使用时间“t”的值作为“t + 1”的预测。因此,它提供了对模型的更好测试,以及它是否从训练阶段学到了任何有用的东西,以及分析历史数据是否实际上可以帮助模型预测未来的变化。

时差数据的预测模型

由于能够预测时差数据而不是直接预测数据,是模型的预测能力的一个更强的指标,让我们尝试使用我们的模型来试试。该测试的结果如下图所示,显示了实际值与预测值的散点图。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

该图表明该模型不能基于历史事件预测未来的变化,这是这种情况下的预期结果,因为数据是使用完全随机随机游走过程生成的。根据定义,能够预测随机过程的未来结果是不可能的,如果有人声称这样做,那么我们应该要保持怀疑

你的时间序列是随机游走吗?

您的时间序列实际上可能是随机游走,有些方法可以检查如下:

  • 时间序列显示强烈的时间依赖性(自相关),其线性衰减或以类似的模式衰减。
  • 时间序列是非平稳的并且使其静止,在数据中没有明显可学习的结构。
  • 持久性模型(使用前一时间步骤中的观察结果,作为下一个时间步骤中将要发生的事情)提供了可靠预测的最佳来源。

最后一点是时间序列预测的关键。使用持久性模型的基线预测可以快速表明您是否可以做得更好。如果你不能,则可能是在处理随机游走(或接近它)。人类的大脑天生就会到处寻找模式,我们必须保持警惕,不要通过为随机游走过程开发复杂的模型来浪费时间。

总结

我想通过本文强调的主要观点是,在评估模型性能的预测精度时要非常小心。通过上面的例子可以看出,即使是完全随机的过程,根据定义预测未来结果也是不可能的,人们很容易被愚弄。通过简单地定义模型,进行一些预测并计算常见的准确度指标,人们似乎可以拥有一个好的模型并决定将其投入生产。然而,实际上,该模型可能没有任何预测能力。

如果您正在进行时间序列预测,并且可能认为自己是一名数据科学家,我建议您也将重点放在科学家方面。始终对数据所告诉你的内容持怀疑态度,提出关键问题并且从不得出任何轻率的结论。科学方法应该像应用于任何其他科学一样应用于数据科学。

用机器学习进行时间序列预测该如何避免那些常见“陷阱”?

编译出品

相关推荐