时间序列预测与其他机器学习的不同解读

687 阅读15分钟

时间序列是每个数据科学家/ML工程师在其职业生涯中都会遇到的一种问题,比他们想象的要频繁。所以,这是一个需要理解的重要概念。

你看,时间序列是一种基于天、月、年等时间维度进行采样的数据类型。我们称这种数据为 "动态",因为我们已经根据DateTime属性对其进行了索引。这给了数据一个隐含的顺序。不要误会我的意思,静态数据仍然可以有一个DateTime的属性,但数据不会被抽样或基于该属性的索引。

当我们在时间序列数据上应用机器学习算法,并希望对未来的DateTime值进行预测时,例如,根据前5年的数据预测2月份的总销售额,或者根据几年的天气数据预测某一天的天气。这些对时间序列数据的预测被称为预测。 这与我们在处理静态数据时的情况截然不同。

在这篇博客中,我们将讨论。

  • 1时间序列预测即预测与静态机器学习预测有何不同?
  • 2在进行时间序列预测时的最佳做法

时间序列数据与静态ML

到目前为止,我们已经建立了一个基线,即与静态数据相比,我们应该如何看待时间序列数据。在这一节中,我们要谈一谈对待这两种类型的数据的不同。

注意:为了简单起见,我们假设数据在所有情况下都是连续的。

缺失数据的归纳

缺失数据的代入是任何表格式机器学习项目中的一个关键预处理步骤。在静态数据中,可以采用简单归因技术,即根据属性的性质,用数据的平均值、中位数、模式来填补缺失数据,或者采用更复杂的方法,如采用KNN算法来识别缺失数据的近邻归因法。

然而,在时间序列中,缺失数据看起来是这样的。

Time-series – missing data

时间序列--缺失数据|来源

你有这些可见的数据缺口,这些缺口在逻辑上无法用任何可用于静态数据的归因策略来填补。让我们来讨论一些可能有用的技术。

  • **为什么不用平均值来填充?**静态平均数在这里对我们没有任何好处,因为通过从未来获取线索来填补你的缺失值是没有意义的。在上面的图中,很直观的是,2001-2003年之间的差距在逻辑上可以只用历史数据即2001年以前的数据来填补。

    在时间序列数据中,我们使用一种叫做滚动平均数或移动平均数或窗口平均数的东西,它是在一个预定义的窗口(例如,7天的窗口或1个月的窗口)中取平均值。因此,我们可以利用这个移动平均数来填补我们的时间序列数据中任何缺失的空白。

    :在处理时间序列数据的平均数时,静止性起着重要作用。

  • 内插法相当流行:利用时间序列数据的隐含顺序,内插法往往是设计时间序列数据中缺失部分的首选方法。简而言之,内插法是利用缺失点前后的数值来计算缺失的数据。例如,线性内插法是通过计算两点之间的直线,取其平均值,得到缺失的数据。

    有许多类型的内插法,如线性、Spline、Stineman。它们的实现几乎在所有的主要模块中都有,如python的pandasinterpolate() 函数和R imputeTime-Series包

    虽然,插值也可以用于静态数据。但是,它并没有被广泛使用,因为在静态数据中有更复杂的归纳技术(其中一些在上面有解释)。

  • 了解业务用例。这不是任何处理缺失数据的技术方法。但我觉得这是最被低估的技术,可以快速给出结果。这涉及到理解手头的问题,然后设计出哪种方法最有效。毕竟,在你的用例中,SOTA可能不是SOTA。例如,销售数据应与股票数据区别对待,两者都有一套不同的市场衡量标准。
    顺便说一下,这种技术在静态数据和时间序列数据之间是很常见的。

时间序列模型中的特征工程

使用特征工作是区分时间序列数据和静态数据的另一个主要步骤。特征工程是一个广泛的术语,包含了各种标准技术和临时方法。与静态数据相比,在时间序列数据中对特征的处理是不同的。

注:有人可能会说,归纳法属于特征工程,这并没有错,但我想在一个单独的部分解释一下,让你有一个更好的概念。

在静态数据中,这在很大程度上取决于手头的问题种类,但一些标准技术包括特征转换、缩放、压缩、规范化、编码等。

时间序列数据除了基于时间的特征外,还可以有其他属性。如果这些属性是基于时间的,那么产生的时间序列将是多变量的,如果是静态的,产生的将是单变量的静态特征。非基于时间的特征可以利用静态技术中的方法,而不妨碍数据的完整性。

所有基于时间的组件都有一个确定的模式,可以使用一些标准技术来设计。让我们来看看一些在使用基于时间的特征时被证明是有用的技术。

时间序列组件:时间序列数据的主要特征是什么?

首先,每个时间序列数据都有时间序列成分。我们做一个STL分解(使用Loess的季节和趋势分解)来提取其中一些成分。让我们来看看这些成分分别意味着什么。

Example of an STL decomposition

STL分解的例子|来源

  • 趋势。 时间序列数据显示出一种趋势,即其数值随时间变化而变化,数值增加显示出一种正的趋势,数值减少则显示出一种负的趋势。在上面的图中,你可以看到一个正的增长趋势。
  • 季节性。季节性是指时间序列的一种属性,它显示出以恒定频率重复的周期性模式。在上面的例子中,我们可以观察到频率为12个月的季节性成分,这大致意味着周期性模式每12个月重复一次。
  • 剩余部分。 从数据中提取趋势和季节性后,剩下的就是我们所说的余数(误差)或残差。这实际上有助于在时间序列中进行异常检测。
  • 周期。当有趋势而没有固定的重复或季节性时,时间序列数据被称为周期性。
  • 静态性。当时间序列数据的统计特征不随时间变化,即恒定的平均数和标准差时,它就是静止的。协方差是与时间无关的。

这些成分被提取出来后,通常构成了时间序列数据特征工程的下一个步骤的基础。从静态数据的角度来看,STL分解是时间序列世界中的描述性部分。对于时间序列数据的类型,还有一些特定的时间序列指标,比如在处理股票数据时的虚拟变量

时间序列成分对于分析感兴趣的时间序列变量非常重要,以便了解它的行为,它有哪些模式,并能够选择和适合一个适当的时间序列模型。

时间序列模型的分析和可视化

分析

时间序列数据分析与静态数据分析有着不同的蓝图。正如上一节所讨论的,时间序列分析首先要回答以下问题。

  • 这个数据有一个趋势吗?
  • 这个数据是否包含任何形式的模式或季节性?
  • 数据是静止的还是非静止的?

理想情况下,人们必须在研究了上述问题的答案后,进一步进行分析。与此类似,静态数据分析有一些程序,如描述性预测性描述性。虽然,描述性是所有问题陈述中的标准,但预测性和描述性是主观的。这些程序在时间序列和静态ML中都很常见。然而,Descriptive、Predictive和Prescriptive中使用的许多指标是不同的,其中之一就是Correlation

与此相反,在时间序列数据中,我们使用一种叫做自相关部分自相关的东西。自相关和部分自相关都是衡量当前和过去系列价值之间的关联,并表明哪些过去的系列价值对预测未来价值最有用。

An example ACF and PACF plot in time-series

时间序列中的ACF和PACF图例

虽然这两种数据的分析方法有些不同,但核心思想是一样的,主要取决于问题陈述。例如,股票和天气数据,都是时间序列,但你可以用股票数据来预测未来的价值,用天气数据来研究季节性模式。同样,使用贷款数据,你可以用它来分析借款人的模式或检查一个新的借款人是否会拖欠贷款。

可视化

可视化是任何分析的一个组成部分。不同的问题不是你应该可视化什么,而是你应该如何可视化。

你看,时间序列数据的基于时间的特征应该被可视化,图中的一个轴是时间,而非基于时间的特征则受制于解决问题时采用的策略。

An example visualization of time-series

一个时间序列的可视化例子

时间序列预测与静态ML预测的对比

在上一节中,我们看到了两种数据在初始步骤上的区别,也看到了在比较两者时方法上的区别。在这一节中,我们将探讨下一步,即预测或在时间序列方面,预测

算法

时间序列数据中的算法选择与静态数据中的算法完全不同。一个能够在训练数据领域之外推断模式和封装时间序列成分的算法可以被认为是一个时间序列算法。

现在,大多数静态机器学习算法,如线性回归、SVMs,都不具备这种能力,因为它们为任何新的预测概括了训练空间。他们根本无法表现出我们上面讨论的任何行为。

一些用于时间序列预测的常见算法。

  • **ARIMA:**它代表了自回归综合移动平均。它利用自回归和移动平均数的组合来预测未来的价值。在这里阅读更多关于它的信息。
  • EWMA/指数平滑化。指数加权移动平均线或指数平滑法是移动平均线的升级版。它的工作原理是通过对最近发生的数值赋予更多的权重来减少移动平均线所显示的滞后效应。在这里阅读更多关于它的信息。
  • 动态回归模型。这种算法也考虑到其他杂项信息,如公共假期,法律的变化等。在此阅读更多信息。
  • 预言家Prophet由Facebook的核心数据科学团队发布,是一个由Facebook开发的开源库,旨在对单变量时间序列数据进行自动预测。
  • LSTM: 长短期记忆(LSTM)是一种递归神经网络,可以学习序列中项目之间的顺序依赖。它经常被用来解决时间序列预测问题。

为您推荐

这个列表当然不是详尽的。许多复杂的模型或方法,如广义自回归条件异方差(GARCH)和贝叶斯结构时间序列(BS时间序列)在某些情况下可能非常有用。还有像神经网络自回归 (NNAR)这样的神经网络模型可以应用于时间序列,它使用滞后的预测因子并能处理特征。

时间序列模型的评价指标

预测评估涉及到一些指标,如平均平方误差(MSE)和根平均平方误差(RMSE)等与标度有关的误差,平均绝对百分比误差(MAPE)等百分比误差,平均绝对标度误差(MASE)等标度误差,仅举几例。这些指标实际上类似于静态ML指标。

然而,虽然评估指标有助于确定拟合值与实际值的接近程度,但它们并不评估模型是否正确地适合时间序列。为此,我们做了一个叫做残差诊断的东西。请在这里详细阅读它。

处理离群值/异常值

异常值几乎困扰着每个现实世界的数据。时间序列和静态数据从识别到处理离群值/异常值有两条完全不同的路线。

识别

  • 对于静态数据的识别,我们使用从Z-score、Boxplot分析到一些高级统计技术,如假设检验。
  • 在时间序列中,我们使用一系列的技术和算法,从STL分析到使用隔离森林等算法。你可以在这里阅读更多的细节。

处理

  • 我们根据手头的能力和问题陈述,在静态数据中使用诸如修剪、基于量化的底线和上限、以及平均/中位数替代的方法。
  • 在时间序列数据中,有许多选择,这些选择对你的使用情况有很大的主观性。其中有几个是。
    • 使用替换。R中的tsclean()函数将使用loess拟合一个稳健的趋势(对于非季节性序列),或者使用STL拟合稳健的趋势和季节性成分(对于季节性序列)来计算替换值。
    • 研究业务。这不是一个技术性的方法,而是一个临时性的方法。你看,识别和研究问题背后的业务确实可以帮助处理离群点。丢弃它或替换它是否是一个明智的选择,将来自于首先对它的研究。

处理时间序列数据和预测时的最佳做法

虽然在研究时间序列和预测时没有固定的步骤可循,但仍有一些好的做法可以采用,以获得最佳的结果。

  1. 没有 "一刀切":没有一种预测方法对所有时间序列表现最好。在开始进行预测工作之前,你需要了解问题陈述、特征类型和目标。你可以根据你的需要(计算+目标)从一些领域选择算法。

    • 统计模型。
    • 机器学习。
    • 和混合方法。
  2. 特征选择。特征的选择对产生的预测误差有影响。换句话说,选择必须谨慎进行。有不同的方法,如相关分析也被称为filter,包装器(即反复添加或删除特征),以及嵌入式(即选择已经是预测方法的一部分)。

  3. 对抗过拟合。在模型的训练过程中,可能会出现过度拟合的风险,因为最佳模型并不总是能带来最佳的预测。为了应对过度拟合的问题,可以将历史数据分成训练和测试数据,并进行内部验证。

  4. 数据预处理:应首先对数据进行分析和预处理,使其干净地用于预测。数据可能包含缺失值,由于大多数预测方法不能处理缺失值,所以必须对数值进行估算。

  5. 牢记 "维度诅咒"。当模型在训练中遇到很多维度和很多潜在因素时,他们会遇到 "维度诅咒",即当我们拥有有限的训练数据,并向这些数据添加更多的维度时,我们在准确性方面的回报就会越来越少。

  6. 与季节性数据模式合作。如果时间序列数据中存在季节性,则需要包括季节性模式的多个周期来进行适当的预测。否则,模型就没有办法学习这种模式。

  7. 在进行预测之前处理异常情况。异常情况会在模型学习中产生巨大的偏差,更多时候,结果总是不尽如人意。

  8. 仔细研究问题陈述。这可能是最被低估的做法,特别是当你刚开始研究时间序列问题时。确定你的基于时间和非基于时间的特征,在转向任何标准技术之前先研究数据。

你已经到达终点了!

我们成功地理解了时间序列和静态数据在结构和方法上的区别。本博客中列出的部分绝不是详尽的。当我们进入到与每一个具体的数据问题有关的更多颗粒时,可能会有更多的差异。这里有一些我最喜欢的资源,你可以在学习时间序列的时候参考一下。