Statsmodels-使用训练有素的Arima模型通过明确提供要使用的endg值来进行手动点预测

时间:2019-07-10 13:34:27

标签: python machine-learning statistics statsmodels arima

我正在使用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)仅提供单点预测

predictforecast方法都只允许您指定要从样本预测中执行的步骤数,但是它们不允许明确给出新的Endg值用于预测< / p>

1 个答案:

答案 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;