На диаграмме это выглядит так, как будто вы делаете прогнозы вне выборки с forecast()
, битовые прогнозы в выборке с предсказанием. Исходя из природы уравнений ARIMA, прогнозы вне выборки имеют тенденцию сходиться к выборочному среднему для длительных периодов прогнозирования.
Чтобы выяснить, как forecast()
и predict()
работают для разных сценариев, я систематически сравнивал различные модели в классе ARIMA_results
. Не стесняйтесь воспроизвести сравнение с statsmodels_arima_comparison.py
в этом репозитории. Я изучил каждую комбинацию order=(p,d,q)
, ограничивая p, d, q
только 0 или 1. Например, простую модель авторегрессии можно получить с order=(1,0,0)
. Вкратце, я рассмотрел три варианта, используя следующие (стационарные) временные ряды:
A. Итеративное прогнозирование по выборке формирует историю. История была сформирована из первых 80% временного ряда, а набор тестов - из последних 20%. Затем я спрогнозировал первую точку набора тестов, добавил истинное значение к истории, спрогнозировал вторую точку и т. Д. Это должно дать оценку качества предсказания модели.
for t in range(len(test)):
model = ARIMA(history, order=order)
model_fit = model.fit(disp=-1)
yhat_f = model_fit.forecast()[0][0]
yhat_p = model_fit.predict(start=len(history), end=len(history))[0]
predictions_f.append(yhat_f)
predictions_p.append(yhat_p)
history.append(test[t])
Б. Затем я изучил прогнозирование вне выборки путем итеративного прогнозирования следующей точки серии тестов и добавления этого прогноза в историю.
for t in range(len(test)):
model_f = ARIMA(history_f, order=order)
model_p = ARIMA(history_p, order=order)
model_fit_f = model_f.fit(disp=-1)
model_fit_p = model_p.fit(disp=-1)
yhat_f = model_fit_f.forecast()[0][0]
yhat_p = model_fit_p.predict(start=len(history_p), end=len(history_p))[0]
predictions_f.append(yhat_f)
predictions_p.append(yhat_p)
history_f.append(yhat_f)
history_f.append(yhat_p)
C. Я использовал параметр forecast(step=n)
и параметры predict(start, end)
, чтобы выполнять внутреннее многоступенчатое прогнозирование с помощью этих методов.
model = ARIMA(history, order=order)
model_fit = model.fit(disp=-1)
predictions_f_ms = model_fit.forecast(steps=len(test))[0]
predictions_p_ms = model_fit.predict(start=len(history), end=len(history)+len(test)-1)
Оказалось, что:
A. Прогноз и прогноз дают идентичные результаты для AR, но разные результаты для ARMA: график временных рядов теста а>
Б. Прогноз и прогноз дают разные результаты как для AR, так и для ARMA: график временных рядов тестов
C. Прогноз и прогноз дают идентичные результаты для AR, но разные результаты для ARMA: график временных рядов теста а>
Далее, сравнивая кажущиеся идентичными подходы в B. и C., я обнаружил тонкие, но видимые различия в результатах.
Я полагаю, что различия возникают в основном из-за того, что «прогнозирование выполняется на уровнях исходной эндогенной переменной» в forecast()
и predict()
дает прогноз различий в уровнях (сравните справочник по API).
Кроме того, учитывая, что я больше доверяю внутренней функциональности функций statsmodels, чем моему простому циклу итеративного прогнозирования (это субъективно), я бы рекомендовал использовать forecast(step)
или predict(start, end)
.
person
noteven2degrees
schedule
16.02.2018
statsmodel
документация предлагает,predict
используется для прогнозов внутри выборки, аforecast
- только для прогнозов вне выборки. прогнозировать / a>, прогноз - person Ehsan Tabatabaei   schedule 11.01.2021