python - Statsmodels - 通过显式提供要使用的 endog 值,使用训练有素的 arima 模型进行手动点预测

标签 python machine-learning statistics statsmodels arima

我正在使用 statsmodels 库来提供用于预测时间序列的 ARIMAX 模型。我有一个相当奇怪的问题 - 如何通过显式提供用于预测的 endog 和 exog 变量来强制训练模型执行完全手动的点预测?

为了给您一个想法,我根据 2000-2017 年的年度数据训练了我的模型,其中我根据前几年的劳动力和一堆 exog 变量预测了公司 future 的劳动力。效果很好。问题是,在 2018 年和 2019 年,公司大幅扩大了员工数量,这是一次性的商业决策,而且我们也知道,从商业角度来看,我们在 2000-2017 年训练的模型是“正确的”。

我想要做的是使用我在 2000-2017 年训练的模型,并提供 2020 年的预测,同时明确提供 2018 年和 2019 年的“实际值”。这样我们就可以确保模型不会尝试适应这种一次性跳跃会降低其质量。但我该怎么做呢?请注意,我使用 AR(2) 模型 - 因此我需要提供前 2 年的数据。

我已经看到了一些 statsmodels 方法,它可以让你:

1) 选择经过训练的 ARIMAX 模型

2) 明确给出 exog 变量前 2 年的值

3) 明确给出前 2 年的 endog 值

4) 只需提供单点预测

两者predictforecast方法允许您仅指定提供样本外预测的步骤数,但它们不允许显式给出用于预测的新 endog 值

最佳答案

在当前发布的版本 (v0.10) 中,您可能需要执行类似以下操作(请注意,要实现此操作,您必须使用 sm.tsa.SARIMAX 模型,而不是例如sm.tsa.ARIMA 模型):

training_endog = endog.loc[:'2017']
training_exog = exog.loc[:'2017']

training_mod = sm.tsa.SARIMAX(training_endog, order=(2, 0, 0), exog=training_exog)
training_res = training_mod.fit()

mod = sm.tsa.SARIMAX(endog, order=(2, 0, 0), exog=exog)
res = mod.smooth(training_res.params)
print(res.forecast(1, exog=exog_fcast))

注意:我们最近添加了一项新功能,使此类事情变得更容易,该功能可在 Github 主存储库中使用,并将在 v0.11 中发布(但尚未发布此版本的时间表),您可以在其中相反,做:

training_endog = endog.loc[:'2017']
training_exog = exog.loc[:'2017']

training_mod = sm.tsa.SARIMAX(training_endog, order=(2, 0, 0), exog=training_exog)
training_res = training_mod.fit()

res = training_res.append(endog.loc['2018':], exog=exog.loc['2018':])
print(res.forecast(1, exog=exog_fcast))

关于python - Statsmodels - 通过显式提供要使用的 endog 值,使用训练有素的 arima 模型进行手动点预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56971901/

相关文章:

python - 添加反斜杠而不转义

python - 选择汉明距离为零的读数

Java-ml 聚类距质心的距离

Python - 使用子进程获取和设置剪贴板数据

python - 固定长度整数分区的唯一排列,其中每个元素都有一个最大值

r - 使用 Sparklyr 的 FPGrowth/关联规则

machine-learning - 为什么在决策树中使用交叉熵而不是0/1损失

pandas - Pandas 数据框python中的偏相关系数

python - 如何在 python 中应用梯度函数?

algorithm - 快速搜索平均变量列表