我在使用statsmodels库来构建一个用于时间序列预测的ARIMAX模型。我有一个比较奇怪的问题 – 如何强制训练好的模型进行完全手动的点预测,通过明确提供endog和exog变量来进行预测?
为了给您一个概念,我使用2000年至2017年的年度数据来训练我的模型,预测公司未来的人力资源,基于前几年的劳动力数据和一系列的exog变量。这运作得很好。问题在于,2018年和2019年公司大幅增加了员工数量,这是一个一次性的商业决策,而且我们也知道基于2000年至2017年训练的模型从商业角度来看是“正确”的。
我想做的是使用基于2000年至2017年训练的模型,为2020年提供预测,同时明确提供2018年和2019年的“实际值”。这样我们可以确保模型不会尝试去拟合这个一次性的跳跃,从而降低其质量。但我该怎么做呢?请注意,我使用的是AR(2)模型 – 所以我需要提供前两年的数据。
我看到了一些statsmodels的方法,可以让您做到以下几点:
1) 选择训练好的ARIMAX模型
2) 明确提供前两年的exog变量值
3) 明确提供前两年的endog值
4) 只提供一个点预测
predict和forecast方法都允许您指定要预测的步数,但它们不允许明确提供新的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))