使用机器学习进行时间序列预测的陷阱

RAD极客会 2019/05/23 23:31

原文选自 | kdnuggest

作者 | Vegard Flovik

我曾写过“如何结合机器学习和物理”,以及“机器学习如何用于生产优化”以及“异常检测和状态监测”等主题的文章。但在本文中,我将讨论机器学习中时间序列预测的一些常见陷阱。

知识图谱,使用机器学习进行时间序列预测的陷阱

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

本文将介绍机器学习进行时间序列预测的任务的过程,以及如何避免一些常见的陷阱。我将通过一个具体的例子展示看起来拥有了一个好的模型并决定投入生产,而实际上该模型可能没有任何预测能力,更具体地说,我将专注于如何评估你的模型精度,并向您展示如果只是简单地依赖常见的误差指标(如平均百分比误差,R2得分等),而没有谨慎应用它们的话,反而可能产生极大的误导。

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

有一些类型的模型可用于时间序列预测。在这个具体的例子中,我使用了长短期记忆网络,或称LSTM网络。这是一种特殊的神经网络,可以根据以前的数据进行预测。它在语言识别、时间序列分析等方向很受欢迎。但是,根据我的经验,在许多情况下,越简单的模型类型实际上提供了越准确的预测。使用随机森林、梯度增强回归和延时神经网络等模型时,可以通过添加一组延时到输入来覆盖时序信息,以便在不同的时间点来表示数据。由于它们的有序性,TDNN被作为前馈神经网络实现,而不是递归神经网络。

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

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

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

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

在本文中使用的示例数据如下图所示。稍后我将介绍细节,现在我们先假设这些数据代表了股票指数的年变化。数据被分成训练集和测试集,其中前250天用作模型的训练数据,数据集的最后部分用于尝试预测股票指数。

知识图谱,使用机器学习进行时间序列预测的陷阱

由于我在本文中不关注模型实现,因此直接进入评估模型精度的环节。单单通过目测检查上图,模型预测值似乎紧密跟随真实值,表现出了良好的精度。为了更加精确,我们可以通过绘制如下散点图,查看真实值与预测值来评估模型精度,并计算了误差度量R2得分。

知识图谱,使用机器学习进行时间序列预测的陷阱

R2得分为0.89,看起来这是真实值和预测值之间的达到了良好匹配。但是,正如我即将更详细地讨论的那样,这种度量和模型评估可能会产生误导。

一个简单的错误

根据上面的图表和计算误差,该模型显然给出了准确的预测。然而这仅仅是在评估模型性能时选择了错误的精度度量,并产生误导的一个示例。在该示例中,为了证明,我们故意选择了实际上不能实现预测的数据。更具体地说,我称之为“股票指数”的数据实际上是使用随机游走过程建模的。随机游走顾名思义是一个完全随机的过程。因此,想使用历史数据作为训练集以学习行为和预测未来结果是根本不可能的。那么,为什么该模型似乎正为我们提供非常准确的预测呢?下面我将更详细地回顾一下,这一切都归结为(错误)精确度度量的选择。

延时预测和自相关

时间的意义很重要,从这个角度上说,时间序列数据(如名称所示)与其他类型的数据不同。积极的意义是为我们提供了构建机器学习模型时可以使用的附加信息,不仅输入包含有用信息,而且输入/输出随时间变化。然而,虽然时间成分提供了了额外的信息,但它使得时间序列问题比其他预测任务更难以处理。

在这个例子中,我使用了一个LSTM网络,它根据过往数据进行预测。但是,当我们稍微放大模型预测的比例时,如下图所示,我们可以看到模型的实际情况。

知识图谱,使用机器学习进行时间序列预测的陷阱

时间序列数据倾向于在时间上相关,并且表现出显着的自相关性。在这种情况下,这意味着在时间“ t +1”处的值很可能与时间“ t ” 处值相近。如上图右侧所示,模型实际上在做的是:当预测时间“ t +1” 的值时,它只是使用时间“ t ” 的值作为其预测(通常称为持续性模型)。绘制预测值和真实值之间的相关性(下图),我们在1天左右的时间滞后处看到一个明显的峰值,表明该模型仅使用先前的值作为未来的预测。

知识图谱,使用机器学习进行时间序列预测的陷阱

精度指标的不当使用会产生误导

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

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

一个平稳的时间序列  是指其统计特性,如均值、方差、自相关等随着时间变化都保持不变。大多数统计预测方法会基于这样的假设:通过数学变换可以使时间序列近似静 止(stationarized)。这类转换中一个 基本转换是对数据进行时差转换,如下图所示。

知识图谱,使用机器学习进行时间序列预测的陷阱

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

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

时间差分数据的预测模型

由于能够预测差分数据而不是直接预测数据,因此可以更好地辨明模型的预测能力,让我们试一下我们的模型。该检验的结果如下图所示,真实值与预测值关系的散点图。

知识图谱,使用机器学习进行时间序列预测的陷阱

该图表明该模型不能基于历史事件预测未来的变化(预期结果),因为数据是使用完全随机游走过程生成的。随机过程的结果是不可能预测的,如果有人声称能做到,那么应该对此怀疑。

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

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

  • 时间序列显示强烈的时间依赖性(自相关),呈线性衰减或以类似的模式衰减。

  • 时间序列是非平稳的,使其静止表示在数据中没有明显可训练的结构。

  • 持续性模型(将前一时间步骤的观察结果用在下一个时间步骤中)提供可靠预测的最佳来源。

最后一点是时间序列预测的关键。使用持续性模型的基线预测可以快速证实您是否可以做得更好。如果不能,那您可能正在处理随机游走(或接近随机游走)。人类的头脑天生就想到处寻找模式,我们必须警惕的是,我们不是在自欺欺人,而是因为在为随机游走过程开发复杂的模型而浪费时间。

作者说明:在发表文章后,我发现了Jason Brownlee一篇同一主题的精彩文章,该文章对随机漫步和时间序列进行了类似处理

用Python编写随机漫步时间序列预测

https://machinelearningmastery.com/gentle-introduction-random-walk-times-series-forecasting-python/

总结

我想通过本文强调的主要观点,是根据预测精度评估模型性能时需要非常小心。如文中所示,完全随机的过程中预测未来结果是不可能的,但人们很容易被愚弄。通过简单地定义一个模型,进行一些预测并计算通用的精度度量,人们似乎可以拥有一个好的模型并决定将其投入生产。然而在现实中,该模型可能没有任何预测能力。

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

作者简介:

Vegard Flovik是Axbit AS的首席数据科学家。机器学习以及高级分析。

原文标题:

How (not) to use Machine Learning for time series forecasting: Avoiding the pitfalls

原文链接:

https://www.kdnuggets.com/2019/05/machine-learning-time-series-forecasting.html

封面图来源:pe xels by Gratisography

声明

来源: kdnuggest ,RAD极客会(ID:RAD_Geek_Club)推荐阅读,不代表RAD极客会立场,转载请注明,如涉及作品版权问题,请联系我们删除或做相关处理!

知识图谱,使用机器学习进行时间序列预测的陷阱