我正在使用 statsmodels 库来提供用于预测时间序列的 ARIMAX 模型。我有一个相当奇怪的问题 - 如何通过显式提供用于预测的 endog 和 exog 变量来强制训练模型执行完全手动的点预测?
为了给您一个想法,我根据 2000-2017 年的年度数据训练我的模型,其中我根据前几年的劳动力和一堆 exog 变量预测公司未来的劳动力。效果很好。问题是,在 2018 年和 2019 年,公司大幅扩大了员工数量,这是一次性的商业决策,而且我们也知道,从商业角度来看,我们在 2000-2017 年训练的模型是“正确的”。
我想要做的是使用我在 2000-2017 年训练的模型,并提供 2020 年的预测,同时明确提供 2018 年和 2019 年的“实际值”。这样我们可以确保模型不会尝试适应这个一次性跳跃会降低其质量。但我该怎么做呢?请注意,我使用 AR(2) 模型 - 所以我需要提供前 2 年的数据。
我已经看到了一些统计模型的方法,它可以让你:
1)选择经过训练的 ARIMAX 模型
2)明确给出前 2 年的 exog 变量值
3)明确给出前 2 年的 endog 值
4) 只需提供单点预测
在当前发布的版本 (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))
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))
我尝试了上述方法,但是,我有二进制(0/1)的外生变量。当所有外生变量的值为 0 时,预测似乎是正确的,但当某些外生变量的值为 1(t-1 为 0)时,预测似乎是错误的。有什么想法可能会出现问题吗?