Прогнозирование временных рядов

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

Нежное введение в 14 классических методов прогнозирования и их реализацию на Python

Фон

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

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

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

1. Одномерное прогнозирование временных рядов
1.1. Авторегрессия
1.2. Скользящее среднее
1.3. Авторегрессионное скользящее среднее
1.4. Интегрированное скользящее среднее с авторегрессией
1.5. Интегрированное скользящее среднее по сезонной авторегрессии
2. Многомерное прогнозирование временных рядов
2.1. Векторная авторегрессия
2.2. Векторное скользящее среднее
2.3. Скользящее среднее векторной авторегрессии
3. Прогнозирование временных рядов с использованием экзогенных переменных
3.1. SARIMA с экзогенными переменными
3.2. Скользящее среднее векторной авторегрессии с экзогенными регрессорами
4. Прогнозирование временных рядов с помощью методов сглаживания
4.1. Сглаживание скользящей средней
4.2. Однократное экспоненциальное сглаживание
4.3. Двойное экспоненциальное сглаживание
4.4. Тройное экспоненциальное сглаживание

Одномерное прогнозирование временных рядов

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

Авторегрессия (AR)

Авторегрессия моделирует выход (значение на следующем шаге) на основе линейной комбинации входных переменных (значений на предыдущих временных шагах). Например, в линейной регрессии y-hat - это прогноз, β ₀ и β ₁ - это коэффициенты, рассчитанные моделью на основе данных обучения, а X - входное значение.

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

«P» - параметр авторегрессионного тренда, идеальное значение для p может быть определено из графика автокорреляции.

Этот метод подходит для временных рядов без трендовых и сезонных составляющих.

Реализация Python - AR

# Import libraries
from statsmodels.tsa.ar_model import AutoReg
from random import random
# Generate a sample dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = AutoReg(data, lags=1)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)

Скользящая средняя (MA)

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

residual error = observed — predicted

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

«Q» - параметр тенденции скользящего среднего, идеальное значение для q можно определить из графика частичной автокорреляции.

Этот метод подходит для временных рядов без трендовых и сезонных составляющих.

Реализация Python - MA

# Import libraries
from statsmodels.tsa.arima_model import ARMA
from random import random
# Generate a sample dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ARMA(data, order=(0, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)

Авторегрессионное скользящее среднее (ARMA)

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

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

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

Этот метод подходит для временных рядов без трендовых и сезонных составляющих.

Реализация Python - ARMA

# Import libraries
from statsmodels.tsa.arima_model import ARMA
from random import random
# Generate a sample dataset
data = [random() for x in range(1, 100)]
# fit model
model = ARMA(data, order=(2, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)

Авторегрессионная интегрированная скользящая средняя (ARIMA)

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

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

Теперь у нас есть метод, который сочетает в себе модели авторегрессии (AR) и скользящего среднего (MA), а также этап предварительной обработки разности, чтобы сделать последовательность стационарной, называемую интегрированием (I).

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

Метод подходит для временных рядов с трендом и без сезонных составляющих.

Реализация Python - ARIMA

# Import libraries
from statsmodels.tsa.arima_model import ARIMA
from random import random
# Generate a sample dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ARIMA(data, order=(1, 1, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.predict(len(data), len(data), typ='levels')
print(yhat)

Сезонная авторегрессионная интегрированная скользящая средняя (SARIMA)

Этот метод является расширением модели ARIMA для работы с сезонными данными. Он моделирует сезонную и несезонную составляющие ряда отдельно.

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

Несезонные параметры такие же, как ARIMA

p: порядок авторегрессии
d: порядок разности
q: порядок скользящего среднего

Сезонные параметры

P: порядок сезонной авторегрессии
D: порядок сезонной разницы
Q: порядок сезонного скользящего среднего
m: количество временных шагов для одного сезонного периода

Этот метод подходит для временных рядов с трендовой и / или сезонной составляющими.

Реализация Python - SARIMA

# Import libraries
from statsmodels.tsa.statespace.sarimax import SARIMAX
from random import random
# Generate a sample dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = SARIMAX(data, order=(1, 1, 1), seasonal_order=(1, 1, 1, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)

Многомерное прогнозирование временных рядов

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

Векторная авторегрессия (VAR)

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

При использовании VAR для прогнозирования необходимо принять два решения, а именно, сколько переменных (K) и сколько лагов (p) следует включить в систему.

Количество коэффициентов, которые необходимо оценить в VAR, равно K + pK² (или 1 + pK на уравнение). Например, для VAR с K = 5 переменными и p = 2 лагами на уравнение приходится 11 коэффициентов, что дает в общей сложности 55 коэффициентов, которые необходимо оценить. Чем больше коэффициентов необходимо оценить, тем больше ошибка оценки.

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

Реализация Python - VAR

# Import libraries
from statsmodels.tsa.vector_ar.var_model import VAR
from random import random
# Generate a sample dataset with correlated variables
data = list()
for i in range(100):
    v1 = i + random()
    v2 = v1 + random()
    row = [v1, v2]
    data.append(row)
# fit model
model = VAR(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.forecast(model_fit.y, steps=1)
print(yhat)

VAR также может быть реализован с помощью функции VARMAX в Statsmodels, которая позволяет оценивать модели VAR, VMA, VARMA и VARMAX через аргумент порядка.

Векторное скользящее среднее (VMA)

Это обобщенная версия модели скользящего среднего для прогнозирования нескольких параллельных стационарных временных рядов.

Реализация Python - VMA

# Import libraries
from statsmodels.tsa.statespace.varmax import VARMAX
from random import random
# Generate a sample dataset with correlated variables
data = list()
for i in range(100):
    v1 = i+ random()
    v2 = v1 + random()
    row = [v1, v2]
    data.append(row)
# fit VMA model by setting the ‘p’ parameter as 0.
model = VARMAX(data, order=(0, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.forecast()
print(yhat)

Скользящее среднее векторной авторегрессии (VARMA)

Это комбинация VAR и VMA и обобщенная версия модели ARMA для прогнозирования нескольких параллельных стационарных временных рядов.

Для этого метода требуются параметры «p» и «q», а также он может действовать как модель VAR, задав для параметра «q» значение 0, и как модель VMA, задав для параметра «p» значение 0.

Реализация Python - VARMA

# Import libraries
from statsmodels.tsa.statespace.varmax import VARMAX
from random import random
# Generate a sample dataset with correlated variables
data = list()
for i in range(100):
    v1 = random()
    v2 = v1 + random()
    row = [v1, v2]
    data.append(row)
# fit model
model = VARMAX(data, order=(1, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.forecast()
print(yhat)

Прогнозирование временных рядов с использованием экзогенных переменных

SARIMA с экзогенными переменными (SARIMAX)

Интегрированная сезонная авторегрессионная скользящая средняя с экзогенными регрессорами (SARIMAX) является расширением модели SARIMA, которая также включает моделирование экзогенных переменных.

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

Экзогенная переменная - это переменная, значение которой определяется вне модели и накладывается на нее. Здесь X - экзогенная переменная

Эндогенная переменная - это переменная, значение которой определяется моделью. Здесь основной прогнозируемый ряд является эндогенной переменной.

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

Этот метод подходит для одномерных временных рядов с трендами и / или сезонными компонентами и экзогенными переменными.

Реализация Python - SARIMAX

# Import libraries
from statsmodels.tsa.statespace.sarimax import SARIMAX
from random import random
# Generate a sample dataset with independent exogenous variable
data1 = [x + random() for x in range(1, 100)]
data2 = [x + random() for x in range(101, 200)]
# fit model
model = SARIMAX(data1, exog=data2, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))
model_fit = model.fit(disp=False)
# make prediction
exog2 = [200 + random()]
yhat = model_fit.predict(len(data1), len(data1), exog=[exog2])
print(yhat)

Метод SARIMAX также можно использовать для моделирования других вариаций с экзогенными переменными, такими как ARX, MAX, ARMAX и ARIMAX, путем включения экзогенной переменной.

Скользящее среднее векторной авторегрессии с экзогенными регрессорами (VARMAX)

Этот метод является расширением модели VARMA, которая также включает моделирование экзогенных переменных. Это многовариантная версия метода ARMAX.

Этот метод подходит для многомерных временных рядов без тренда и сезонных компонентов с экзогенными переменными.

Реализация Python - VARMAX

# Import libraries
from statsmodels.tsa.statespace.varmax import VARMAX
from random import random
# Generate a sample dataset with correlated multiple time series and an independent exogenous variable
data = list()
for i in range(100):
    v1 = random()
    v2 = v1 + random()
    row = [v1, v2]
    data.append(row)
data_exog = [x + random() for x in range(100)]
# fit model
model = VARMAX(data, exog=data_exog, order=(1, 1))
model_fit = model.fit(disp=False)
# make prediction
data_exog2 = [[100]]
yhat = model_fit.forecast(exog=data_exog2)
print(yhat)

Прогнозирование временных рядов со сглаживанием скользящих средних

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

Как правило, используются два типа скользящих средних:

Центрированная скользящая средняя

Значение в момент времени (t) рассчитывается как среднее значение тока до и после времени (t). Например, центрированная скользящая средняя с шириной окна 3:

centered_ma(t) = mean(obs(t+1), obs(t), obs(t-1))

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

Скользящая средняя

Значение в момент времени (t) рассчитывается как среднее значение тока до момента времени (t). Например, скользящая средняя с шириной окна 3:

trail_ma(t) = mean(obs(t), obs(t-1), obs(t-2))

Для прогнозирования будущего скользящие средние используют только текущие и исторические наблюдения.

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

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

Прогнозирование временных рядов с экспоненциальным сглаживанием

Экспоненциальное сглаживание - это метод прогнозирования временных рядов для одномерных данных. Это близкая альтернатива популярному классу методов Box-Jenkins ARIMA.

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

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

Единичное экспоненциальное сглаживание

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

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

Реализация Python - SES

# Import libraries
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
from random import random
# Generate a sample dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = SimpleExpSmoothing(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)

Двойное экспоненциальное сглаживание

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

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

Эти методы имеют тенденцию к завышению прогнозов, особенно для более длинных горизонтов прогнозов. Мотивированные этим наблюдением, Гарднер и Маккензи (1985) ввели параметр, который «ослабляет» тренд до плоской линии когда-нибудь в будущем.

Следовательно, в сочетании с параметрами сглаживания α и β (со значениями от 0 до 1) этот метод также включает параметр затухания ϕ, который также находится в диапазоне от 0 до 1.

Реализация Python - двойное экспоненциальное сглаживание

# Import libraries
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from random import random
# Generate a sample dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ExponentialSmoothing(data,trend='add', seasonal=None, damped=True)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)

Тройное экспоненциальное сглаживание

Тройное экспоненциальное сглаживание - наиболее продвинутая разновидность в семействе, этот метод также известен как экспоненциальное сглаживание Холта-Винтерса по имени двух участников этого метода: Чарльза Холта и Питера Винтерса.

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

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

Реализация Python - экспоненциальное сглаживание Холта-Винтерса

# Import libraries
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from random import random
# Generate a sample dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ExponentialSmoothing(data,trend="add", seasonal="add", seasonal_periods=12, damped=True)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)

Резюме

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

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

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

использованная литература

[1] Галит Шмуэли и Кеннет Лихтендаль, Практическое прогнозирование временных рядов с помощью R: Практическое руководство, 2016 г.

[2] Джейсон Браунли, https://machinelearningmastery.com/

[3] https://scikitlearn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html

[4] https://www.statsmodels.org/stable/user-guide.html#time-series-analysis