• Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测|附代码数据


    全文链接:http://tecdat.cn/?p=12272

    使用ARIMA模型,您可以使用序列过去的值预测时间序列点击文末“阅读原文”获取完整代码数据)。

    • 在本文中,我们从头开始构建了一个最佳ARIMA模型,并将其扩展到Seasonal ARIMA(SARIMA)和SARIMAX模型。



    •  

    时间序列预测简介

    时间序列是在定期时间间隔内记录度量的序列。

    根据频率,时间序列可以是每年(例如:年度预算),每季度(例如:支出),每周(例如:销售数量),每天(例如天气),每小时(例如:股票价格),分钟(例如:来电提示中的呼入电话),甚至是几秒钟(例如:网络流量)。

    为什么要预测?

    因为预测时间序列(如需求和销售)通常具有巨大的商业价值。

    在大多数制造公司中,它驱动基本的业务计划,采购和生产活动。预测中的任何错误都会扩散到整个供应链或与此相关的任何业务环境中。因此,准确地进行预测很重要,以节省成本,这对于成功至关重要。

    不仅在制造业中,时间序列预测背后的技术和概念还适用于任何业务。

    现在,预测时间序列可以大致分为两种类型。

    如果仅使用时间序列的先前值来预测其未来值,则称为  单变量时间序列预测。

    如果您使用序列以外的其他预测变量(也称为外生变量)进行预测,则称为  多变量时间序列预测。

    这篇文章重点介绍一种称为ARIMA  建模的特殊类型的预测方法  。

    ARIMA是一种预测算法,其基于以下思想:时间序列的过去值中的信息可以单独用于预测未来值。

    1. ARIMA模型简介

    那么ARIMA模型到底是什么?

    ARIMA是一类模型,可以根据自身的过去值(即自身的滞后和滞后的预测误差)“解释”给定的时间序列,因此可以使用方程式预测未来价值。

    任何具有模式且不是随机白噪声的“非季节性”时间序列都可以使用ARIMA模型进行建模。

    ARIMA模型的特征在于3个项:p,d,q

    p是AR项

    q是MA项

    d是使时间序列*稳所需的差分阶数

    如果时间序列具有季节性模式,则需要添加季节性条件,该时间序列将变成SARIMA(“季节性ARIMA”的缩写)。一旦完成ARIMA。

    那么,“AR项的阶数”到底意味着什么?我们先来看一下“ d”。

    1. ARIMA模型中的p,d和q是什么意思

    建立ARIMA模型的第一步是  使时间序列*稳。

    为什么?

    因为ARIMA中的“自回归”一词意味着它是一个  线性回归模型  ,使用自己的滞后作为预测因子。如您所知,线性回归模型在预测变量不相关且彼此独立时最有效。

    那么如何使一序列*稳呢?

    最常见的方法是加以差分。即,从当前值中减去先前的值。

    因此,d的值是使序列*稳所需的最小差分阶数。如果时间序列已经*稳,则d = 0。

    接下来,什么是“ p”和“ q”?

    “ p”是“自回归”(AR)项的阶数。它指的是要用作预测变量的Y的滞后阶数。而“ q”是“移动*均”(MA)项的阶数。它是指应输入ARIMA模型的滞后预测误差的数量。

    什么是AR和MA模型

    那么什么是AR和MA模型?AR和MA模型的实际数学公式是什么?

    AR模型是Yt仅取决于其自身滞后的模型。也就是说,Yt是“ Yt滞后”的函数。

    同样,纯  移动*均线(仅MA)模型  是Yt仅取决于滞后预测误差的模型。

    误差项是各个滞后的自回归模型的误差。误差Et和E(t-1)是来自以下方程式的误差:

    那分别是AR和MA模型。

    那么ARIMA模型的方程是什么样的呢?

    ARIMA模型是这样的模型,其中时间序列至少差分一次以使其*稳,然后将AR和MA项组合在一起。因此,等式变为:

    因此,目的是识别p,d和q的值。

    如何在ARIMA模型中找到差分阶数(d)

    进行差分的目的是使时间序列*稳。

    但是您需要注意不要使序列过分差分。因为,超差分序列可能仍然是*稳的,这反过来将影响模型参数。

    那么如何确定正确的差分阶数呢?

    正确的差分阶数是获得*似*稳序列的最小差分,该序列围绕定义的*均值波动,并且ACF曲线相当快地达到零。

    如果自相关对于许多阶数之后(10个或更多)为正,则该序列需要进一步求差。

    在这种情况下,你不能真正确定两个差分阶数之间的差,然后选择在差分序列中给出最小标准偏差的阶数。

    让我们来看一个例子。

    首先,我将使用Augmented Dickey Fuller测试()检查该序列是否*稳。

    为什么?

    因为,仅当序列非*稳时才需要进行差分。否则,不需要差分,即d = 0。

    ADF检验的零假设是时间序列是非*稳的。因此,如果检验的p值小于显着性水*(0.05),则拒绝原假设,并推断时间序列确实是*稳的。

    因此,在我们的情况下,如果P值> 0.05,我们将继续寻找差分的阶数。

    1.  
      from statsmodels.tsa.stattools import adfuller
    2.  
      from numpy import log
    3.  
      result = adfuller(df.value.dropna())
    4.  
      print('ADF Statistic: %f' % result[0])
    5.  
      print('p-value: %f' % result[1])
    1.  
      ADF Statistic: -2.464240
    2.  
      p-value: 0.124419

    由于P值大于显着性水*,因此让我们对序列进行差分,看看自相关图的样子。

    1.  
      import numpy as np, pandas as pd
    2.  
      from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    3.  
      import matplotlib.pyplot as plt
    4.  
      plt.rcParams.update({'figure.figsize':(9,7), 'figure.dpi':120})
    5.  
       
    6.  
      # 导入数据
    7.  
      df = pd.read_csv('wwwusage.csv', names=['value'], header=0)
    8.  
       
    9.  
      # 原始数据
    10.  
      fig, axes = plt.subplots(3, 2, sharex=True)
    11.  
      axes[0, 0].plot(df.value); axes[0, 0].set_title('Original Series')
    12.  
      plot_acf(df.value, ax=axes[0, 1])
    13.  
       
    14.  
      # 一阶差分
    15.  
      axes[1, 0].plot(df.value.diff()); axes[1, 0].set_title('1st Order Differencing')
    16.  
      plot_acf(df.value.diff().dropna(), ax=axes[1, 1])
    17.  
       
    18.  
      # 二阶差分
    19.  
      axes[2, 0].plot(df.value.diff().diff()); axes[2, 0].set_title('2nd Order Differencing')
    20.  
      plot_acf(df.value.diff().diff().dropna(), ax=axes[2, 1])
    21.  
       
    22.  
      plt.show()


    点击标题查阅往期内容

    Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测

    uploading.4e448015.gif转存失败重新上传取消

    左右滑动查看更多

    uploading.4e448015.gif转存失败重新上传取消

    01

    02

    03

    04

    差分

    对于以上序列,时间序列达到*稳,具有两个不同的阶数。但是,在查看第二次差分的自相关图时,滞后会很快进入负值区域,这表明该序列可能已经过差分。

    因此,即使该序列不是完全*稳的(*稳性较弱),我也将暂时将差分的阶数设置为1。

    1.  
      ## Adf 检验
    2.  
      ndiffs(y, test='adf') # 2
    3.  
       
    4.  
      # KPSS 检验
    5.  
      ndiffs(y, test='kpss') # 0
    6.  
       
    7.  
      # PP 检验:
    8.  
      ndiffs(y, test='pp') # 2
    2 0 2

    如何找到AR项的阶数(p)

    下一步是确定模型是否需要AR。您可以通过检查偏自相关(PACF)图来找出所需的AR阶数。

    但是什么是PACF?

    排除部分滞后的影响后,可以将偏自相关想象为序列与其滞后之间的相关性。因此,PACF的传递传达了滞后与序列之间的纯相关性。这样,您将知道在AR中是否需要该滞后。

    如何找到AR项的阶数?

    *稳序列中的任何自相关都可以通过添加足够的AR项进行校正。因此,我们最初将AR项的阶数等于超过PACF图中显着性区间的滞后阶数。

    1.  
      # 一阶差分的偏自相关系数图
    2.  
       
    3.  
       
    4.  
      plt.show()

    AR阶数

    可以观察到,PACF滞后1阶非常重要,因为它远高于显着性线。滞后2阶也很重要,稍微超过了显着性区间(蓝色区域)。

    如何找到MA项的阶数(q)

    就像我们在PACF图上查看AR项的阶数一样,您也可以在ACF图上查看MA项的阶数。MA从技术上讲是滞后预测的误差。

    ACF指示要消除*稳序列中的自相关需要多少个MA项。

    让我们看一下差分序列的自相关图。

    1.  
      fig, axes = plt.subplots(1, 2, sharex=True)
    2.  
      axes[0].plot(df.value.diff()); axes[0].set_title('1st Differencing')
    3.  
      axes[1].set(ylim=(0,1.2))
    4.  
      plot_acf(df.value.diff().dropna(), ax=axes[1])
    5.  
       
    6.  
      plt.show()

    MA阶数

    几个滞后远高于界限。因此,让我们暂时将q固定为2。

    如何处理时间序列差分值过低或过高

    该如何处理?

    如果您的序列差分值过低,通常添加一个或多个其他AR项即可。同样,如果差分值过高,请尝试添加其他MA项。

    如何建立ARIMA模型

    现在,已经确定了p,d和q的值,已经具备了拟合ARIMA模型的所有条件。

    1.  
      ARIMA Model Results
    2.  
      ==============================================================================
    3.  
      Dep. Variable: D.value No. Observations: 99
    4.  
      Model: ARIMA(1, 1, 2) Log Likelihood -253.790
    5.  
      Method: css-mle S.D. of innovations 3.119
    6.  
      Date: Wed, 06 Feb 2019 AIC 517.579
    7.  
      Time: 23:32:56 BIC 530.555
    8.  
      Sample: 1 HQIC 522.829
    9.  
       
    10.  
      =================================================================================
    11.  
      coef std err z P>|z| [0.025 0.975]
    12.  
      ---------------------------------------------------------------------------------
    13.  
      const 1.1202 1.290 0.868 0.387 -1.409 3.649
    14.  
      ar.L1.D.value 0.6351 0.257 2.469 0.015 0.131 1.139
    15.  
      ma.L1.D.value 0.5287 0.355 1.489 0.140 -0.167 1.224
    16.  
      ma.L2.D.value -0.0010 0.321 -0.003 0.998 -0.631 0.629
    17.  
      Roots
    18.  
      =============================================================================
    19.  
      Real Imaginary Modulus Frequency
    20.  
      -----------------------------------------------------------------------------
    21.  
      AR.1 1.5746 +0.0000j 1.5746 0.0000
    22.  
      MA.1 -1.8850 +0.0000j 1.8850 0.5000
    23.  
      MA.2 545.3515 +0.0000j 545.3515 0.0000
    24.  
      -----------------------------------------------------------------------------

    该模型摘要揭示了很多信息。中间的表是系数表,其中“ coef”下的值是相应项的权重。

    请注意,这里的MA2项的系数接*零 。理想情况下,各个X的值应小于0.05。

    因此,让我们在没有MA2的情况下重建模型。

    1.  
      ARIMA Model Results
    2.  
      ==============================================================================
    3.  
      Dep. Variable: D.value No. Observations: 99
    4.  
      Model: ARIMA(1, 1, 1) Log Likelihood -253.790
    5.  
      Method: css-mle S.D. of innovations 3.119
    6.  
      Date: Sat, 09 Feb 2019 AIC 515.579
    7.  
      Time: 12:16:06 BIC 525.960
    8.  
      Sample: 1 HQIC 519.779
    9.  
       
    10.  
      =================================================================================
    11.  
      coef std err z P>|z| [0.025 0.975]
    12.  
      ---------------------------------------------------------------------------------
    13.  
      const 1.1205 1.286 0.871 0.386 -1.400 3.641
    14.  
      ar.L1.D.value 0.6344 0.087 7.317 0.000 0.464 0.804
    15.  
      ma.L1.D.value 0.5297 0.089 5.932 0.000 0.355 0.705
    16.  
      Roots
    17.  
      =============================================================================
    18.  
      Real Imaginary Modulus Frequency
    19.  
      -----------------------------------------------------------------------------
    20.  
      AR.1 1.5764 +0.0000j 1.5764 0.0000
    21.  
      MA.1 -1.8879 +0.0000j 1.8879 0.5000
    22.  
      -----------------------------------------------------------------------------

    AIC模型已减少,这很好。AR1和MA1项的P值已提高并且非常显着(<< 0.05)。

    让我们绘制残差 。

    残差密度

    残差似乎很好,均值接*零且方差均匀。让我们使用绘制实际值和拟合值 。

    实际vs拟合

    设置  dynamic=False 样本内时,滞后值用于预测。

    也就是说,模型被训练到上一个值进行下一个预测。

    因此,我们似乎有一个不错的ARIMA模型。但是那是最好的吗?

    目前不能这么说,因为我们还没有真正预测未来数据,而是将预测与实际数据进行了比较。

    因此, 现在需要交叉验证。

    如何使用交叉验证手动找到最佳ARIMA模型

    在“交叉验证”中,可以预测将来的数据。然后,您将预测值与实际值进行比较。

    要进行交叉验证,您需要创建训练和测试数据集,方法是将时间序列按大约75:25的比例或基于序列时间频率的合理比例分成两个连续的部分。

    为什么不随机采样训练数据?

    这是因为时间序列的序列应完整无缺,以便用于预测。

    现在,您可以在训练数据集上构建ARIMA模型,对其进行预测和绘制。

    1.  
      # 绘图
    2.  
      plt.figure(figsize=(12,5), dpi=100)
    3.  
      plt.plot(train, label='training')
    4.  
      plt.plot(test, label='actual')
    5.  
      plt.plot(fc_series, label='forecast')
    6.  
      plt.fill_between(lower_series.index, lower_series, upper_series,
    7.  
      color='k', alpha=.15)
    8.  
      plt.title('Forecast vs Actuals')
    9.  
      plt.legend(loc='upper left', fontsize=8)
    10.  
      plt.show()

    预测与实际

    从图表中,ARIMA(1,1,1)模型似乎给出了方向正确的预测。实际观察值在95%置信区间内。

    但是每个预测的预测始终低于实际。这意味着,通过在我们的预测中添加一个小的常数,精度一定会提高。因此,肯定有改进的余地。

    所以,我要做的是将差分的阶数增加到2,即进行设置,  d=2 然后将p迭代地增加到5,然后将q增加到5,以查看哪个模型给出的AIC最小,同时还要寻找一个给出更接*实际情况和预测。

    在执行此操作时,我会关注模型摘要中AR和MA项的P值。它们应尽可能接*零,理想情况下应小于0.05。

    1.  
      ARIMA Model Results
    2.  
      ==============================================================================
    3.  
      Dep. Variable: D2.value No. Observations: 83
    4.  
      Model: ARIMA(3, 2, 1) Log Likelihood -214.248
    5.  
      Method: css-mle S.D. of innovations 3.153
    6.  
      Date: Sat, 09 Feb 2019 AIC 440.497
    7.  
      Time: 12:49:01 BIC 455.010
    8.  
      Sample: 2 HQIC 446.327
    9.  
       
    10.  
      ==================================================================================
    11.  
      coef std err z P>|z| [0.025 0.975]
    12.  
      ----------------------------------------------------------------------------------
    13.  
      const 0.0483 0.084 0.577 0.565 -0.116 0.212
    14.  
      ar.L1.D2.value 1.1386 0.109 10.399 0.000 0.924 1.353
    15.  
      ar.L2.D2.value -0.5923 0.155 -3.827 0.000 -0.896 -0.289
    16.  
      ar.L3.D2.value 0.3079 0.111 2.778 0.007 0.091 0.525
    17.  
      ma.L1.D2.value -1.0000 0.035 -28.799 0.000 -1.068 -0.932
    18.  
      Roots
    19.  
      =============================================================================
    20.  
      Real Imaginary Modulus Frequency
    21.  
      -----------------------------------------------------------------------------
    22.  
      AR.1 1.1557 -0.0000j 1.1557 -0.0000
    23.  
      AR.2 0.3839 -1.6318j 1.6763 -0.2132
    24.  
      AR.3 0.3839 +1.6318j 1.6763 0.2132
    25.  
      MA.1 1.0000 +0.0000j 1.0000 0.0000
    26.  
      -----------------------------------------------------------------------------

    修订后的预测与实际值

    AIC已从515减少到440。X项的P值小于<0.05,这很好。

    所以总的来说要好得多。

    理想情况下,应该返回多个时间点,例如返回1、2、3和4个季度,并查看一年中各个时间点的预测效果如何。

    时间序列预测的准确性指标

    用来判断预测的常用准确性指标是:

    1. *均绝对百分比误差(MAPE)

    2. *均误差(ME)

    3. *均绝对误差(MAE)

    4. *均百分比误差(MPE)

    5. 均方根误差(RMSE)

    6. 滞后1自相关误差(ACF1)

    7. 实际与预测之间的相关性(corr)

    8. 最小最大误差(minmax)

    通常,如果要比较两个不同序列的预测,则可以使用MAPE,Correlation和Min-Max Error。

    为什么不使用其他指标?

    因为只有上述三个是百分比误差,所以误差在0到1之间变化。因此,无论序列的规模如何,您都可以判断预测的质量如何。

    其他误差度量是数量。这意味着,*均值为1000的序列的RMSE为100,*均值为10的序列的RMSE为5。因此,不能真正使用它们来比较两个不同比例时间序列的预测。

    1.  
      forecast_accuracy(fc, test.values)
    2.  
       
    3.  
      #> {'mape': 0.02250131357314834,
    4.  
      #> 'me': 3.230783108990054,
    5.  
      #> 'mae': 4.548322194530069,
    6.  
      #> 'mpe': 0.016421001932706705,
    7.  
      #> 'rmse': 6.373238534601827,
    8.  
      #> 'acf1': 0.5105506325288692,
    9.  
      #> 'corr': 0.9674576513924394,
    10.  
      #> 'minmax': 0.02163154777672227}

    大约2.2%的MAPE表示该模型在预测接下来的15个观测值时的准确性约为97.8%。

    但是在工业应用情况下,将给您提供很多时间序列来进行预测,并且定期重复进行预测。

    因此,我们需要一种使最佳模型选择过程自动化的方法。

    如何在Python中进行自动Arima预测

    使用逐步方法来搜索p,d,q参数的多个组合,并选择具有最小AIC的最佳模型。

    1.  
      print(model.summary())
    2.  
       
    3.  
      #> Fit ARIMA: order=(1, 2, 1); AIC=525.586, BIC=535.926, Fit time=0.060 seconds
    4.  
      #> Fit ARIMA: order=(0, 2, 0); AIC=533.474, BIC=538.644, Fit time=0.005 seconds
    5.  
      #> Fit ARIMA: order=(1, 2, 0); AIC=532.437, BIC=540.192, Fit time=0.035 seconds
    6.  
      #> Fit ARIMA: order=(0, 2, 1); AIC=525.893, BIC=533.648, Fit time=0.040 seconds
    7.  
      #> Fit ARIMA: order=(2, 2, 1); AIC=515.248, BIC=528.173, Fit time=0.105 seconds
    8.  
      #> Fit ARIMA: order=(2, 2, 0); AIC=513.459, BIC=523.798, Fit time=0.063 seconds
    9.  
      #> Fit ARIMA: order=(3, 2, 1); AIC=512.552, BIC=528.062, Fit time=0.272 seconds
    10.  
      #> Fit ARIMA: order=(3, 2, 0); AIC=515.284, BIC=528.209, Fit time=0.042 seconds
    11.  
      #> Fit ARIMA: order=(3, 2, 2); AIC=514.514, BIC=532.609, Fit time=0.234 seconds
    12.  
      #> Total fit time: 0.865 seconds
    13.  
      #> ARIMA Model Results
    14.  
      #> ==============================================================================
    15.  
      #> Dep. Variable: D2.y No. Observations: 98
    16.  
      #> Model: ARIMA(3, 2, 1) Log Likelihood -250.276
    17.  
      #> Method: css-mle S.D. of innovations 3.069
    18.  
      #> Date: Sat, 09 Feb 2019 AIC 512.552
    19.  
      #> Time: 12:57:22 BIC 528.062
    20.  
      #> Sample: 2 HQIC 518.825
    21.  
      #>
    22.  
      #> ==============================================================================
    23.  
      #> coef std err z P>|z| [0.025 0.975]
    24.  
      #> ------------------------------------------------------------------------------
    25.  
      #> const 0.0234 0.058 0.404 0.687 -0.090 0.137
    26.  
      #> ar.L1.D2.y 1.1586 0.097 11.965 0.000 0.969 1.348
    27.  
      #> ar.L2.D2.y -0.6640 0.136 -4.890 0.000 -0.930 -0.398
    28.  
      #> ar.L3.D2.y 0.3453 0.096 3.588 0.001 0.157 0.534
    29.  
      #> ma.L1.D2.y -1.0000 0.028 -36.302 0.000 -1.054 -0.946
    30.  
      #> Roots
    31.  
      #> =============================================================================
    32.  
      #> Real Imaginary Modulus Frequency
    33.  
      #> -----------------------------------------------------------------------------
    34.  
      #> AR.1 1.1703 -0.0000j 1.1703 -0.0000
    35.  
      #> AR.2 0.3763 -1.5274j 1.5731 -0.2116
    36.  
      #> AR.3 0.3763 +1.5274j 1.5731 0.2116
    37.  
      #> MA.1 1.0000 +0.0000j 1.0000 0.0000
    38.  
      #> -----------------------------------------------------------------------------

    如何解释ARIMA模型中的残差图

    让我们查看残差图。

    残差图

    那么如何解释?

    左上方:  残余误差似乎在零均值附*波动,并且具有均匀的方差。

    右上方:  密度图建议均值为零的正态分布。

    左下:  所有圆点应与红线完全一致。任何明显的偏差都意味着分布偏斜。

    右下:  Correlogram(又名ACF)图显示残差误差不是自相关的。任何自相关都将暗示残差中存在某种模式,该模式未在模型中进行解释。因此,您将需要为模型寻找更多的X(预测变量)。

    总体而言,模型很合适。让我们预测一下。

    如何在python中自动构建SARIMA模型

    普通ARIMA模型的问题在于它不支持季节性。

    如果您的时间序列定义了季节性,那么,请使用季节性差分的SARIMA。

    季节性差分与常规差分相似,但是您可以从上一季节中减去该值,而不是减去连续项。

    因此,该模型将表示为SARIMA(p,d,q)x(P,D,Q),其中P,D和Q分别是SAR,季节性差分的阶数和SMA项,并且  'x' 是时间的频率序列。

    如果您的模型具有明确定义的季节性模式,则对给定的频率“ x”强制执行D = 1。

    这是有关构建SARIMA模型的一些实用建议:

    通常,将模型参数设置为D不得超过1。并且总的分'd + D'不超过2。如果模型具有季节性成分,请尝试仅保留SAR或SMA项。

    我们在药物销售数据集上建立一个SARIMA模型 。

    季节性差分

    在应用通常的差分(滞后1)之后,季节性峰值是完整的。鉴于此,应在季节性差分后进行纠正。

    让我们建立使用SARIMA模型。为此,您需要设置  seasonal=True,设置m=12 按月序列的频率  并强制执行  D=1

    1.  
      Fit ARIMA: order=(1, 0, 1) seasonal_order=(0, 1, 1, 12); AIC=534.818, BIC=551.105, Fit time=1.742 seconds
    2.  
      Fit ARIMA: order=(0, 0, 0) seasonal_order=(0, 1, 0, 12); AIC=624.061, BIC=630.576, Fit time=0.028 seconds
    3.  
      Fit ARIMA: order=(1, 0, 0) seasonal_order=(1, 1, 0, 12); AIC=596.004, BIC=609.034, Fit time=0.683 seconds
    4.  
      Fit ARIMA: order=(0, 0, 1) seasonal_order=(0, 1, 1, 12); AIC=611.475, BIC=624.505, Fit time=0.709 seconds
    5.  
      Fit ARIMA: order=(1, 0, 1) seasonal_order=(1, 1, 1, 12); AIC=557.501, BIC=577.046, Fit time=3.687 seconds
    6.  
      (...TRUNCATED...)
    7.  
      Fit ARIMA: order=(3, 0, 0) seasonal_order=(1, 1, 1, 12); AIC=554.570, BIC=577.372, Fit time=2.431 seconds
    8.  
      Fit ARIMA: order=(3, 0, 0) seasonal_order=(0, 1, 0, 12); AIC=554.094, BIC=570.381, Fit time=0.220 seconds
    9.  
      Fit ARIMA: order=(3, 0, 0) seasonal_order=(0, 1, 2, 12); AIC=529.502, BIC=552.305, Fit time=2.120 seconds
    10.  
      Fit ARIMA: order=(3, 0, 0) seasonal_order=(1, 1, 2, 12); AIC=nan, BIC=nan, Fit time=nan seconds
    11.  
      Total fit time: 31.613 seconds

    该模型估计了AIC,系数的P值看起来很重要。让我们看一下残差的诊断图。

    最佳模型  SARIMAX(3, 0, 0)x(0, 1, 1, 12) 的AIC为528.6,P值很重要。

    让我们预测未来的24个月。

    SARIMA –最终预测

    如何用外生变量建立SARIMAX模型

    我们构建的SARIMA模型很好。

    但是为了完整起见,让我们尝试将外部预测变量(也称为“外生变量”)加到模型中。该模型称为SARIMAX模型。

    使用外生变量的唯一要求是您还需要在预测期内知道变量的值。

    为了演示,我将对最*36个月的数据使用经典季节性分解中的季节性指数  。

    为什么要季节性指数?SARIMA是否已经在模拟季节性?

    你是对的。

    而且,我想看看如果我们将最*的季节性模式强加到训练和预测中,模型将如何显示。

    其次,这是一个很好的演示目的变量。因此,你可以将其用作模板,并将任何变量插入代码中。季节性指数是一个很好的外生变量,因为它每个频率周期都会重复一次,在这种情况下为12个月。

    因此,你将始终知道季节性指数将对未来的预测保持何种价值。

    让我们计算季节性指数,以便可以将其作为SARIMAX模型的(外部)预测变量。

    外生变量(季节指数)已准备就绪。让我们构建SARIMAX模型。

    1.  
      Fit ARIMA: order=(1, 0, 1) seasonal_order=(0, 1, 1, 12); AIC=536.818, BIC=556.362, Fit time=2.083 seconds
    2.  
      Fit ARIMA: order=(0, 0, 0) seasonal_order=(0, 1, 0, 12); AIC=626.061, BIC=635.834, Fit time=0.033 seconds
    3.  
      Fit ARIMA: order=(1, 0, 0) seasonal_order=(1, 1, 0, 12); AIC=598.004, BIC=614.292, Fit time=0.682 seconds
    4.  
      Fit ARIMA: order=(0, 0, 1) seasonal_order=(0, 1, 1, 12); AIC=613.475, BIC=629.762, Fit time=0.510 seconds
    5.  
      Fit ARIMA: order=(1, 0, 1) seasonal_order=(1, 1, 1, 12); AIC=559.530, BIC=582.332, Fit time=3.129 seconds
    6.  
      (...Truncated...)
    7.  
      Fit ARIMA: order=(3, 0, 0) seasonal_order=(0, 1, 0, 12); AIC=556.094, BIC=575.639, Fit time=0.260 seconds
    8.  
      Fit ARIMA: order=(3, 0, 0) seasonal_order=(0, 1, 2, 12); AIC=531.502, BIC=557.562, Fit time=2.375 seconds
    9.  
      Fit ARIMA: order=(3, 0, 0) seasonal_order=(1, 1, 2, 12); AIC=nan, BIC=nan, Fit time=nan seconds
    10.  
      Total fit time: 30.781 seconds

    因此,我们拥有带有外生项的模型。但是该系数对于 x1来说很小 ,因此该变量的贡献可以忽略不计。让我们继续预测吧。

    我们已有效地将模型中最*3年的最新季节性影响强加给模型。

    让我们预测下一个24个月。为此,你需要接下来24个月的季节性指数值。

    SARIMAX预测


    点击文末“阅读原文”

    获取全文完整资料。

    本文选自《Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测》。

    点击标题查阅往期内容

    Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测

    数据分享|PYTHON用ARIMA ,ARIMAX预测商店商品销售需求时间序列数据

    Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测

    【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享

    深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列

    spss modeler用决策树神经网络预测ST的股票

    Python中TensorFlow的长短期记忆神经网络(LSTM)、指数移动*均法预测股票市场和可视化

    RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

    结合新冠疫情COVID-19股票价格预测:ARIMA,KNN和神经网络时间序列分析

    深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据

    用PyTorch机器学习神经网络分类预测银行客户流失模型

    PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据

    Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

    R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化

    深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据

    Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

    R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列

    R语言KERAS用RNN、双向RNNS递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感

    Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

    Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

    R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告

    R语言深度学习:用keras神经网络回归模型预测时间序列数据

    Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类

    R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

    MATLAB中用BP神经网络预测人体脂肪百分比数据

    Python中用PyTorch机器学习神经网络分类预测银行客户流失模型

    R语言实现CNN(卷积神经网络)模型进行回归数据分析

    SAS使用鸢尾花(iris)数据集训练人工神经网络(ANN)模型

    【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析

    Python使用神经网络进行简单文本分类

    R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析

    R语言基于递归神经网络RNN的温度时间序列预测

    R语言神经网络模型预测车辆数量时间序列

    R语言中的BP神经网络模型分析学生成绩

    matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类

    R语言实现拟合神经网络预测和结果可视化

    用R语言实现神经网络预测股票实例

    使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测

    python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译

    用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

  • 相关阅读:
    python的各版本的不同
    keras中的early stopping
    NER的数据处理
    ner处理数据的方式
    python的数据处理一
    linux下的终端利器----tmux
    BiseNet学习笔记
    《Harnessing Synthesized Abstraction Images to Improve Facial Attribute Recognition》论文阅读笔记
    转:玩玩三维重建
    《Cascaded Pyramid Network for Multi-Person Pose Estimation》论文阅读及复现笔记
  • 原文地址:https://www.cnblogs.com/tecdat/p/16866779.html
Copyright © 2020-2023  润新知