0


时间序列的自回归理论和实现

本篇文章结构如下:

  1. 自回归-理论和数学
  2. 在Python中实现的自动回归
  3. 自回归-选择最好的参数值
  4. 结论

自回归

术语 AutoRegression (AR) 与来自统计的常规回归密切相关。唯一的问题是 AR 模型使用来自相同输入变量的滞后格式数据——这就是 AutoRegression 的 Auto 部分。

AutoRegression 的预测能力有限,就像简单的移动平均线一样。该算法使用过去值的线性组合来进行未来预测。一般的 AutoRegression 模型用以下公式表示:

其中 c 是常数,phi 是 p 阶以下的滞后系数,epsilon 是不可约误差(白噪声)。

使用 AR 模型时,您只需要指定参数 p 的值。如果 p=1,则 AR 模型公式简化为:

就这么简单!

p 的更高阶数往往会给出更好的预测结果,但仅限于某个点。稍后您将看到如何自动为 p 选择最佳值。但首先,让我们看看如何用 Python 实现 AutoRegression。

在 Python 中的实现自回归

您今天将创建自己的数据集。这是一条简单的直线,添加了一点噪音:

 importnumpyasnp
 importpandasaspd
 fromsklearn.metricsimportmean_squared_error
 fromstatsmodels.tsa.ar_modelimportAR
 
 importmatplotlib.pyplotasplt
 frommatplotlibimportrcParams
 fromcyclerimportcycler
 
 rcParams['figure.figsize'] = 18, 5
 rcParams['axes.spines.top'] = False
 rcParams['axes.spines.right'] = False
 rcParams['axes.prop_cycle'] = cycler(color=['#365977'])
 rcParams['lines.linewidth'] = 2.5
 
 # Create
 np.random.seed(2)
 xs = np.arange(0, 500, 5)
 ys = [x+np.random.random() *10forxinxs]
 
 df = pd.DataFrame(data={
     'x': xs,
     'y': ys
 })
 
 # Plot
 plt.title('Random dataset', size=20)
 plt.plot(df['y']);

这是它的样子:

下一步是将数据集划分为训练和测试子集。 将使用最后 10 个数据点进行测试,并使用其他所有数据进行训练:

 # Train/test split
 df_train = df[:-10]
 df_test = df[-10:]
 
 # Plot
 plt.title('Random dataset train and test sets', size=20)
 plt.plot(df_train['y'], label='Training data')
 plt.plot(df_test['y'], color='gray', label='Testing data')
 plt.legend();

以下是两个数据集的样子:

接下来,将声明一个用于训练和可视化 AR 模型的函数 — train_and_plot(maxlag: int)。此功能在这里是为了方便,以避免一遍又一遍地复制粘贴几乎相同的代码。它在训练集上训练 AR(p=maxlag) 模型,并以图形方式比较预测和测试集。

该函数还会在绘图副标题中打印模型系数,因此您可以根据需要将它们与之前讨论的数学公式联系起来。

这是代码:

 deftrain_and_plot(maxlag):
     model = AR(df_train['y']).fit(maxlag=maxlag, method='mle')
     forecasts = model.predict(
         start=len(df_train),
         end=len(df_train) +len(df_test) -1,
         dynamic=False
     )
     
     parameters = model.params.to_dict()
     fork, vinparameters.items():
         parameters[k] = np.round(v, 3)
     
     plt.title(f'AR({maxlag}) training/testing data and forecasts', size=20, y=1.1)
     plt.suptitle(parameters, y=0.94)
     plt.plot(df_train['y'], label='Training data')
     plt.plot(df_test['y'], color='gray', label='Testing data')
     plt.plot(forecasts, color='orange', label='Forecasts')
     plt.legend();

现在可以使用此函数通过在新单元格中执行 train_and_plot(maxlag=1) 来训练简单的 AR(1) 模型。它显示下图:

将参数 p 更改为想要的任何内容。例如,AR(2) 模型结果如下所示 (train_and_plot(maxlag=2)):

问题仍然存在——这个数据集的最佳 AR 模型顺序是什么?让我们在下一节中回答这个问题。

AutoRegression - 选择最佳参数值

使用 AR(1) 和 AR(2) 获得的预测看起来并不那么有希望。你总是想优化 p 的值。一种方法是绘制自相关图和偏自相关图并对其进行检查,但这工作量太大。

更好的方法是在循环内训练 AR(1) 到 AR(n) 模型,并跟踪测试集的性能。可以使用 RMSE 或任何其他指标来执行此操作。

这是一个简单的代码片段,可以做到这一点:

 # Max lag order
 max_p = 10
 # To store RMSE
 errors = {}
 
 forpinrange(1, max_p+1):
     # Train and predict
     model = AR(df_train['y']).fit(maxlag=p, dynamic=False)
     preds = model.predict(
         start=len(df_train),
         end=len(df_train) +len(df_test) -1,
         dynamic=False
     )
     # Calculate and store RMSE
     error = mean_squared_error(df_test['y'], preds, squared=False)
     errors[f'AR({p})'] = error

以下是 AR(1) 到 AR(10) 模型的误差:

看起来 AR(5) 模型在测试集上的误差最低。以下是数据集和预测在此模型顺序中的样子:

使用 AIC 指标进行评估也很常见,因为它更倾向于简单的模型而不是复杂的模型。这两个指标都表明 AR(5) 是最好的模型。

总结

可以使用 AR 模型来预测简单的数据集。该算法与移动平均模型结合使用时效果最佳,这是我们将在下一篇文章中讨论的主题。

如果您决定将 AR 模型应用于 Airline Passengers 等数据集,则无论模型顺序如何,都不会获得良好的预测结果。使数据集静止可能会有所帮助,但预测仍然不如指数平滑法。

我们将在下一篇文章中探讨将 AutoRegression 和移动平均线组合到单个模型 (ARMA) 是否会有所帮助。

作者:Dario Radečić

标签:

“时间序列的自回归理论和实现”的评论:

还没有评论