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

将回归应用于时间序列问题

本篇文章结构如下:

  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 中的实现自回归

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

import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.ar_model import AR

import matplotlib.pyplot as plt
from matplotlib import rcParams
from cycler import cycler

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

np.random.seed(2)
xs = np.arange(0, 500, 5)
ys = [x + np.random.random() * 10 for x in xs]

df = pd.DataFrame(data={
    'x': xs,
    'y': ys
})

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) 模型,并以图形方式比较预测和测试集。

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

这是代码:

def train_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()
    for k, v in parameters.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_p = 10

errors = {}

for p in range(1, max_p + 1):

    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
    )

    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ć

Original: https://blog.csdn.net/m0_46510245/article/details/119903645
Author: deephub
Title: 时间序列的自回归理论和实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/634864/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球