Python 中用于时间序列预测的 SARIMA 简明介绍

自回归积分移动平均模型,或称ARIMA,是单变量时间序列数据预测中最常用的预测方法之一。

尽管该方法可以处理具有趋势的数据,但它不支持具有季节性成分的时间序列。

ARIMA的一种扩展,支持对序列的季节性成分进行直接建模,称为SARIMA。

在本教程中,您将发现季节性自回归积分移动平均模型,或称SARIMA,一种用于预测包含趋势和季节性的单变量时间序列数据的预测方法。

完成本教程后,您将了解:

  • ARIMA在处理季节性数据方面的局限性。
  • ARIMA的SARIMA扩展,它明确地为单变量数据中的季节性元素建模。
  • 如何在Python中使用Statsmodels库实现SARIMA方法。

开始您的项目,阅读我的新书《Python时间序列预测入门》,其中包括分步教程和所有示例的Python源代码文件。

让我们开始吧。

更新: 有关使用和网格搜索SARIMA超参数的帮助,请参阅此帖

A Gentle Introduction to SARIMA for Time Series Forecasting in Python

Python 中用于时间序列预测的 SARIMA 简明介绍
照片由Mario Micklisch拍摄,保留部分权利。

教程概述

本教程分为四个部分;它们是

  1. ARIMA有什么问题?
  2. 什么是SARIMA?
  3. 如何配置SARIMA
  4. 如何在Python中使用SARIMA

ARIMA有什么问题?

自回归积分移动平均模型,或称ARIMA,是一种用于单变量时间序列数据的预测方法。

正如其名称所示,它同时支持自回归和移动平均元素。积分元素指的是差分,这使得该方法能够支持具有趋势的时间序列数据。

ARIMA在处理季节性数据时的一个问题是它不支持季节性数据。也就是说,时间序列具有重复的周期。

ARIMA期望数据要么是非季节性的,要么是已经去除了季节性成分的,例如通过季节性差分等方法进行季节性调整。

有关ARIMA的更多信息,请参阅此帖

另一种选择是使用SARIMA。

什么是SARIMA?

季节性自回归积分移动平均模型,SARIMA或季节性ARIMA,是ARIMA的扩展,它明确支持具有季节性成分的单变量时间序列数据。

它增加了三个新的超参数来指定序列季节性成分的自回归(AR)、差分(I)和移动平均(MA),以及一个用于季节性周期的附加参数。

季节性ARIMA模型是通过在ARIMA中包含额外的季节性项来形成的 […] 模型的季节性部分由与非季节性组件非常相似的项组成,但它们涉及季节性周期的反向移动。

— 第242页,《预测:原理与实践》,2013年。

如何配置SARIMA

配置SARIMA需要为序列的趋势和季节性元素选择超参数。

趋势元素

有三个趋势元素需要配置。

它们与ARIMA模型相同;具体来说

  • p:趋势自回归阶数。
  • d:趋势差分阶数。
  • q:趋势移动平均阶数。

季节性元素

有四个季节性元素是ARIMA所不包含的,必须进行配置;它们是

  • P:季节性自回归阶数。
  • D:季节性差分阶数。
  • Q:季节性移动平均阶数。
  • m:单个季节性周期的时间步长数。

总之,SARIMA模型的表示法指定为

其中指定了特定选择的模型超参数;例如

重要的是,m参数会影响PDQ参数。例如,月度数据m为12表示年度季节性周期。

P=1 将在模型中使用第一个季节性偏移观测值,例如 t-(m*1) 或 t-12。P=2 将使用最后两个季节性偏移观测值 t-(m * 1)、t-(m * 2)。

类似地,D=1 将计算一阶季节性差分,而Q=1 将在模型中使用一阶误差(例如,移动平均)。

季节性ARIMA模型使用与季节数(s)相同的滞后差分来消除加性季节效应。就像使用滞后1差分来消除趋势一样,滞后s差分会引入移动平均项。季节性ARIMA模型包含滞后s的自回归和移动平均项。

— 第142页,《R语言入门时间序列》,2009年。

趋势元素可以通过仔细分析ACF和PACF图来选择,观察近期时间步长(例如1、2、3)的相关性。

类似地,可以通过分析ACF和PACF图来指定季节性模型的值,观察季节性滞后时间步长的相关性。

有关解释ACF/PACF图的更多信息,请参阅此帖

季节性ARIMA模型可能具有大量的参数和项的组合。因此,在拟合数据时尝试广泛的模型范围,并使用适当的标准选择最佳拟合模型是恰当的……

— 第143-144页,《R语言入门时间序列》,2009年。

或者,可以使用网格搜索来遍历趋势和季节性超参数。

有关SARIMA参数网格搜索的更多信息,请参阅此帖

如何在Python中使用SARIMA

SARIMA时间序列预测方法在Python中通过Statsmodels库提供支持。

要使用SARIMA,有三个步骤,它们是

  1. 定义模型。
  2. 拟合模型。
  3. 使用拟合模型进行预测。

让我们一步一步来看。

1. 定义模型

通过提供训练数据和大量模型配置参数,可以创建SARIMAX类的一个实例。

该实现被称为SARIMAX而不是SARIMA,因为方法名称中添加的“X”意味着该实现还支持外生变量。

这些是并行的时间序列变量,它们不直接通过AR、I或MA过程建模,但可以作为加权输入提供给模型。

外生变量是可选的,可以通过“exog”参数指定。

趋势和季节性超参数分别作为3个和4个元素的元组传递给“order”和“seasonal_order”参数。

必须指定这些元素。

这些是主要的配置元素。

还有其他一些微调参数您可能需要配置。在完整的API中了解更多

2. 拟合模型

创建模型后,就可以在训练数据上进行拟合。

通过调用fit()函数来拟合模型。

拟合模型会返回一个SARIMAXResults类的实例。此对象包含拟合的详细信息,例如数据和系数,以及可用于利用模型的函数。

拟合过程的许多元素都可以配置,一旦您熟悉了实现,就值得阅读API来查看这些选项。

3. 进行预测

拟合后,就可以使用该模型进行预测。

可以通过在调用fit返回的SARIMAXResults对象上调用forecast()predict()函数来进行预测。

forecast()函数接受一个参数,该参数指定要预测的样本外时间步长数,如果未提供参数,则假定为单步预测。

predict()函数需要指定开始和结束日期或索引。

此外,如果在定义模型时提供了外生变量,则在预测期间也必须将它们提供给predict()函数。

进一步阅读

如果您想深入了解,本节提供了更多关于该主题的资源。

文章

书籍

API

文章

总结

在本教程中,您发现了季节性自回归积分移动平均模型,或称SARIMA,一种用于预测包含趋势和季节性的单变量时间序列数据的预测方法。

具体来说,你学到了:

  • ARIMA在处理季节性数据方面的局限性。
  • ARIMA的SARIMA扩展,它明确地为单变量数据中的季节性元素建模。
  • 如何在Python中使用Statsmodels库实现SARIMA方法。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

想用Python开发时间序列预测吗?

Introduction to Time Series Forecasting With Python

几分钟内开发您自己的预测

...只需几行python代码

在我的新电子书中探索如何实现
Python 时间序列预测入门

它涵盖了**自学教程**和**端到端项目**,主题包括:*数据加载、可视化、建模、算法调优*等等。

最终将时间序列预测带入
您自己的项目

跳过学术理论。只看结果。

查看内容

137条对《Python SARIMA时间序列预测入门指南》的回复

  1. SARAVANAN S 2018年8月17日晚上9:22 #

    如何在SARIMA中配置多个季节性?

    • Jason Brownlee 2018年8月18日早上5:35 #

      好问题,您可能需要开发一个自定义模型。

      • SARAVANAN S 2018年8月30日晚上10:51 #

        是否有可用的自定义模型?
        我们可以为ARIMA设置多变量时间序列分析,SARIMA也可以吗?

        • Jason Brownlee 2018年8月31日早上8:14 #

          是的,您可以在statsmodels中使用VAR。不确定是否有VSARIMA,您可能需要自己编码一个。

          • SARAVANAN S 2018年9月7日晚上8:04 #

            谢谢:)

  2. Khalid Nawaz 2018年8月18日下午2:17 #

    SARIMA模型和X-12 ARIMA模型有什么区别?

    • Jason Brownlee 2018年8月19日早上6:15 #

      什么是X-12 ARIMA?

      • Costas 2019年7月15日晚上6:27 #

        X-12 ARIMA曾是美国人口普查局用于季节性调整的软件。它已被X-13 ARIMA SEATS取代。它是计量经济学软件包(如Eviews或GRETL)的一部分,可以将时间序列分解为趋势、周期、季节性成分(包括日历效应)和噪声。

  3. Anthony The Koala 2018年8月31日早上4:20 #

    尊敬的Jason博士,
    (1) 如何确定SARIMA的p d q m值?
    (2) 我记得您在文章中简要提过ARIMA的p d q值确定方法。您在之前的文章中提到过哪些确定ARIMA的p, d, q的方法的网站?
    谢谢你
    悉尼的Anthony

    • Jason Brownlee 2018年8月31日早上8:15 #

      您可以使用ACF和PACF分析,就像我们为ARIMA所做的那样。

      • Anthony The Koala 2018年8月31日早上8:33 #

        尊敬的Jason博士,
        我明白了ARIMA的ACF和PACF。一旦您在ARIMA分析中确定了显著的滞后,我看到了您关于使用PACF和ACF的帖子。

        请澄清一下,因为我不确定SARIMA的季节性或S部分的后续分析步骤。您是然后对滞后和差分数据进行ACF和PACF分析来计算季节性吗?

        谢谢你,
        悉尼的Anthony

  4. Naval 2018年9月12日晚上8:37 #

    杰森博士,

    我正在寻求您关于TS分析和日(工作日)数据(3年数据)预测的建议,我使用SARIMAX来拟合这些数据。您能分享一些基本思路吗?因为大多数参考资料都是针对月度数据,无法提供太多知识。

    谢谢你,
    Naval

    • Jason Brownlee 2018年9月13日早上8:01 #

      您可以使用SARIMAX,也可以使用ETS。具体问题是什么?

  5. yameen shahzada 2018年12月15日下午1:52 #

    如何将ARIMA转移到SARIMA建模?
    有人能用Eviews或Minitab等软件,并附带数据来解释这个问题吗?

    • Jason Brownlee 2018年12月16日早上5:19 #

      如果将季节性设置为0,SARIMA就可以使用ARIMA。

      什么是Eviews和Minitab?

  6. sandeep 2019年1月31日下午3:44 #

    我认为我们可以将一个SARIMA的输出输入到另一个SARIMA中,并将第二个SARIMA的p,d,q设置为零。

  7. Arjun Nelwade 2019年2月12日下午4:18 #

    我们如何将之前更改过的数据集转换为季节性数据集以用于SARIMA模型?

    • Jason Brownlee 2019年2月13日早上7:52 #

      无需这样做,模型将根据您通过模型超参数指定的季节性调整进行计算。

  8. xxsummer 2019年3月11日晚上6:52 #

    杰森博士,
    我有六年的每日数据,想预测下一年。为此,我设置了以下参数
    m=365,我的问题是我的模型运行时间非常长。将m=365设置为每日数据是否正确?是否有解决此问题的方法?
    非常感谢。

  9. aravind 2019年3月28日晚上6:00 #

    先生,我有一个疑问,在时间序列中我们使用SARIMA模型(或)方法。我们是否在SARIMA模型中使用任何算法?SARIMA是否使用任何算法?
    例如:时间序列与循环神经网络中的LMST算法?
    提前感谢…

    • Jason Brownlee 2019年3月29日早上8:26 #

      是的,SARIMA是一种线性算法,就像线性回归一样,它使用不同的输入(数据和残差)并执行变换(差分)。

  10. Jeff 2019年4月9日早上9:32 #

    我很难理解在使用ARIMA或SARIMA之前是否需要转换非平稳时间序列。我阅读了多篇参考资料,建议在SARIMA建模之前对具有指数趋势和季节性的序列进行对数变换。我也读到SARIMA和ARIMA会考虑趋势和季节性,因此转换不是必需的。

    您能否提供您的理解/意见?

    谢谢
    杰夫

    • Jason Brownlee 2019年4月9日下午2:39 #

      也许可以。

      SARIMA可以处理趋势和季节性的差分。

      如果您的数据在去除趋势和季节性后仍存在变化的方差,您可以通过Box-Cox变换或类似的幂变换来解决。

      您可以手动去除趋势/季节性,然后运行统计检验来查看它是否平稳。
      https://machinelearning.org.cn/time-series-data-stationary-python/

      • Jeff 2019年4月10日晚上11:00 #

        谢谢!这就是我想要的。我计划分解序列,然后测试残差。您同意这个方法吗?

  11. Sara Song 2019年4月23日早上6:55 #

    布朗利博士,您好,

    我有一个关于季节性元素的问题。我为时间序列预测项目使用了SARIMA模型超参数网格搜索。最佳SARIMA模型的季节性元素为(7,1,9,0)。当m(单个季节性周期的步长数)=0时,但季节性P、D、Q不为0,这是什么意思?我们是否需要捕捉这种季节性?

    谢谢,
    Sara

    • Jason Brownlee 2019年4月23日早上8:00 #

      这是一个好问题!

      我发现我自己也遇到过这种情况,而且结果如果将这些值归零(凭记忆)会有所不同。

      我不太清楚。这可能需要深入研究代码或在问答网站上提问。

  12. Jay 2019年5月14日下午3:46 #

    Jason您好,这是一篇很棒的教程,感谢您的分享。我正在使用SARIMA,并注意到网格搜索没有为趋势和季节性元素组合(0,1,0)x(0,0,0)或(0,1,0)x(0,1,0)产生结果。您能解释一下吗?

    • Jason Brownlee 2019年5月15日早上8:10 #

      也许底层的数学库在您的数据集上未能收敛于该配置?

      您可以通过显示网格搜索期间的警告来查看。

      • Jay 2019年5月15日早上9:18 #

        感谢您的回复。是否需要手动运行它们来获得结果?

  13. Emily 2019年5月29日早上4:40 #

    Jason,

    感谢分享这些信息。我需要为各种产品设置一个自更新模型来预测库存,其中许多产品都显示出季节性。我看到过在这种情况下,为了实现自动化和泛化,其他人应用ARIMA并通过差分去除季节性。这会降低模型的准确性吗?如果我转而基于SARIMA来处理季节性,这会破坏其对产品实现自动化和泛化的能力吗?

    • Jason Brownlee 2019年5月29日早上8:56 #

      SARIMA可以对趋势和季节性进行建模,无需提前去除。

  14. Ardeshir 2019年5月31日早上3:24 #

    感谢您的本教程。

    我正在尝试对一个我拥有的数据的大气参数进行建模。一个小时的时间序列数据。我一直在测试您网站上的一些示例代码和其他代码来测试我的数据。使用model = SARIMAX(aod, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0)),这是一个在某些示例中提供的默认代码,比ARIMA等其他模型提供了近乎完美的拟合。ARIMA模型给出了异常低的值。我的数据是平稳的。
    我的问题是,在我的数据使用上面的示例代码(其中所有SARIMAX参数都为1,季节性参数为0)获得了良好的拟合,这是我犯了错误还是我忽略了什么?我的数据是每日每小时数据,所以我还尝试了model = SARIMAX(aod, order=(1, 1, 1), seasonal_order=(0, 0, 0, 24)),这也给出了一个不错的结果。

    • Jason Brownlee 2019年5月31日早上7:53 #

      干得好!

      我期望零阶季节性成分与ARIMA相同,但statsmodel的实现可能有所不同?

      • Ardeshir 2019年6月1日下午2:07 #

        实际上我意识到了我的错误。ACF和PACF图可能显示了24的季节性趋势和4的p和q值。我之前的模型之所以有效,是因为我是在训练数据本身上进行预测。我实际上没有将数据集分成两组用于训练和测试。这就是为什么当我执行分割并进行验证时,预测序列是一条直线。我对此感到沮丧。但后来我通过分析ACF图更改了SARIMA的参数,现在数据似乎通过RMSE为0.003进行了验证。
        如果您不介意,我有一个关于这个模型的问题。我想预测的变量也可能取决于一到两个其他变量,至少我想展示这一点。我有没有办法实现多变量SARIMA模型?

        • Jason Brownlee 2019年6月2日早上6:38 #

          干得好!

          是的,您可以通过外生变量包含其他变量,例如SARIMAX。我认为这里有一个例子
          https://machinelearning.org.cn/time-series-forecasting-methods-in-python-cheat-sheet/

          • Ardeshir 2019年6月3日晚上7:50 #

            非常感谢。您的SARIMA文章拯救了我。即使您写的是单步预测,我还是将predict函数扩展到了多个时间步长,如果您不介意的话?
            我试图将每个变量作为外生变量(exog)独立包含,然后将它们组合起来,并再次包含它们。由于我这是为了一个项目,您对收尾工作有什么建议吗?我的意思是,为了写一篇合理的项目论文并进行展示,我需要展示哪些参数或测试?如果问题太多,我很抱歉。

          • Shipta 2019年12月4日下午4:09 #

            在 Sarimax 模型中使用 exog 变量时,exog 变量可以是员工 ID 这样的东西吗?
            在模型准备步骤中使用的 exog 数据,即在调用 sarimax() 或 auto_arima() 函数时,与调用 predict() 对拟合模型相同吗?

          • Jason Brownlee 2019年12月5日上午6:38 #

            我认为 ID 不具有预测性,可能不应该包含在模型中。

          • Shipta 2019年12月5日下午8:14 #

            假设我想预测一家商店在产品层面的销量。那么,我能否将产品 ID 作为外生变量,将每月销量作为内生变量?我拥有这家商店的产品月销量数据集。现在我想预测未来的销量。在这种情况下,产品 ID 能否被用作模型中的外生变量?
            我不太确定我们依据什么标准来决定一个列是否可以被视为外生变量。

            另外,在考虑季节性趋势时,您能否分享一些让 auto_arima() 模型和 sarimax 模型运行更快的技巧?我正在运行的模型花费了大量时间,并且大部分时候由于资源耗尽而被终止。

            为了考虑季节性,我必须为 m 赋值,所以我有多行数据对应于一个单独的日期。数据在一​​年后重复出现,那么 m 的值应该是 12 还是观察次数(即产品 ID 的数量)* 12?

            不胜感激

          • Jason Brownlee 2019年12月6日上午5:14 #

            ID 不具有预测性,不应用于模型的输入。

            是的,我在这里写了一个自定义的自动调优方法。
            https://machinelearning.org.cn/how-to-grid-search-sarima-model-hyperparameters-for-time-series-forecasting-in-python/

          • Vivek Yadav 2020年2月22日下午9:34 #

            SARIMAX 可以每周和每月应用吗?也可以用于节日季吗?

          • Jason Brownlee 2020年2月23日上午7:27 #

            或许可以试试看?

  15. Arb 2019年6月17日下午5:41 #

    非常感谢这篇精彩的文章。基于这篇文章和您的其他网格搜索文章,我为我的模型打下了基础。但我有一个疑问。我的预测滞后了一步。这正常吗?为了使用预测,我是否应该将其向后移动一步?

  16. S.Saravanakumar 2019年6月27日下午3:04 #

    在 SARIMAX 中,我们如何进行双重季节性顺序?例如,我需要根据星期几来预测每小时的销量。

    • Jason Brownlee 2019年6月28日上午5:56 #

      不确定是否支持两个季节性顺序。

      也许在建模之前,对其中一个进行季节性差分?

  17. Tal 2019年7月19日上午12:30 #

    你好,
    感谢您的文章!
    我有一个问题,在很多地方我看到,在运行模型之前有一个预处理阶段,作者对输入进行了对数处理以稳定方差,并进行了对数差分以去除趋势。
    您的看法将受到赞赏!

  18. Lina 2019年8月3日上午3:28 #

    您好,我处理的是每分钟的数据。我的季节是每天。所以如果我理解 SARIMA 的话,我的季节变量 (m) 应该是 60*24,对吗?但是,模型不支持这么大的数字。我该怎么办?

    • Jason Brownlee 2019年8月3日上午8:14 #

      也许可以尝试以不同的分辨率进行建模,例如,重采样到分钟、15分钟、30分钟、每小时等,然后进行比较?

      也许尝试其他模型?

      也许可以尝试使用一部分特征和工程特征进行建模?

  19. kiya 2019年11月7日下午1:03 #

    您好,感谢分享信息!
    我处理的是每日数据。m 参数的最佳值是多少?是否有设置它的经验法则?例如 7 表示每周周期?

  20. Viswanathan C 2020年1月26日下午11:20 #

    嗨,Jason,
    非常实用的文章。感谢分享。
    我需要一个澄清……

    我想在包含 10 年月度数据的时间序列数据中应用 SARIMA (1,1,0)(0,1,1)12。
    这个模型可以翻译成以下内容吗?

    “这个月的销量预测(一月)将基于
    差异(十二月和十一月)的上一个值(因为 p=1,d=1)和
    上两个一月差值残差的移动平均(因为 D=1,Q=1,m=12)。”

    我理解 SARIMA 是 ARIMA 和季节性分量 ARIMA 的总和。

  21. Alberto 2020年2月12日上午4:01 #

    您好 Jason。非常感谢您的文章,它们非常有帮助,帮助我成长。

    我有一个关于您文章中这个段落的问题

    “顾名思义,它支持自回归和移动平均元素。集成元素指的是差分,允许该方法支持具有趋势的时间序列数据。

    ARIMA 的一个问题是它不支持季节性数据。也就是说,具有重复周期的时序数据。”

    我认为,如果您为自回归部分和移动平均部分设置了好的参数,这些参数应该会根据数据进行调整,对吗?那么,您能否从数学上解释一下为什么 ARIMA 不适合季节性数据?

    提前感谢您的回答

  22. antonio 2020年3月3日下午10:30 #

    我有分钟级数据。

    2020-01-09 12:00:00 90.82098
    2020-01-09 12:15:00 90.61686
    2020-01-09 12:30:00 86.22828

    我想应用 SARIMAX…… 哪个是 seasonal_order 参数?
    我尝试了 96(因为我一个小时有 4 个数据……所以 4*24 是 96)这是正确的吗?

    • Jason Brownlee 2020年3月4日上午5:56 #

      也许可以尝试一系列配置,看看哪种配置产生的预测误差最低。

  23. Linna 2020年4月26日下午9:00 #

    ARIMA、ARIMAX、SARIMA 和 SARIMAX 模型之间有什么区别?

  24. Gopi 2020年6月3日下午8:34 #

    嗨,Jason,

    感谢您出色的文章。

    我有一个与天气相关的时序数据集,其中包含 4000 多个记录,并且是基于小时的采样。其中一些样本值超出范围,即如果范围是 1-10,则值为 15。有些样本值在先前和当前样本值之间存在很大差异。这可能是传感器问题或其他问题。我想根据该样本的先前和后续值来检测它。您能否为我提供解决方案,以及在检测到样本后如何在此位置填补适当的值?

    • Jason Brownlee 2020年6月4日上午6:19 #

      您可以设计一个统计检验,并用它来实时检测异常值,例如,与均值相差 3-4 个标准差。需要进行实验。

  25. aflal 2020年6月5日上午6:19 #

    感谢精彩的文章!
    如何将日历效应实现到 SARIMA 中?

    如果您能提供一些链接,我将不胜感激。

    • Jason Brownlee 2020年6月5日上午8:25 #

      不客气。

      好问题,我希望将来能写这方面的内容。

  26. Ghulam Mohyuddin 2020年7月3日下午2:57 #

    我们可以考虑使用外生变量的交叉相关性吗?
    例如,在预测提前一天和实时价格时,这些价格之间的相关性是否可以在此模型中考虑?

    • Jason Brownlee 2020年7月4日上午5:48 #

      好问题,我认为不行。SARIMA 模型主要设计为单变量模型。

  27. Akash Maurya 2020年7月30日下午5:32 #

    我尝试了每日顺序数据并使用了 m = 365,但没有获得绘制结果所需的所有相关参数

    results.plot_diagnostics(figsize=(16, 8))
    plt.show()

    这是因为数据点不能被 365 整除吗?

    • Jason Brownlee 2020年7月31日上午6:15 #

      我不知道,抱歉。也许可以尝试一下。

    • Malavika 2020年9月12日上午2:39 #

      您是否弄清楚了为什么对于每日顺序数据 m=365 的值不起作用?

  28. Salman Ahmad 2020年8月20日上午6:23 #

    对于具有每日和每周季节性的快速移动(每天 2880 点)数据集,应用 SARIMA 模型是否合理?如果合理,那么我们是否需要为季节性设置 2880 个周期,或者我们需要将其重采样到分钟级或小时级?

    • Jason Brownlee 2020年8月20日上午6:54 #

      也许可以为您的数据集开发一个原型,看看效果如何?

      • Salman Ahmad 2020年8月20日上午8:14 #

        抱歉,我没明白。您说的原型是什么意思?

        • Jason Brownlee 2020年8月20日下午1:29 #

          抱歉,我的意思是开发一些关于您数据的小示例来探索这些想法。

  29. Athah 2020年10月18日上午12:53 #

    陈述——ARIMA 模型用于数据显示无趋势时。

    这个陈述是真是假。

    如果可能,请分享原因。

    • Jason Brownlee 2020年10月18日上午6:10 #

      假,因为 ARIMA 可以通过差分处理趋势。

  30. Pals 2020年11月26日下午9:09 #

    先生,您好,
    我们在 SARIMA 上应用它时需要使数据平稳吗?我的数据没有上升或下降的趋势,但从季节性分解图上看我看到了季节性成分?我有 5 个月的数据。我如何决定季节性值 m?

    • Jason Brownlee 2020年11月27日上午6:39 #

      是的,但 SARIMA 可以通过对模型中的趋势和季节性进行差分来为您完成。

  31. Jonny 2021年2月10日上午4:16 #

    在哪里可以找到更多关于我的网格搜索产生的模型的有效性的信息?我得到了这些结果,但我对 SARIMA 是新手。我怎么知道这个模型是否好,以及这些象形文字是什么意思?

    RMSE:171310.522
    SARIMAX 结果
    =========================================================================================
    因变量:实际收入 观测值数量:13
    模型:SARIMAX(2, 0, 0)x(1, 0, 0, 3) 对数似然值 -95.470
    日期:2021 年 2 月 9 日星期二 AIC 200.940
    时间:11:10:54 BIC 201.338
    样本:2017-12-31 HQIC 198.261
    – 2020-12-31
    协方差类型:opg
    ==============================================================================
    coef std err z P>|z| [0.025 0.975]
    ——————————————————————————
    intercept 2.718e+05 2.73e+05 0.994 0.320 -2.64e+05 8.08e+05
    ar.L1 -0.2000 0.528 -0.379 0.705 -1.235 0.835
    ar.L2 -0.0870 0.427 -0.204 0.838 -0.923 0.749
    ar.S.L3 -0.0680 0.695 -0.098 0.922 -1.429 1.293
    sigma2 1.622e+09 11.785 1.38e+08 0.000 1.62e+09 1.62e+09
    ===================================================================================
    Ljung-Box (Q):7.39 Jarque-Bera (JB):0.88
    Prob(Q):0.39 Prob(JB):0.64
    异方差 (H):1.21 Skew:0.47
    Prob(H) (双边):0.88 Kurtosis:1.68
    ===================================================================================

    警告
    [1] 使用梯度外积(复步)计算协方差矩阵。
    [2] 协方差矩阵是奇异的或接近奇异的,条件数为 2.63e+24。标准误可能不稳定。

    • Jason Brownlee 2021年2月10日上午8:11 #

      您可以使用滚动预测验证在数据集上对其进行评估,并将其结果与朴素模型或其他配置进行比较,以查看其是否具有预测能力。

  32. samia ahmad 2021年3月2日上午4:32 #

    请告知 SARIMA 模型的优点和缺点。

    • Jason Brownlee 2021年3月2日上午5:47 #

      它可以处理趋势和季节性,并且是一个简单的线性模型。

      只处理一个变量。

  33. Aakash 2021年4月8日下午4:48 #

    我的数据是每小时数据,季节性为一年。所以 m = 365 的值对于计算来说太大了。有什么最佳解决方案?

    • Aakash 2021年4月9日上午5:15 #

      以及“m”的单位是什么(例如天、小时或分钟)?您能否多解释一下?

    • Jason Brownlee 2021年4月9日上午5:18 #

      也许可以评估一系列配置、数据预处理和模型类型,找出最适合您数据集的方法。

  34. Kaoutar 2021年5月7日上午10:23 #

    请问,如果我们只有季节性而没有趋势,该怎么办?在我的案例中,数据具有每周季节性(1个周期=7天),当使用 df.diff(7) 进行去季节化处理时,得到的数据是平稳的,那么我应该使用什么模型?我想知道以下行的参数是什么
    SARIMA(p,d,q)(P,D,Q,7)

  35. Chris Wai 2021年5月28日下午4:46 #

    您好,SARIMA 是否包含残差?如果包含,如何确定其用于非线性模型的残差?

    • Jason Brownlee 2021年5月29日上午6:46 #

      我认为它在模型的 MA 部分使用了它们。

  36. Chris Wai 2021年5月29日下午6:29 #

    我明白了。我想我明白了,我会尝试一下。非常感谢 Jason 博士。

  37. Rupesh S 2021年6月9日下午9:37 #

    你好 jason,

    我有 5 年的日数据,并尝试使用季节性周期 m=365 构建 SARIMA 模型,但执行时间很长。有什么解决方案吗?

    我已将数据重采样为每周数据,并使用了相同的方法,季节性周期为 m=52,执行速度快了很多。

    我们如何知道我的数据是否具有每日、每周、每月或每年的季节性?

    • Jason Brownlee 2021年6月10日上午5:25 #

      也许使用较少的数据?
      或许在更快的机器上运行?
      也许可以尝试使用不同的模型?

  38. Sofiane 2021年6月23日上午11:54 #

    感谢您的文章。Python 的 pmdarima.auto_arima(自动查找最佳阶数)能否返回 sarimax 或 arimax 模型,因为该函数包含季节性参数 P、D、Q 和 m,以及外生变量的 X 参数?

  39. Vicky Vouk 2021年7月23日上午3:10 #

    您好 Jason,精彩的教程。我需要使外生变量平稳,就像内生变量一样吗?谢谢。

    • Jason Brownlee 2021年7月23日上午6:01 #

      这可能是一个好主意。尝试有和没有它进行比较。

  40. Vasiliki Voukelatou 2021年7月24日上午8:59 #

    太棒了。谢谢 :)

  41. Tomislav Primorac 2021年7月30日上午1:43 #

    您好!我多次阅读过您的帖子,非常感谢您分享您的知识。

    我有一个找不到答案的问题。如何进行静态样本外预测?
    因此,当然,数据被分为测试集和训练集。模型拟合到测试数据。现在,进行动态预测很容易。但是,如果我想进行静态预测,即每次预测一个点,并且每次新预测都考虑到前一个点,那么在未用于训练的数据上我就无法做到这一点,它只会像动态预测一样。

    如何指定测试数据是需要更新预测的数据?这与 exog 有关吗?还是只能通过某种 for 循环来完成?

    希望我的问题很清楚。

    • Jason Brownlee 2021年7月30日上午6:30 #

      拟合所有数据并调用 model.forecast()。参见此内容。
      https://machinelearning.org.cn/make-sample-forecasts-arima-python/

      • Tomislav Primorac 2021年7月31日上午2:08 #

        再次您好!首先,我感谢您甚至回复这些问题。

        但是,我对您的回答有些困惑,特别是“拟合所有数据”这部分。这不会完全破坏测试数据的意义吗,因为它不是模型应该拟合的数据部分?

        我的目标是在不重新训练模型的情况下进行预测。我将查看您的其他帖子,希望您不介意我问更多问题。

  42. Tomislav Primorac 2021年7月30日上午1:44 #

    *模型拟合到训练数据(笔误)。

    • Tomislav Primorac 2021年8月2日下午11:24 #

      是的,这是有道理的。我将查看链接的帖子。您的帖子非常有帮助。谢谢!

      关于重拟(refitting),有一件事让我感到困惑。建立最终模型的过程就是寻找合适系数的过程。一旦我们找到了系数,如果我们一直重拟,我们就会一直得到新的系数。那么,如果最终模型会在每一步都被改变,寻找最终模型的意义是什么呢?

      无论如何,我将考虑不同的重拟周期,而不是在每个新时间点都重拟,而是每隔n个点重拟一次。

      • Jason Brownlee 2021年8月3日 上午4:52 #

        也许它需要改变,也许不需要,这取决于你的数据和模型。

        进行测试并找出最适合你特定情况的方法。

  43. Sofiane HAMAM 2021年8月11日 上午12:33 #

    感谢您的文章,ARIMA 带有季节性参数(statsmodels.tsa.arima.model.ARIMA¶)与 SARIMA(statsmodels.tsa.statespace.sarimax.SARIMA)有什么区别?

    • Adrian Tam
      Adrian Tam 2021年8月11日 上午6:50 #

      如果你查看源代码,你会发现它们实际上是相同的。

  44. Mafalda 2021年11月14日 上午5:36 #

    感谢您写了如此清晰的文章。
    我是数据科学新手,我在处理一个 SARIMA 问题,数据是连续 41 个月的。我已经进行了对数变换、差分、使序列平稳,应用了季节性差分(6 个月)并将其分为训练/测试集(80%/20%),并使用了带有季节性因子的 auto_arima。
    然而,我没有得到样本内预测。当我绘制它时,预测部分是空白的。您认为我可能在哪个环节出错了?这是我用来创建预测的代码。
    fc= model_fit.get_forecast(steps=8, return_conf_int=True) # 95% 置信区间 #8 是测试集的长度
    conf = fc.conf_int()

    为了绘图,我将其转换为数据框。
    fc_series = pd.Series(fc.predicted_mean, index=test.index)
    lower_series = pd.Series(conf.loc[:, ‘lower MonthlyTotals’], index=test.index)
    upper_series = pd.Series(conf.loc[:, ‘upper MonthlyTotals’], index=test.index)

    • Adrian Tam
      Adrian Tam 2021年11月14日 下午3:02 #

      在我看来,代码是正确的。如果它是空白的,那可能是其他地方导致的问题。

  45. K.Bhanu prakash 2021年12月3日 下午11:51 #

    如果一个人是 Python 的初学者,是否有可能完成一个时间序列预测项目?

    • Adrian Tam
      Adrian Tam 2021年12月8日 上午7:00 #

      为什么不呢?statsmodels 包很容易使用。

    • James Carmichael 2021年12月22日 上午9:26 #

      你好 K.Bhanu… 请提供更多关于你感兴趣的项目类型的细节。

      此致,

  46. Hendy 2022年5月19日 上午2:33 #

    感谢您的文章
    我使用了每日数据进行 ARIMA,我需要为 SARIMA 使用相同的数据,那么 S 会等于 365 吗?

  47. Gloksinya 2022年8月27日 下午6:50 #

    在绘制 ACF 和 PACF 以确定 P 和 Q 之前,我们需要进行季节性差分吗?

  48. Timon 2022年9月29日 上午12:58 #

    你好 Jason。在你最后一行代码中,是不是应该是
    yhat = model_fit.predict(start=0, end=len(data))
    而不是
    yhat = model_fit.predict(start=len(data), end=len(data))

    如果不是,为什么将 start 和 end 设置为相同的值?

    • James Carmichael 2022年9月29日 上午6:29 #

      感谢你的提问和反馈!

  49. Timon 2022年9月29日 上午2:07 #

    实际上,我在你的 ARIMA 教程中找到了答案。


    如果我们使用训练数据集中的 100 个观测值来拟合模型,那么用于进行预测的下一个时间步的索引将指定为预测函数 start=101, end=101。这将返回一个包含一个预测值的一维数组。

    https://machinelearning.org.cn/arima-for-time-series-forecasting-with-python/

    • James Carmichael 2022年9月29日 上午6:28 #

      感谢你的反馈 Timon!

  50. Jaime 2023年6月30日 上午10:23 #

    尊敬的布朗利博士,

    您这里的内容对于我的大学期末项目来说真是太有用了 X)。我使用了 XGBoost、LSTM 和 Prophet 来进行时间序列预测以进行比较。现在我正在尝试使用 SARIMA,我得到了一个很好的结果,这些问题听起来可能很愚蠢,但我仍然是一个完全的初学者。

    1) “m”参数代表“一个季节性周期的时间步长数”,如果我的时间序列是每日频率,季节性周期是一年,那么 m 应该是 12 还是 365?由于数据是每日采样,我不太确定 m=12 是否仅适用于月度频率的时间序列数据。

    2) 如果我运行测试发现我的时间序列已经是平稳的,那么“d”参数是否应该设置为零?

    3) 在运行模型并将其拟合到训练数据,然后预测测试数据时,预测似乎有一个 1 天的偏移,也就是说,我将预测数组移动了 1 位到左边,然后它就完美地拟合了测试的实际数据,我不确定是我做错了什么还是其他原因。

    我更加困惑,因为我将 m 设置为 12,d 设置为 1,但仍然得到了一个不错的结果,尽管时间序列是平稳的。

  51. nia 2023年8月3日 下午12:32 #

    嗨,Jason,

    感谢您的解释。您是否有使用混合 SARIMA-ANN 方法进行预测的示例?

Leave a Reply

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。