如何进行不涉及改造ARIMA模型的多步超时预测?
How to perform multi-step out-of-time forecast which does not involve refitting the ARIMA model?
我已经有一个 ARIMA (p,d,q) 模型适合时间序列数据(例如,data[0:100]
),使用 python。我想用这个模型做预测 (forecast[100:120]
)。但是,鉴于我也有未来的真实数据(例如:data[100:120]
),我如何确保多步预测考虑到我拥有的未来真实数据而不是使用它预测的数据?
本质上,在预测时我希望使用 data[100]
而不是 forecast[100]
来计算 forecast[101]
。
我想避免在每个时间步使用更新后的 "history".
重新拟合整个 ARIMA 模型
我拟合ARIMAX模型如下:
train, test = data[:100], data[100:]
ext_train, ext_test = external[:100], external[100:]
model = ARIMA(train, order=(p, d, q), exog=ext_train)
model_fit = model.fit(displ=False)
现在,下面的代码允许我预测整个数据集的值,包括测试
forecast = model_fit.predict(end=len(data)-1, exog=external, dynamic=False)
然而,在这种情况下,经过 100 个步骤后,ARIMAX 预测值会迅速收敛到长期 运行 均值(正如预期的那样,因为经过 100 个时间步骤后,它仅使用预测值)。我想知道是否有办法提供 "future" 真实值以提供更好的在线预测。大致如下:
forecast = model_fit.predict_fn(end = len(data)-1, exog=external, true=data, dynamic=False)
我知道我总是可以通过
继续改装 ARIMAX 模型
historical = train
historical_ext = ext_train
predictions = []
for t in range(len(test)):
model = ARIMA(historical, order=(p,d,q), exog=historical_ext)
model_fit = model.fit(disp=False)
output = model_fit.forecast(exog=ext_test[t])[0]
predictions.append(output)
observed = test[t]
historical.append(observed)
historical_ext.append(ext_test[t])
但这导致我一次又一次地训练 ARIMAX 模型,这对我来说意义不大。它导致使用大量的计算资源并且非常不切实际。这进一步使得评估 ARIMAX 模型变得困难,因为拟合参数在每次迭代中不断变化。
我的 understanding/use ARIMAX 模型有什么不正确的地方吗?
你是对的,如果你想使用新数据进行在线预测,你将需要一遍又一遍地估计参数,这在计算上是低效的。
需要注意的一件事是,对于 ARIMA 模型,主要是模型 MA 部分的参数估计计算量很大,因为这些参数是使用数值优化估计的,而不是使用普通的最小二乘法。由于在为初始模型计算一次参数后,您就知道对未来模型的预期是什么,因为一次观察不会改变它们太多,您可以初始化参数搜索以提高计算效率。
此外,可能有一种方法可以更有效地进行估计,因为您拥有模型的旧数据和参数,您唯一要做的就是再添加一个数据点。这意味着您只需要为新数据点与所有其他数据点的组合计算 theta 和 phi 参数,而无需再次计算已知组合,这将节省大量时间。我非常喜欢这本书:Heij, Christiaan, et al.计量经济学方法在商业和经济学中的应用。牛津大学出版社,2004.
本讲座可能会让您了解这如何可行:lecture on ARIMA parameter estimation
恐怕您必须自己实施。据我所知,没有现成的方法可以做到这一点。
希望这能给你一些新的想法!
正如这个非常好的博客所建议的那样 (3 facts about time series forecasting that surprise experienced machine learning practitioners):
"You need to retrain your model every time you want to generate a new prediction",也通过例子直观的理解了为什么会出现这种情况。
这基本上突出了时间序列预测挑战是一个不断变化的问题,需要重新调整。
我一直在努力解决这个问题。幸运的是,我找到了一个非常有用的讨论。据我所知,在python中ARIMA不支持这种情况,我们需要使用SARIMAX。
可以参考link的讨论:https://github.com/statsmodels/statsmodels/issues/2788
我已经有一个 ARIMA (p,d,q) 模型适合时间序列数据(例如,data[0:100]
),使用 python。我想用这个模型做预测 (forecast[100:120]
)。但是,鉴于我也有未来的真实数据(例如:data[100:120]
),我如何确保多步预测考虑到我拥有的未来真实数据而不是使用它预测的数据?
本质上,在预测时我希望使用 data[100]
而不是 forecast[100]
来计算 forecast[101]
。
我想避免在每个时间步使用更新后的 "history".
重新拟合整个 ARIMA 模型我拟合ARIMAX模型如下:
train, test = data[:100], data[100:]
ext_train, ext_test = external[:100], external[100:]
model = ARIMA(train, order=(p, d, q), exog=ext_train)
model_fit = model.fit(displ=False)
现在,下面的代码允许我预测整个数据集的值,包括测试
forecast = model_fit.predict(end=len(data)-1, exog=external, dynamic=False)
然而,在这种情况下,经过 100 个步骤后,ARIMAX 预测值会迅速收敛到长期 运行 均值(正如预期的那样,因为经过 100 个时间步骤后,它仅使用预测值)。我想知道是否有办法提供 "future" 真实值以提供更好的在线预测。大致如下:
forecast = model_fit.predict_fn(end = len(data)-1, exog=external, true=data, dynamic=False)
我知道我总是可以通过
继续改装 ARIMAX 模型historical = train
historical_ext = ext_train
predictions = []
for t in range(len(test)):
model = ARIMA(historical, order=(p,d,q), exog=historical_ext)
model_fit = model.fit(disp=False)
output = model_fit.forecast(exog=ext_test[t])[0]
predictions.append(output)
observed = test[t]
historical.append(observed)
historical_ext.append(ext_test[t])
但这导致我一次又一次地训练 ARIMAX 模型,这对我来说意义不大。它导致使用大量的计算资源并且非常不切实际。这进一步使得评估 ARIMAX 模型变得困难,因为拟合参数在每次迭代中不断变化。
我的 understanding/use ARIMAX 模型有什么不正确的地方吗?
你是对的,如果你想使用新数据进行在线预测,你将需要一遍又一遍地估计参数,这在计算上是低效的。 需要注意的一件事是,对于 ARIMA 模型,主要是模型 MA 部分的参数估计计算量很大,因为这些参数是使用数值优化估计的,而不是使用普通的最小二乘法。由于在为初始模型计算一次参数后,您就知道对未来模型的预期是什么,因为一次观察不会改变它们太多,您可以初始化参数搜索以提高计算效率。
此外,可能有一种方法可以更有效地进行估计,因为您拥有模型的旧数据和参数,您唯一要做的就是再添加一个数据点。这意味着您只需要为新数据点与所有其他数据点的组合计算 theta 和 phi 参数,而无需再次计算已知组合,这将节省大量时间。我非常喜欢这本书:Heij, Christiaan, et al.计量经济学方法在商业和经济学中的应用。牛津大学出版社,2004.
本讲座可能会让您了解这如何可行:lecture on ARIMA parameter estimation
恐怕您必须自己实施。据我所知,没有现成的方法可以做到这一点。
希望这能给你一些新的想法!
正如这个非常好的博客所建议的那样 (3 facts about time series forecasting that surprise experienced machine learning practitioners):
"You need to retrain your model every time you want to generate a new prediction",也通过例子直观的理解了为什么会出现这种情况。
这基本上突出了时间序列预测挑战是一个不断变化的问题,需要重新调整。
我一直在努力解决这个问题。幸运的是,我找到了一个非常有用的讨论。据我所知,在python中ARIMA不支持这种情况,我们需要使用SARIMAX。
可以参考link的讨论:https://github.com/statsmodels/statsmodels/issues/2788