【问题标题】:How to forecast time series using AutoReg in python如何在 python 中使用 AutoReg 预测时间序列
【发布时间】:2023-04-10 12:59:01
【问题描述】:

我正在尝试仅使用自动回归算法来构建老式模型。我发现statsmodel 包中有它的实现。我已经阅读了文档,据我所知,它应该像 ARIMA 一样工作。所以,这是我的代码:

import statsmodels.api as sm
model = sm.tsa.AutoReg(df_train.beer, 12).fit()

当我想预测新值时,我会尝试遵循文档:

y_pred = model.predict(start=df_test.index.min(), end=df_test.index.max())
# or
y_pred = model.predict(start=100, end=1000)

两者都返回一个 NaN 列表。

此外,当我输入 model.predict(0, df_train.size - 1) 时,它会预测实际值,但 model.predict(0, df_train.size) 会预测 NaN 列表。

我做错了吗?


P.S. 我知道有 ARIMA、ARMA 或 SARIMAX 算法可以用作基本的自动回归。但我确实需要 AutoReg。

【问题讨论】:

    标签: python time-series statsmodels arima autoregressive-models


    【解决方案1】:

    您可以使用此代码进行预测

    model = sm.tsa.AutoReg(df_train.beer, 12).fit()
    y_pred = model.model.predict(model.params, start=df_test.index.min(), end=df_test.index.max())
    

    【讨论】:

      【解决方案2】:

      我们可以通过以下几种方式进行预测:

      1. 直接使用predict()函数和
      2. 通过使用AR(p)过程的定义和AutoReg()学习的参数:这将有助于短期预测,我们将看到。

      让我们从statsmodels 的示例数据集开始,数据如下所示:

      import statsmodels.api as sm
      data = sm.datasets.sunspots.load_pandas().data['SUNACTIVITY']
      plt.plot(range(len(data)), data)
      

      让我们拟合一个AR(p)过程来对时间序列进行建模,并使用偏自相关图来找到顺序p,如下所示

      从上面可以看出,前几个 PACF 值仍然很重要,我们将 p=10 用于 AR(p)

      让我们将数据划分为训练和验证(测试)数据集,并使用训练数据拟合 10 阶自回归模型:

      from statsmodels.tsa.ar_model import AutoReg
      n = len(data)
      ntrain = int(n*0.9)
      ntest = n - ntrain
      lag = 10
      res = AutoReg(data[:ntrain], lags = lag).fit()
      

      现在,使用predict() 函数来预测与保留数据集对应的所有值:

      preds = res.model.predict(res.params, start=n-ntest, end=n)
      

      请注意,我们可以使用训练模型中的参数得到完全相同的预测,如下所示:

      x = data[ntrain-lag:ntrain].values
      preds1 = []
      for t in range(ntrain, n):
          pred = res.params[0] + np.sum(res.params[1:]*x[::-1])
          x[:lag-1], x[lag-1] = x[-(lag-1):], pred
          preds1.append(pred)
      

      请注意,这种方式生成的预测值与上面使用predict() 函数获得的预测值相同。

      np.allclose(preds.values, np.array(preds1))
      # True
      

      现在,让我们绘制测试数据的预测值:

      可以看出,对于长期预测,预测质量不是很好(因为预测值用于长期预测)。

      现在让我们转而进行短期预测,并使用数据集中最后的 lag 点来预测下一个值,如下一个代码 sn-p 所示。

      preds = []
      for t in range(ntrain, n):
          pred = res.params[0] + np.sum(res.params[1:]*data[t-lag:t].values[::-1])
          preds.append(pred)
      

      从下图中可以看出,短期预测效果更好:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-01
        • 2020-06-01
        • 1970-01-01
        • 2017-05-01
        • 2014-04-03
        • 2016-01-04
        • 2019-01-20
        相关资源
        最近更新 更多