我正在使用statsmodels库提供ARIMAX模型来预测时间序列。我有一个很奇怪的问题-如何通过明确为模型提供Endg和Exog变量来强制训练模型执行完全手动的点预测?
为了给您一个想法,我在2000-2017年的年度数据上训练了我的模型,在此模型中,我根据前几年的劳动力和大量exog变量预测了公司的未来劳动力。它运作良好。问题是,在2018年和2019年,公司极大地增加了工人数量,这是一次性的业务决定,而且我们还知道,从业务角度来看,我们在2000-2017年训练的模型是“正确的”。
我想做的是使用我在2000-2017年训练的模型,并提供2020年的预测,同时明确为其提供2018年和2019年的“实际值”。这样我们可以确保模型不会尝试适合此一次性跳跃,降低其质量。但是我该怎么办呢?请注意,我将模型与AR(2)一起使用-因此我需要提供前2年的数据。
我已经看到了一些用于statsmodels的方法,该方法可以让您:
1)选择训练有素的ARIMAX模型
2)明确为其提供exog变量的前两年值
3)明确为其提供前2年的Endg值
4)仅提供单点预测
predict和forecast方法都只允许您指定要从样本预测中执行的步骤数,但是它们不允许明确给出新的Endg值用于预测< / p>
答案 0 :(得分:1)
在当前发布的版本(v0.10)中,您需要执行以下操作(请注意,要使其正常工作,您必须使用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))
模型):
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))
NB:我们最近添加了一个新功能,使这种事情变得更容易,该功能可在Github主存储库中使用,并将在v0.11中发布(尽管该版本尚无时间表),在这里您可以而是:
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"));
String result = "";
String line ="";
while((line = bufferedReader.readLine())!= null){
result += line;
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return result;