本篇文章结构如下:
- 自回归-理论和数学
- 在Python中实现的自动回归
- 自回归-选择最好的参数值
- 结论
自回归
术语 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ć