Statsmodels ARIMA - разные результаты с использованием predic () и прогноз ()

Я бы использовал (Statsmodels) ARIMA для прогнозирования значений из ряда:

plt.plot(ind, final_results.predict(start=0 ,end=26))
plt.plot(ind, forecast.values)
plt.show()

Я предполагал, что получу те же результаты на этих двух графиках, но вместо этого получил следующее: введите описание изображения здесь

Я бы знал, относится ли проблема к предсказанию или прогнозу


person Simone    schedule 09.08.2017    source источник
comment
как statsmodel документация предлагает, predict используется для прогнозов внутри выборки, а forecast - только для прогнозов вне выборки. прогнозировать / a>, прогноз   -  person Ehsan Tabatabaei    schedule 11.01.2021


Ответы (2)


На диаграмме это выглядит так, как будто вы делаете прогнозы вне выборки с 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

Продолжая ответ noteven2degrees, я отправил запрос на перенос для исправления в методе B с history_f.append(yhat_p) на history_p.append(yhat_p).

Кроме того, как было предложено noteven2degrees, в отличие от forecast(), predict() требует аргумента typ='levels' для вывода прогноза вместо прогноза с разницей.

После двух вышеуказанных изменений метод B дает тот же результат, что и метод C, тогда как метод C занимает гораздо меньше времени, что разумно. И оба сходятся к тренду, поскольку я думаю, это связано со стационарностью самой модели.

Независимо от того, в каком методе forecast() и predict() дают одинаковый результат с любыми конфигурациями p, d, q.

person Raymond Kwok    schedule 15.02.2019