рекомендации

воскресенье, 16 июня 2019 г.

Построение эффективных моделей временных рядов с помощью Auto ARIMA в Python и R


Введение

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

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

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

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

1. Что такое временные ряды?

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

Пример 1:

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



Пример 2:

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


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

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

Существует несколько методов прогнозирования временных рядов, и мы кратко рассмотрим их в этом разделе. Подробное объяснение и коды Python для всех перечисленных ниже методов можно найти в этой статье: 7 techniques for time series forecasting (with python codes).

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



2. Простое среднее: следующее значение берется как среднее из всех предыдущих значений. Предсказания здесь лучше, чем «Наивный подход», поскольку этот метод не приводит к плоской линии, но здесь учитываются все прошлые значения, которые не всегда могут быть полезны. Например, когда вас попросят предсказать сегодняшнюю температуру, вы будете учитывать температуру за последние 7 дней, а не температуру месяца назад.



3. Скользящее среднее: это улучшение по сравнению с предыдущей техникой. Вместо того, чтобы брать среднее значение по всем предыдущим точкам, в качестве прогнозируемой величины принимается среднее значение «n» предыдущих баллов.



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



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



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



Метод Холта-Уинтерса: этот алгоритм учитывает как тренд, так и сезонность ряда. Например - количество бронирований в отеле высокое в выходные дни и низкое в будние дни и увеличивается с каждым годом; существует еженедельная сезонность и возрастающая тенденция.



ARIMA: ARIMA - очень популярная техника для моделирования временных рядов. Она описывает корреляцию между точками данных и учитывает разницу значений. Улучшение по сравнению с ARIMA - это SARIMA (или сезонная ARIMA). Мы рассмотрим ARIMA более подробно в следующем разделе.

3. Введение в ARIMA

В этом разделе мы сделаем краткое введение в ARIMA, которое поможет нам понять Auto Arima. Подробное описание Arima, параметров (p, q, d), графиков (ACF PACF) и реализации включено в эту статью: Complete tutorial to Time Series.

ARIMA - очень популярный статистический метод для прогнозирования временных рядов. ARIMA - это сокращение "Auto-Regressive Integrated Moving Averages". Модели ARIMA работают на следующих предположениях:

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

ARIMA состоит из трех компонентов - AR (авторегрессия), I (разность) и MA (скользящая средняя). Давайте разберемся с каждым из этих компонентов:

1. Термин AR относится к прошлым значениям, используемым для прогнозирования следующего значения. Термин AR определяется параметром «p» в arima. Значение «p» определяется с использованием графика ACF.
2. Термин MA используется для определения количества прошлых ошибок прогноза, используемых для прогнозирования будущих значений. Параметр «q» в ариме представляет собой МА. График PACF используется для определения правильного значения q.
3. Порядок взятия разностей определяет, сколько раз операция взятия разностей выполняется на ряде, чтобы сделать его стационарным. Такие тесты, как ADF и KPSS, могут использоваться для определения того, является ли ряд стационарным, и помогают определить значение d.


4. Пошаговая реализация ARIMA 

1. Загрузка данных: первый шаг для построения модели - это, конечно, загрузка набора данных
2. Предварительная обработка: в зависимости от набора данных будут определены этапы предварительной обработки. Они могут включать создание временных отметок, преобразование dtype столбца даты/времени, превращение ряда в одномерный и т. д.
3. Преобразование ряда в стационарный. Чтобы удовлетворить требованиям алгоритма, необходимо сделать ряд стационарным. Этот этап будет включать проверку стационарности ряда и выполнение необходимых преобразований.
4. Определение значения d: для того, чтобы сделать ряд стационарным, количество выполнений операций взятия разности будет приниматься как значение d.
5. Создание графиков ACF и PACF: это самый важный шаг в реализации ARIMA. Графики ACF и PACF используются для определения входных параметров для нашей модели ARIMA.
6. Определение значений p и q: считайте значения p и q с графиков из предыдущего шага.
7. Подгонка модели ARIMA: используя обработанные данные и значения параметров, которые мы рассчитали из предыдущих шагов, подгоняем модель ARIMA.
8. Прогнозирование значений на проверочном наборе данных: прогнозируем будущие значения.
9. Расчет среднеквадратичной ошибки: для проверки эффективности модели проверьте значение среднеквадратичной ошибки модели, используя прогнозные и фактические значения в проверочном наборе данных.

5. Почему нам нужна Auto ARIMA?

Хотя ARIMA является очень мощной моделью для прогнозирования данных временных рядов, процессы подготовки и настройки параметров в конечном итоге отнимают много времени. Перед реализацией ARIMA необходимо сделать ряд стационарным и определить значения p и q, используя графики, которые мы обсуждали выше. Auto ARIMA делает эту задачу очень простой, поскольку она устраняет шаги с 3 по 6. Ниже приведены шаги, которые вы должны выполнить для реализации Auto ARIMA:

1. Загрузка данные: этот шаг будет таким же. Загрузите данные в свой блокнот.
2. Предварительная обработка данных: ввод должен быть одномерным, поэтому отбрасываем остальные столбцы.
3. Подгонка Auto ARIMA: подгоняем модель по одномерной серии.
4. Прогнозирование значений на проверочном наборе данных: прогнозируем будущие значения.
5. Расчет среднеквадратичной ошибки: для проверки эффективности модели проверьте значение среднеквадратичной ошибки модели, используя прогнозные и фактические значения в проверочном наборе данных.

Мы полностью обошли выбор p и q, как вы можете видеть. В следующем разделе мы будем реализовывать автоматическую ARIMA, используя тестовый набор данных.

6. Реализация в Python и R

Мы будем использовать набор данных International-Air-Passenger. Этот набор данных содержит ежемесячное общее количество пассажиров (в тысячах). Имеет две колонки - месяц и количество пассажиров. Вы можете скачать набор данных по этой ссылке.

#загрузка данных
data = pd.read_csv('international-airline-passengers.csv')

#делим данные на обучающую и проверочную выборки
train = data[:int(0.7*(len(data)))]
valid = data[int(0.7*(len(data))):]

#preprocessing (так как arima принимает на вход только одномерные ряды)
train.drop('Month',axis=1,inplace=True)
valid.drop('Month',axis=1,inplace=True)

#строим график наших данных
train['International airline passengers'].plot()
valid['International airline passengers'].plot()



#строим модель
from pyramid.arima import auto_arima
model = auto_arima(train, trace=True, error_action='ignore', suppress_warnings=True)
model.fit(train)

forecast = model.predict(n_periods=len(valid))
forecast = pd.DataFrame(forecast,index = valid.index,columns=['Prediction'])

#строим прогноз для проверочной выборки
plt.plot(train, label='Train')
plt.plot(valid, label='Valid')
plt.plot(forecast, label='Prediction')
plt.show()



#Расчет среднеквадратичной ошибки
from math import sqrt
from sklearn.metrics import mean_squared_error

rms = sqrt(mean_squared_error(valid,forecast))
print(rms)

output -
76.51355764316357

Ниже код R для решения той же задачи:

# загрузка пакетов
library(forecast)
library(Metrics)

# чтение данных 
data = read.csv("international-airline-passengers.csv")

# делим данные на обучающую и проверочную выборки
train = data[1:100,]
valid = data[101:nrow(data),]

# удаляем столбец "Month"
train$Month = NULL

# обучаем модель
model = auto.arima(train)

# информация о модели
summary(model)

# прогнозирование
forecast = predict(model,44)

# оценка
rmse(valid$International.airline.passengers, forecast$pred)

7. Как Auto Arima выбирает лучшие параметры

В приведенном выше коде мы просто использовали команду .fit() для подгонки модели без необходимости выбора комбинации p, q, d. Но как модель определила наилучшее сочетание этих параметров? Auto ARIMA учитывает сгенерированные значения AIC и BIC (как вы можете видеть в коде), чтобы определить наилучшую комбинацию параметров. Значения AIC (Akaike Information Criterion) и BIC (Bayesian Information Criterion) являются оценками для сравнения моделей. Чем ниже эти значения, тем лучше модель.

Проверьте эти ссылки, если вас интересует математическое описание AIC и BIC.

8. Заключение

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

2 комментария:

  1. По ссылке нету набора данных International-Air-Passenger. Могли бы прикрепить этот файл? Спасибо

    ОтветитьУдалить
    Ответы
    1. Можете скачать его здесь:
      https://disk.yandex.ru/i/ugWX6L3ckG0hhA

      Удалить