Statsmodels - используйте обученную модель аримы для ручного прогнозирования точки путем явного предоставления значений endog для использования - PullRequest
0 голосов
/ 10 июля 2019

Я использую библиотеку statsmodels для предоставления модели ARIMAX для прогнозирования временных рядов.У меня довольно странный вопрос - как заставить обученную модель выполнить полностью ручной точечный прогноз, явно предоставив ей эндогенные и экзогенные переменные для прогнозирования?

Чтобы дать вам представление, я тренирую свою модельна ежегодных данных за 2000-2017 годы, где я прогнозирую будущую рабочую силу компании, основываясь на рабочей силе прошлых лет и куче переменных exog.Это работает хорошо.Суть в том, что в 2018 и 2019 годах компания значительно расширила число работников, и это было одноразовое деловое решение, и мы также знаем, что наша модель, прошедшая обучение в 2000-2017 годах, является «правильной» с точки зрения бизнеса.

Что я хочу сделать, так это использовать модель, которую я обучал в 2000–2017 годах, и составить прогноз на 2020 год, в то же время явно предоставив ему «фактические значения» на 2018 и 2019 годы. Таким образом, мы гарантируем, что модель не будет соответствоватьэтот разовый прыжок, снижающий его качество.Но как мне это сделать?Обратите внимание, я использую модель с AR (2) - поэтому мне нужно предоставить данные за 2 года.

Я видел какой-то метод для statsmodels, который позволил бы вам:

1)Выбранная модель ARIMAX

2) Явно передайте ей 2 значения переменных exog за предыдущие годы

3) Явно передайте ей 2 значения endog за предыдущие годы

4) Просто предоставьтепрогноз по одной точке

Оба прогнозирования и прогноз позволяют указывать только количество шагов, которые необходимо выполнить из выборочного прогноза, но не позволяютявно указать новые эндогенные значения для использования при прогнозировании

1 Ответ

1 голос
/ 11 июля 2019

В текущей версии (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))
...