首页 > 编程知识 正文

时间序列的自回归模型,时间序列的线性回归模型

时间:2023-05-06 19:58:35 阅读:276230 作者:3440

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

本篇文章结构如下:

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

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

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

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

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

就这么简单!

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

在 Python 中的实现自回归

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

import numpy as npimport pandas as pdfrom sklearn.metrics import mean_squared_errorfrom statsmodels.tsa.ar_model import ARimport matplotlib.pyplot as pltfrom matplotlib import rcParamsfrom cycler import cyclerrcParams['figure.figsize'] = 18, 5rcParams['axes.spines.top'] = FalsercParams['axes.spines.right'] = FalsercParams['axes.prop_cycle'] = cycler(color=['#365977'])rcParams['lines.linewidth'] = 2.5# Createnp.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})# Plotplt.title('Random dataset', size=20)plt.plot(df['y']);

这是它的样子:

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

# Train/test splitdf_train = df[:-10]df_test = df[-10:]# Plotplt.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 lag ordermax_p = 10# To store RMSEerrors = {}for p in range(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ć

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。