www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Как создать модель ARIMA для прогнозирования временных рядов в Python

Дата публикации 2017-01-09

Популярным и широко используемым статистическим методом для прогнозирования временных рядов является модель ARIMA.

ARIMA - это аббревиатура от AutoRegressive Integrated Moving Average. Это класс модели, который фиксирует набор различных стандартных временных структур в данных временных рядов.

В этом руководстве вы узнаете, как разработать модель ARIMA для данных временных рядов с помощью Python.

После завершения этого урока вы узнаете:

  • О модели ARIMA используемые параметры и предположения, сделанные моделью.
  • Как приспособить модель ARIMA к данным и использовать ее для составления прогнозов.
  • Как настроить модель ARIMA для вашей задачи временных рядов.

Давайте начнем.

Модель авторегрессии с интегрированным скользящим средним

Модель ARIMAкласс статистических моделей для анализа и прогнозирования данных временных рядов.

Он явно обслуживает набор стандартных структур данных временных рядов и, как таковой, предоставляет простой, но мощный метод для создания искусных прогнозов временных рядов.

ARIMA - это аббревиатура от AutoRegressive Integrated Moving Average. Это обобщение более простой авторегрессионной скользящей средней и добавляет понятие интеграции.

Эта аббревиатура носит описательный характер и отражает ключевые аспекты самой модели. Вкратце, это:

  • Арканзас:авторегрессии, Модель, которая использует зависимую связь между наблюдением и некоторым количеством запаздывающих наблюдений.
  • я:интегрированный, Использование разности необработанных наблюдений (например, вычитание наблюдения из наблюдения на предыдущем временном шаге) для того, чтобы сделать временной ряд стационарным.
  • Массачусетс:Скользящая средняя, Модель, которая использует зависимость между наблюдением и остаточной ошибкой от модели скользящего среднего, примененной к лаговым наблюдениям.

Каждый из этих компонентов явно указан в модели в качестве параметра. Используется стандартное обозначение ARIMA (p, d, q), где параметры заменяются целочисленными значениями для быстрого указания конкретной используемой модели ARIMA.

Параметры модели ARIMA определяются следующим образом:

  • п: Число наблюдений отставания, включенных в модель, также называемое порядком отставания.
  • d: Количество раз, когда исходные наблюдения различаются, также называется степенью различия.
  • Q: Размер окна скользящей средней, также называемый порядком скользящей средней.

Построена модель линейной регрессии, включающая определенное количество и тип терминов, и данные подготавливаются по степени разности, чтобы сделать ее стационарной, то есть удалить трендовые и сезонные структуры, которые негативно влияют на модель регрессии.

Значение 0 может быть использовано для параметра, который указывает, что этот элемент модели не используется. Таким образом, модель ARIMA может быть сконфигурирована для выполнения функции модели ARMA и даже простой модели AR, I или MA.

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

Далее, давайте посмотрим, как мы можем использовать модель ARIMA в Python. Начнем с загрузки простого одномерного временного ряда.

Набор данных по продажам шампуня

Этот набор данных описывает ежемесячное количество продаж шампуня за 3-летний период.

Единицами являются количество продаж и 36 наблюдений. Оригинальный набор данных приписан Макридакису, Уилрайту и Хиндману (1998).

Узнайте больше о наборе данных и загрузите его отсюда,

Загрузите набор данных и поместите его в текущий рабочий каталог с именем файла «Шампунь-sales.csv«.

Ниже приведен пример загрузки набора данных Shampoo Sales с помощью Pandas с пользовательской функцией для анализа поля даты и времени. Набор данных базируется в произвольном году, в данном случае 1900.

from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot

def parser(x):
	return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
print(series.head())
series.plot()
pyplot.show()

При выполнении примера печатаются первые 5 строк набора данных.

Month
1901-01-01 266.0
1901-02-01 145.9
1901-03-01 183.1
1901-04-01 119.3
1901-05-01 180.3
Name: Sales, dtype: float64

Данные также представлены в виде временного ряда с месяцем по оси X и показателями продаж по оси Y.

Мы видим, что набор данных по продажам шампуней имеет четкую тенденцию.

Это говорит о том, что временной ряд не является стационарным и потребует разности, чтобы сделать его стационарным, по крайней мере, с разницей порядка 1.

Давайте также кратко рассмотрим график автокорреляции временных рядов. Это также встроено в Панд. В приведенном ниже примере показана автокорреляция для большого числа лагов во временном ряду.

from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
from pandas.tools.plotting import autocorrelation_plot

def parser(x):
	return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
autocorrelation_plot(series)
pyplot.show()

Приведя пример, мы можем видеть, что существует положительная корреляция с первыми 10–12 лагами, которая, возможно, значима для первых 5 лагов.

Хорошей отправной точкой для параметра AR модели может быть 5.

Арима с питоном

Библиотека statsmodels предоставляет возможность соответствовать модели ARIMA

Модель ARIMA может быть создана с использованием библиотеки statsmodels следующим образом:

  1. Определите модель, позвонивАРИМА ()и проходя вп,d, а такжеQпараметры.
  2. Модель подготовлена ​​по данным обучения, позвонивпоместиться()функция.
  3. Прогнозы можно сделать, позвонивпредсказать, ()функция и указание индекса времени или времени, которые будут предсказаны.

Давайте начнем с чего-то простого. Мы подгоним модель ARIMA ко всему набору данных Shampoo Sales и рассмотрим остаточные ошибки.

Сначала мы подходим к модели ARIMA (5,1,0). Это устанавливает значение задержки равным 5 для авторегрессии, использует порядок разности 1, чтобы сделать временной ряд стационарным, и использует модель скользящего среднего 0.

При подгонке модели предоставляется много отладочной информации о подгонке модели линейной регрессии. Мы можем отключить это, установивИндик.точкиаргумент 0.

from pandas import read_csv
from pandas import datetime
from pandas import DataFrame
from statsmodels.tsa.arima_model import ARIMA
from matplotlib import pyplot

def parser(x):
	return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
# fit model
model = ARIMA(series, order=(5,1,0))
model_fit = model.fit(disp=0)
print(model_fit.summary())
# plot residual errors
residuals = DataFrame(model_fit.resid)
residuals.plot()
pyplot.show()
residuals.plot(kind='kde')
pyplot.show()
print(residuals.describe())

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

ARIMA Model Results
==============================================================================
Dep. Variable:                D.Sales   No. Observations:                   35
Model:                 ARIMA(5, 1, 0)   Log Likelihood                -196.170
Method:                       css-mle   S.D. of innovations             64.241
Date:                Mon, 12 Dec 2016   AIC                            406.340
Time:                        11:09:13   BIC                            417.227
Sample:                    02-01-1901   HQIC                           410.098
                         - 12-01-1903
=================================================================================
                    coef    std err          z      P>|z|      [95.0% Conf. Int.]
---------------------------------------------------------------------------------
const            12.0649      3.652      3.304      0.003         4.908    19.222
ar.L1.D.Sales    -1.1082      0.183     -6.063      0.000        -1.466    -0.750
ar.L2.D.Sales    -0.6203      0.282     -2.203      0.036        -1.172    -0.068
ar.L3.D.Sales    -0.3606      0.295     -1.222      0.231        -0.939     0.218
ar.L4.D.Sales    -0.1252      0.280     -0.447      0.658        -0.674     0.424
ar.L5.D.Sales     0.1289      0.191      0.673      0.506        -0.246     0.504
                                    Roots
=============================================================================
                 Real           Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1           -1.0617           -0.5064j            1.1763           -0.4292
AR.2           -1.0617           +0.5064j            1.1763            0.4292
AR.3            0.0816           -1.3804j            1.3828           -0.2406
AR.4            0.0816           +1.3804j            1.3828            0.2406
AR.5            2.9315           -0.0000j            2.9315           -0.0000
-----------------------------------------------------------------------------

Во-первых, мы получаем линейный график остаточных ошибок, предполагая, что все еще может быть некоторая информация о тренде, не уловленная моделью.

Затем мы получаем график плотности значений остаточных ошибок, предполагая, что ошибки являются гауссовыми, но могут не центрироваться на нуле.

Распределение остаточных ошибок отображается. Результаты показывают, что в прогнозе действительно есть смещение (ненулевое среднее в невязках).

count   35.000000
mean    -5.495213
std     68.132882
min   -133.296597
25%    -42.477935
50%     -7.186584
75%     24.748357
max    133.237980

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

Далее, давайте посмотрим, как мы можем использовать модель ARIMA для составления прогнозов.

Скользящий прогноз Модель ARIMA

Модель ARIMA может использоваться для прогнозирования будущих временных шагов.

Мы можем использовать функцию предиката () наARIMAResultsобъект, чтобы делать прогнозы. Он принимает индекс временных шагов, чтобы делать прогнозы в качестве аргументов. Эти индексы относятся к началу набора обучающих данных, используемого для прогнозирования.

Если бы мы использовали 100 наблюдений в обучающем наборе данных, чтобы соответствовать модели, тогда индекс следующего временного шага для прогнозирования был бы указан для функции прогнозирования какначало = 101, конец = 101, Это вернет массив с одним элементом, содержащим прогноз.

Мы также предпочли бы, чтобы прогнозируемые значения находились в исходной шкале, если мы выполнили какое-либо различие (д & при 0при настройке модели). Это можно указать, установивтиповоеаргумент к значению«уровни»:станд =»уровни,

Кроме того, мы можем избежать всех этих спецификаций, используяпрогноз()функция, которая выполняет одношаговый прогноз с использованием модели.

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

Скользящий прогноз требуется с учетом зависимости от наблюдений в предыдущих временных шагах для разности и модели AR. Грубый способ выполнить этот скользящий прогноз состоит в том, чтобы заново создать модель ARIMA после получения каждого нового наблюдения.

Мы вручную отслеживаем все наблюдения в списке, называемом историей, который заполняется данными обучения и к которому добавляются новые наблюдения на каждой итерации.

Сложив все это вместе, ниже приведен пример скользящего прогноза с моделью ARIMA в Python.

from pandas import read_csv
from pandas import datetime
from matplotlib import pyplot
from statsmodels.tsa.arima_model import ARIMA
from sklearn.metrics import mean_squared_error

def parser(x):
	return datetime.strptime('190'+x, '%Y-%m')

series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
X = series.values
size = int(len(X) * 0.66)
train, test = X[0:size], X[size:len(X)]
history = [x for x in train]
predictions = list()
for t in range(len(test)):
	model = ARIMA(history, order=(5,1,0))
	model_fit = model.fit(disp=0)
	output = model_fit.forecast()
	yhat = output[0]
	predictions.append(yhat)
	obs = test[t]
	history.append(obs)
	print('predicted=%f, expected=%f' % (yhat, obs))
error = mean_squared_error(test, predictions)
print('Test MSE: %.3f' % error)
# plot
pyplot.plot(test)
pyplot.plot(predictions, color='red')
pyplot.show()

Выполнение примера выводит прогноз и ожидаемое значение для каждой итерации.

Мы также можем рассчитать окончательный среднеквадратичный показатель ошибки (MSE) для прогнозов, предоставляя точку сравнения для других конфигураций ARIMA.

predicted=349.117688, expected=342.300000
predicted=306.512968, expected=339.700000
predicted=387.376422, expected=440.400000
predicted=348.154111, expected=315.900000
predicted=386.308808, expected=439.300000
predicted=356.081996, expected=401.300000
predicted=446.379501, expected=437.400000
predicted=394.737286, expected=575.500000
predicted=434.915566, expected=407.600000
predicted=507.923407, expected=682.000000
predicted=435.483082, expected=475.300000
predicted=652.743772, expected=581.300000
predicted=546.343485, expected=646.900000
Test MSE: 6958.325

Создается линейный график, показывающий ожидаемые значения (синим цветом) по сравнению с прогнозами скользящего прогноза (красным). Мы можем видеть, что значения показывают некоторую тенденцию и находятся в правильном масштабе.

Модель может использовать дальнейшую настройку параметров p, d и, возможно, даже q.

Конфигурирование модели ARIMA

Классический подход к подгонке модели ARIMA - следоватьМетодика Бокса-Дженкинса,

Это процесс, который использует анализ и диагностику временных рядов для определения хороших параметров модели ARIMA.

Таким образом, шаги этого процесса заключаются в следующем:

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

Процесс повторяется до тех пор, пока не будет достигнут желаемый уровень соответствия для наблюдений в выборке или вне выборки (например, наборы обучающих или тестовых данных)

Процесс описан в классическом учебнике 1970 года по темеАнализ временных рядов: прогнозирование и контрольДжордж Бокс и Гвилим Дженкинс. Обновленное 5-е издание теперь доступно, если вы хотите углубиться в этот тип модели и методологии.

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

Резюме

В этом руководстве вы узнали, как разработать модель ARIMA для прогнозирования временных рядов в Python.

В частности, вы узнали:

  • О модели ARIMA, о том, как ее можно настроить, и предположениях, сделанных моделью.
  • Как выполнить быстрый анализ временных рядов с использованием модели ARIMA.
  • Как использовать модель ARIMA для прогнозирования из выборочных прогнозов.

У вас есть вопросы об ARIMA или об этом уроке?
Задайте свои вопросы в комментариях ниже, и я сделаю все возможное, чтобы ответить.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map