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

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

Что такое анализ временных рядов?

Анализ временных рядов — это процесс извлечения полезной информации из данных временных рядов для прогнозирования и извлечения из них сведений. Он состоит из ряда данных, которые меняются со временем, следовательно, являются непрерывными и непостоянными по своей природе. Оно может варьироваться от часов до минут и даже секунд (от миллисекунд до микросекунд). Из-за его нестатического и непрерывного характера работать с данными временных рядов действительно сложно даже сегодня!

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

Временные ряды — Анализ против. Прогнозирование

Анализ временных рядов — это научное извлечение полезной информации из данных временных рядов для извлечения из них идей. Он состоит из ряда данных, которые меняются со временем. Он нестатичен по своей природе. Точно так же оно может варьироваться от часов до минут и даже секунд (от миллисекунд до микросекунд). Работа с данными временных рядов является сложной задачей из-за их непрерывного и нестатического характера!

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

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

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

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

Интеграторы временных рядов

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

Стоит отметить, что интегранты делятся на 2 типа:

1. Систематические — компоненты, которые можно использовать для прогнозного моделирования и которые повторяются. Уровень, тенденция и сезонность подпадают под эту категорию.

2. Несистематические — компоненты, которые нельзя напрямую использовать для прогнозного моделирования. Шум подпадает под эту категорию.

Таким образом, исходные данные временного ряда разделяются или разлагаются на 5 частей:

1. Уровень. Наиболее распространенным интегрантом в каждом временном ряду данных является уровень. Это не что иное, как среднее или среднее значение во временном ряду. Он имеет 0 отклонений при построении графика против самого себя.

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

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

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

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

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

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

Анализ временных рядов и прогнозирование выполняются путем автоматизации различных задач, таких как:

  1. Прогноз погоды
  2. Прогнозирование аномалий
  3. Прогноз продаж
  4. Анализ фондового рынка
  5. Анализ ЭКГ
  6. Анализ риска

и многое другое!

Комбинаторика компонентов временных рядов

Модель временных рядов может быть представлена ​​двумя методологиями:

Аддитивная методология

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

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

Это можно представить следующим образом-

y(t) или x(t) = уровень + тренд + сезонность + шум

где модель y (многомерная) или x (одномерная) является функцией времени t.

Мультипликативный метод

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

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

Он представлен как-

y(t) или x(t)= уровень * тренд * сезонность * шум

Глубокое погружение в контролируемое прогнозирование временных рядов

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

Он будет содержать различные подробные темы, чтобы читатели в конце знали, как:

  1. Загружайте данные временных рядов и используйте описательную статистику для их изучения.
  2. Масштабируйте и нормализуйте данные временных рядов для дальнейшего моделирования
  3. Извлечение полезных функций из данных временных рядов (Feature Engineering)
  4. Проверка стационарности временного ряда для его уменьшения
  5. Модели ARIMA и Grid-search ARIMA для прогнозирования временных рядов
  6. Переход к методам глубокого обучения для более сложного прогнозирования временных рядов (LSTM и bi-LSTM)

Итак, без лишних слов, начнем!

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

Для легкого и быстрого понимания и анализа данных временных рядов мы будем работать со знаменитым игрушечным набором данных под названием «Набор данных о ежедневных женских рождениях».

Получите набор данных, загруженный здесь.

Импорт необходимых библиотек и загрузка данных -

import numpy import pandas import statmodels import matplotlib.pyplot as plt import seaborn as sns data = pd.read_csv('daily-total-female-births-in-cal.csv', parse_dates = True, header = 0, squeeze=True) data.head()

Это вывод, который мы получаем-

1959-01-01 35 1959-01-02 32 1959-01-03 30 1959-01-04 31 1959-01-05 44 Name: Daily total female births in California, 1959, dtype: int64

Примечание. Помните, что необходимо использовать 'parse_dates', потому что он преобразует даты в объекты даты и времени, которые могут быть проанализированы, заголовок = 0, что гарантирует, что именованный столбец сохранен для удобства поиска, и сжатие = True, что преобразует фрейм данных отдельных элементов объекта в скаляр.

Изучение данных временных рядов -

print(data.size) #output-365

(a) Проведите некоторую описательную статистику -

print(data.describe())

Выход -

count 365.000000 mean 41.980822 std 7.348257 min 23.000000 25% 37.000000 50% 42.000000 75% 46.000000 max 73.000000

(b) Посмотрите на график распределения временных рядов -

pyplot.plot(series) pyplot.show()

Масштабируйте и нормализуйте данные временных рядов для дальнейшего моделирования

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

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

Для этого возьмем сильно колеблющиеся данные временного ряда — данные о минимальных дневных температурах. Берите здесь!

Давайте посмотрим на чрезвычайно изменчивый характер данных -

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

Чтобы нормализовать функцию, Scikit-learn MinMaxScaler слишком удобен! Если вы хотите сгенерировать исходные точки данных после прогнозирования, эта замечательная встроенная функция также предоставляет функцию inverse_transform()!

Вот код нормализации -

# import necessary libraries 
import pandas 
from sklearn.preprocessing import MinMaxScaler 
# load and sanity check the data 
data = read_csv('daily-minimum-temperatures-in-me.csv', 
                parse_dates = True, 
                header = 0,
                squeeze=True, 
                index_col=0) 
print(data.head()) 
#convert data into matrix of row-col vectors values = data.values values = values.reshape((len(values), 1)) 
# feature scaling 
scaler = MinMaxScaler(feature_range=(0, 1)) 
#fit the scaler with the train data to get min-max values 
scaler = scalar.fit(values) 
print('Min: %f, Max: %f' % (scaler.data_min_, scaler.data_max_)) 
# normalize the data and sanity check 
normalized = scaler.transform(values) 
for i in range(5): 
  print(normalized[i]) 
# inverse transform to obtain original values 
original_matrix= scaler.inverse_transform(normalized) 
for i in range(5): 
  print(original_matrix[i])

Посмотрим, что у нас получилось -

Посмотрите, как изменились значения!

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

Подробнее об этом здесь!

Извлечение полезных функций из данных временных рядов (разработка функций)

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

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

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

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

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

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

2. Статистические функции окна — функции окна представляют собой статистическую сводку различных статистических операций при фиксированном размере окна предыдущих временных меток. Как правило, есть 2 способа извлечения описательной статистики из окон. Они есть

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

Пусть среднее значение на отметке времени t-1 равно x, а t-2 равно y, поэтому мы находим среднее значение x и y, чтобы предсказать значение на отметке времени t+1. Таким образом, скользящее окно принимает среднее значение из двух значений для предсказания третьего значения. После этого окно переходит к следующему набору значений, и, следовательно, среднее значение вычисляется для каждого окна, состоящего из 2 значений. Мы используем скользящую статистику чаще, когда последние данные более важны для прогнозирования, а не предыдущие данные.

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

from pandas import DataFrame 
from pandas import concat 
df = DataFrame(data.values) 
tshifts = df.shift(1) 
rwin = tshifts.rolling(window=2) 
moving_avg = rwin.mean() 
joined_df = concat([moving_avg, df], axis=1) 
joined_df.columns = ['mean(t-2,t-1)', 't+1'] print(joined_df.head(5))

Посмотрим, что у нас получилось -

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

Давайте быстро взглянем на расширяющийся код окна.

window = tshifts.expanding() 
joined_df2 = concat([rwin.mean(),df.shift(-1)], axis=1) joined_df2.columns = ['mean', 't+1'] print(joined_df2.head(5))

Посмотрим, что у нас получилось -

3. Функции запаздывания. Запаздывание просто прогнозирует значение в отметке времени t+1 при условии, что мы знаем значение в предыдущую отметку времени, скажем, t-1. Это просто расстояние или задержка между двумя значениями с двумя разными временными метками.

4. Функции даты и времени — это просто преобразование времени в его определенные компоненты, такие как месяц или день, вместе со значением температуры для лучшего прогнозирования. Делая это, мы можем собирать конкретную информацию о месяце и дне с определенной отметкой времени для каждой записи.

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

Стационарные проверки данных временных рядов

Итак, давайте сначала разберемся, что такое стационарные данные временных рядов!

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

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

Стационарность во временном ряду заметна в 3-х видах -

(a) Стационарный тренд — данные временного ряда такого типа не содержат тренда.

(b) Стационарность по сезонности — этот тип данных временного ряда не имеет фактора сезонности.

(c)Строгая стационарность — данные временного ряда строго согласуются, практически не отличаясь от дрейфа.

Теперь, когда мы знаем, что такое стационарность временных рядов, как мы можем это проверить?

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

Давайте POC это!

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

Случай 1 — стационарное доказательство

import pandas as pd 
import matplotlib.pyplot as plt 
data = pd.read_csv('daily-total-female-births.csv', parse_dates = True, header = 0, squeeze=True) 
data.hist() 
plt.show()

Выход -

Как я уже сказал, зрение! Посмотрите, как сама визуализация говорит о том, что это распределение Гаусса. Следовательно, стационарный!

Более любопытно? Давайте получим надежное математическое доказательство!

X = data.values 
seq = round(len(X) / 2) 
x1, x2 = X[0:seq], X[seq:] 
meanx1, meanx2 = x1.mean(), x2.mean() 
varx1, varx2 = x1.var(), x2.var() 
print('meanx1=%f, meanx2=%f' % (meanx1, meanx2)) print('variancex1=%f, variancex2=%f' % (varx1, varx2))

Выход -

meanx1=39.763736, meanx2=44.185792 
variancex1=49.213410, variancex2=48.708651

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

Случай 2. Нестационарное доказательство

import pandas as pd 
import matplotlib.pyplot as plt 
data = pd.read_csv('international-airline-passengers.csv', parse_dates = True, header = 0, squeeze=True) 
data.hist() 
plt.show()

Выход -

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

X = data.values 
seq = round(len(X) / 2) 
x1, x2 = X[0:seq], X[seq:] 
meanx1, meanx2 = x1.mean(), x2.mean() 
varx1, varx2 = x1.var(), x2.var() 
print('meanx1=%f, meanx2=%f' % (meanx1, meanx2)) print('variancex1=%f, variancex2=%f' % (varx1, varx2))

Выход -

meanx1=182.902778, meanx2=377.694444 
variancex1=2244.087770, variancex2=7367.962191

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

Модели ARMA, ARIMA и SARIMAX для прогнозирования временных рядов

Очень традиционным, но замечательным способом «машинного обучения» для прогнозирования временных рядов является ARMA (авторегрессивная скользящая средняя) и авторегрессивная интегрированная модель скользящей средней, обычно называемая статистическими моделями ARIMA.

Помимо этих двух традиционных подходов, у нас есть SARIMA (сезонная авторегрессивная интегрированная скользящая средняя) и ARIMA поиска по сетке, которые мы тоже увидим!

Итак, давайте рассмотрим модели одну за другой!

АРМА

Модель ARMA представляет собой сборку двух статистических моделей — AR или авторегрессионной модели и скользящей средней.

Авторегрессивная модель оценивает любое значение зависимой переменной y(t) в заданную временную метку t на основе лагов. Посмотрите на формулу ниже для лучшего понимания -

Здесь y(t) = прогнозируемое значение в отметке времени t, α = член пересечения, β = коэффициент запаздывания и y(t-1) = запаздывание временного ряда в отметке времени t-1.

Таким образом, α и β являются оценщиками модели, которые оценивают y(t).

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

Давайте посмотрим, как модели AR и MA работают с данными International-Airline-Passengers.

Модель дополненной реальности

AR_model = ARIMA(indexedDataset_logScale, order=(2,1,0))
AR_results = AR_model.fit(disp=-1)
plt.plot(datasetLogDiffShifting)
plt.plot(AR_results.fittedvalues, color='red')
plt.title('RSS: %.4f'%sum((AR_results.fittedvalues - datasetLogDiffShifting['#Passengers'])**2))

Остаток RSS или суммы квадратов составляет 1,5023 в случае модели AR, что несколько неудовлетворительно, поскольку AR недостаточно хорошо фиксирует нестационарность.

Модель МА

MA_model = ARIMA(indexedDataset_logScale, order=(0,1,2))
MA_results = MA_model.fit(disp=-1)
plt.plot(datasetLogDiffShifting)
plt.plot(MA_results.fittedvalues, color='red')
plt.title('RSS: %.4f'%sum((MA_results.fittedvalues - datasetLogDiffShifting['#Passengers'])**2))

Модель MA показывает результаты, аналогичные AR, с очень небольшим отличием. Мы знаем, что наши данные нестационарны, поэтому давайте улучшим этот показатель RSS с помощью обработчика нестационарности AR+I+MA!

АРИМА

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

Что делает разностный фактор, так это то, что он учитывает разницу в прогнозируемых значениях между двумя временными метками (например, t и t+1). Это помогает достичь постоянного среднего, а не сильно колеблющегося «нестационарного» среднего.

Давайте сопоставим те же данные с ARIMA и посмотрим, насколько хорошо он работает!

ARIMA_model = ARIMA(indexedDataset_logScale, order=(2,1,2))
ARIMA_results = ARIMA_model.fit(disp=-1)
plt.plot(datasetLogDiffShifting)
plt.plot(ARIMA_results.fittedvalues, color='red')
plt.title('RSS: %.4f'%sum((ARIMA_results.fittedvalues - datasetLogDiffShifting['#Passengers'])**2))

Большой! Сам график показывает, как ARIMA хорошо и обобщенно соответствует нашим данным по сравнению с ARMA! Также обратите внимание, как RSS упал до 1,0292 с 1,5023 или 1,4721.

САРИМАКС

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

Они есть -

1. Сезонная авторегрессионная составляющая

2. Компонент сезонной скользящей средней

3. Сезонный компонент заказа целостности

4. Сезонная периодичность

Если вы, как и я, больше разбираетесь в теории, читайте больше об этом здесь, так как подробное изучение формулы выходит за рамки этой статьи!

Теперь давайте посмотрим, насколько хорошо SARIMAX работает с сезонными временными рядами данных, такими как данные International-Airline-Passengers.

from statsmodels.tsa.statespace.sarimax import SARIMAX SARIMAX_model=SARIMAX(train['#Passengers'],order=(1,1,1),seasonal_order=(1,0,0,12)) SARIMAX_results=SARIMAX_model.fit() preds=SARIMAX_results.predict(start,end,typ='levels').rename('SARIMAX Predictions') test['#Passengers'].plot(legend=True,figsize=(8,5)) preds.plot(legend=True)

Посмотрите, как красиво SARIMAX обрабатывает сезонные временные ряды!

Переход к методам глубокого обучения для сложного прогнозирования временных рядов

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

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

RNN был разработан для работы с последовательными данными, такими как временные ряды. Однако очень примечательной ошибкой RNN было то, что она не могла обрабатывать долгосрочные зависимости. Для проблемы, когда вы хотите спрогнозировать временной ряд на основе огромного количества предыдущих записей, RNN забывает максимум предыдущих записей, которые произошли намного раньше, и изучает только последовательности последних данных, переданных в его нейронную сеть. Таким образом, было замечено, что RNN не соответствует требованиям для задач NSP (предсказание следующей последовательности) в NLP и временных рядах.

Чтобы решить эту проблему отсутствия захвата долгосрочных зависимостей, был разработан мощный вариант RNN, известный как сети LSTM (Long Short Term Memory). В отличие от RNN, которая могла фиксировать только краткосрочные последовательности/зависимости, LSTM, как следует из ее названия, изучала как долгосрочные, так и краткосрочные зависимости. Следовательно, это был большой успех для моделирования и прогнозирования данных временных рядов!

Примечание. Поскольку объяснение архитектуры LSTM выходит за рамки этого блога, я рекомендую вам перейти к моей статье, где я подробно объяснил LSTM!

Давайте теперь возьмем данные наших авиапассажиров и посмотрим, насколько хорошо с ними работают RNN и LSTM!

Импорт

import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
import sklearn.preprocessing
from sklearn.metrics import r2_score
from keras.layers import Dense, Dropout, SimpleRNN, LSTM
from keras.models import Sequential

Масштабирование данных, чтобы сделать их стационарными для лучшего прогнозирования –

minmax_scaler = sklearn.preprocessing.MinMaxScaler()
data['Passengers'] = minmax_scaler.fit_transform(data['Passengers'].values.reshape(-1,1))
data.head()

Выборка масштабированных данных

Тренируйтесь, тестируйте шпагаты (соотношение 80–20) –

split = int(len(data[‘Passengers’])*0.8)
x_train,y_train,x_test,y_test = np.array(x[:split]),np.array(y[:split]),
np.array(x[split:]), np.array(y[split:])
#reshaping data to original shape
x_train = np.reshape(x_train, (split, 20, 1))
x_test = np.reshape(x_test, (x_test.shape[0], 20, 1))

Модель RNN –

model = Sequential()
model.add(SimpleRNN(40, activation="tanh", return_sequences=True, input_shape=(x_train.shape[1],1)))
model.add(Dropout(0.15))
model.add(SimpleRNN(50, return_sequences=True, activation="tanh"))
model.add(Dropout(0.1)) #remove overfitting
model.add(SimpleRNN(10, activation="tanh"))
model.add(Dense(1))
model.summary()

Скомпилируйте, подгоните и спрогнозируйте-

model.compile(optimizer="adam", loss="MSE")
model.fit(x_train, y_train, epochs=15, batch_size=50)
preds = model.predict(x_test)

Позвольте мне показать вам картину того, насколько хорошо модель предсказывает —

Довольно точно!

Модель LSTM —

model = Sequential()
model.add(LSTM(100, activation="ReLU", return_sequences=True, input_shape=(x_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(80, activation="ReLU", return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(50, activation="ReLU", return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(30, activation="ReLU"))
model.add(Dense(1))
model.summary()

Скомпилируйте, подгоните и спрогнозируйте-

model.compile(optimizer="adam", loss="MSE")
model.fit(x_train, y_train, epochs=15, batch_size=50)
preds = model.predict(x_test)

Позвольте мне показать вам картину того, насколько хорошо модель предсказывает -

Здесь мы легко можем заметить, что RNN справляется со своей задачей лучше, чем LSTM. Как ясно видно, LSTM отлично работает с обучающими данными, но с плохими недействительными/тестовыми данными, что свидетельствует о переоснащении!

Следовательно, старайтесь использовать LSTM только там, где есть необходимость в долгосрочном изучении зависимостей, в противном случае RNN работает достаточно хорошо.

Заключение

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

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

Если вы новичок в науке о данных и машинном обучении и у вас есть конкретные вопросы, касающиеся науки о данных/ML-AI, руководства по переходу на работу в науку о данных, подготовки к собеседованию/резюме или вы даже хотите пройти пробное собеседование до Ваш день Д, не стесняйтесь заказать звонок 1:1 здесь. Буду рад помочь!

Не стесняйтесь подписываться на меня в Medium и GitHub, чтобы получать больше статей и блокнотов о машинном и глубоком обучении! Свяжитесь со мной в LinkedIn, если вы хотите обсудить что-либо относительно этой статьи!

Счастливого обучения!

Первоначально опубликовано на https://www.analyticsvidhya.com 9 мая 2022 г.