Введение
Временной ряд — значения меняющихся во времени признаков, полученные в некоторые моменты времени.
Задача прогнозирования
Пусть – временной ряд, для которого известны значения . Требуется построить прогноз – функцию , такую что величина как можно лучше приближает значение , где – количество шагов, на которое нужно построить прогноз, а величина – горизонт прогнозирования, то есть максимальное количество шагов для построения прогноза. Иными словами, прогноз значения ряда в момент времени строится на основе известных значений ряда до момента времени . Кроме этого имеет смысл строить предсказательный интервал, то есть интервал , т.ч. .
Например, пусть – значение какого-то признака в момент времени , и у нас есть значения ряда за месяц, то есть . Пусть также требуется предсказать значения ряда на неделю вперед. Тогда прогноз на первые сутки вперед будет равен , а прогноз на пятые сутки .
Спустя некоторое время прогноз можно перестроить. Например, пусть прогноз перестраивается один раз в трое суток. Тогда оценку значения мы уточним как . При этом может оказаться, что функция умеет принимать на вход лишь фиксированное количество предыдущих значений ряда. Например, если она умеем строить прогноз по последним 30 значениям ряда, то запись будет иметь вид . Иногда для уточнения того, в какой момент построен прогноз значения , указывают момент времени построения прогноза. Например, запись означает, что прогноз на 35-й день построен в день 30, а – в день 33.
Если признаков несколько, не обязательно прогнозировать каждый признак. Часто выделяется один или несколько целевых признаков, а остальные признаки являются вспомогательными и могут улучшить прогноз.
Практические примеры:
- Прогноз погоды на 10 дней вперед.
- Прогноз осадков на 2 часа вперед.
Примеры временных рядов
Ежемесячные продажи антидиабетических лекарств в Австралии с июля 1991 по июнь 2008. На этом графике мы можем видеть возрастающий тренд, возможно, даже нелинейный, и кроме этого есть сезонность (периодичность) значений по годам.
Максимальный спрос на электричество в штате Виктория (Австралия) за 30-минутные интервалы с 10 января 2000 в течении 115 дней. Здесь мы можем наблюдать сразу две сезонности – суточную и недельную. Первая сезонность вызвана тем, что люди обычно больше потребляют электричество днем, чем ночью. Недельная сезонность вызвана более высоким потреблением электричества по будням. Если бы мы посмотрели данные за несколько лет, то увидели бы еще одну сезонность – годовую, например, вызванную тем, что в теплое время года работает больше кондиционеров.
Почему бы нам не построить прогноз простыми методами, например, линейной регрессией по времени? Общий тренд так можно уловить. Но в остатках (то есть в разности между истинными значениями и прогнозом) этой модели будет достаточно много информации, которую хотелось бы как-то учесть.
Можно также добавить квадрат значения времени. Тогда можно уловить квадратичный тренд, но не более.
Прогнозирование с помощью сведения к задаче регрессии
Давайте для начала поймем, что мы вообще хотим сделать. Посмотрим на этот график, на котором показаны продажи одного из товаров в магазине за разные года.
Мы знаем значения ряда (зеленые) до момента времени , в данном случае за 4 года с 2013 по 2016 включительно. Предположим также, что в данный момент мы отмечаем Новый год 2017. В этот момент мы хотели бы предсказать (синее) будущие значения ряда (оранжевое) за весь 2017 год на основе четырехлетней истории продаж.
Основная идея – подадим известные (зеленые) значения ряда в какую-то регрессионную функцию, получив тем самым предсказания. При этом можем брать не все известные значения ряда, а только последних значений. Иначе говоря, модель имеет вид
где – произвольная функция. Ее можно построить некоторым известным методом машинного обучения, например, линейной регрессией, решающими деревьями, бустингами, нейронными сетями (как сверточными, так и рекуррентными). Разберёмся, какие признаки мы подадим на вход регрессии.
Признаки
Общий принцип
На практике при генерации идей о том, какие признаки можно создавать для построения модели, рекомендуется строить следующий график. На нем нужно отметить момент времени и мысленно поставить себя в этот момент времени. Затем нужно подумать, какие данные нам при этом доступны. В модель можно брать любые признаки, которые доступны к моменту времени . Если все данные поступают сразу, то можно брать все признаки, которые зависят только от значений до момента времени . В реальности часть данных может поступать с задержкой. Например, если данные загружаются в базу данных раз в сутки в полночь, то в полдень нам не доступны данные за последние 12 часов.
Также нужно помнить о том, на сколько времени вперед нужно сделать прогноз. Например, пусть у нас задача состоит в том, чтобы построить прогнозы продаж в магазине с целью планирования новых поставок. После того, как на основе прогноза мы примем решение о составе товаров в новой поставке, необходимо сначала собрать данные товары на складе, потом отправить машину в магазин, и затем еще разложить товар на полки в магазине. На эту процедуру может уходить от нескольких часов до нескольких дней. Тем самым еще до момента начала формирования новой поставки модель прогнозирования продаж должна построить прогноз спроса на товар к тому моменту, когда его выложат на полки.
Даты
Посмотрим на то, какие признаки можно извлечь
Пусть дана какая-то дата: 13.04.2021 09:00.
Отсюда можно получить следующие признаки:
- день недели: [2];
- месяц: [4];
- год: [2021];
- сезон: [весна];
- праздник: [0];
- выходной: [0];
- час: [9].
Предыдущие значения ряда.
Например, если мы хотим построить признаки в момент времени для прогнозирования , то можно рассмотреть в качестве признаков предыдущих значений ряда .
Время | Таргет | Признаки |
---|---|---|
$t$ | $y_t$ | $y_{t-1}, \ldots, y_{t-p}$ |
$t-1$ | $y_{t-1}$ | $y_{t-2}, \ldots, y_{t-p-1}$ |
$t-2$ | $y_{t-2}$ | $y_{t-3}, \ldots, y_{t-p-2}$ |
Для реализации таких признаков можно выполнить сдвиги вперед временного ряда на шагов. Например, в таблице для прогнозирования значений ряда мы рассматриваем два предыдущих значений ряда, выполняя тем самым два сдвига вперед. Таким образом, для прогнозирования значения 5 января, которое равно 235, мы берем признаки 230 и 215, которые являются значением ряда за 4 и 3 января соответственно.
Скользящее окно
Не всегда имеет смысл в качестве признаков в чистом виде брать все предыдущие значения ряда. Например, если данные приходят раз в секунду, то для того чтобы учесть изменения ряда за последний час, пришлось бы создавать 3600 признаков. Вместо этого по предыдущим значениям ряда можно посчитать:
- среднее;
- взвешенное среднее;
- экспоненциальное сглаживание;
- медиана;
- минимум/максимум;
- стандартное отклонение;
- любую другую статистику.
Подобное скользящее окно можно рассматривать и по другим временным факторам, которые мы не прогнозируем.
Примеры:
- Средняя температура на прошлой неделе для предсказания температуры на завтра.
- Средняя влажность на прошлой неделе для предсказания температуры на завтра.
Если в задаче данные хорошие и удаётся использовать более-менее стандартные признаки, то можно воспользоваться готовыми инструментами. Если данные не очень приятные, стоит подумать над тем, какие признаки использовать и как реализовать их получение.
Сезонность
Если во временном ряду наблюдается сезонность, то стоит использовать сезонные признаки, например, следующие.
- Значение переменной сутки/неделю/месяц/год назад. Такие факторы также можно усреднять.
- Сезонность, полученная методами декомпозирования ряда (об этом расскажем ниже).
Примеры:
- Значение температуры год назад.
- Среднее значение температуры 23 ноября за 5 последних лет.
- Среднее значение температуры за 5 последних лет на неделе, в которую входит 23 ноября.
Счётчики
Идея состоит в том, чтобы группировать данные не только по временным факторам, но и по любым категориальным. Например, пусть сегодня нет ветра. Тогда в качестве признака можно рассмотреть среднюю температуру в безветренные дни по историческим данным.
Можно также использовать сразу несколько факторов. Например, мы строим прогноз в апреле. Тогда можно рассматривать среднюю температуру в безветренные дни в апреле по историческим данным.
Резюме
Подведем итог о том, какие признаки можем использовать для построения нашей модели.
- Используются только данные из прошлого, никакие данные из будущего нельзя использовать при прогнозировании. Нужно также учитывать возможные задержки в поступлении данных.
- Большое количество признаков может привести к вычислительным затратам.
- Можно генерировать и другие признаки с учетом знаний о предметной области.
Построение прогноза
Мы определились с тем, какие брать признаки. Теперь разберемся с тем, как прогнозировать. Пусть требуется построить прогноз на шагов вперед. Выделяют три основных способа построить прогнозы:
- Рекурсивная стратегия;
- Прямая стратегия;
- Гибридная стратегия.
Рекурсивная стратегия
Для каждого момента времени создается объект обучающей выборки:
- Признаковое описание – история ряда до момента времени .
- Целевая метка – значение .
По этим данным мы обучаем какую-либо регрессионную модель строить прогнозы на один шаг вперед. При построении прогноза на несколько шагов вперед мы сначала построим прогноз на один шаг. Затем – на второй шаг, используя полученный прогноз на первый шаг в качестве признаков, и далее аналогично.
Иначе говоря, если для прогнозирования признаковое описание имеет вид , то для построения прогноза рассматривается признаковое описание .
На картинке считаем, что M-2, M-1 и M это названия признаков у построенной модели.
Прямая стратегия
В прямой стратегии предполагается, что построением каждого прогноза в рамках горизонта прогнозирования должна заниматься своя модель. Тем самым создается моделей прогнозирования для каждого момента времени .
- Признаковое описание – история ряда до момента времени , причем признаки одни и те же для каждой модели.
- Целевая метка – значение .
Гибридная стратегия
Гибридная стратегия объединяет в себе преимущества рекурсивной и прямой стратегий. Как и в прямой стратегии, создается моделей прогнозирования, но при этом каждая следующая модель использует прогнозы предыдущей подобно тому, как это делает рекурсивная стратегия.
Итак, мы должны построить
- модель для прогноза на 1 шаг вперед;
- модель для прогноза на 2 шага вперед, используя прогноз уже обученной модели на 1 шаг вперед в качестве признака;
- модель для прогноза на 3 шага вперед, используя прогноз уже обученных моделей на 1 и 2 шага вперед в качестве признаков;
- и так далее обучается моделей.
Признаковое описание:
- история ряда до момента времени ;
- предсказание предыдущих моделей для .
На картинке показаны признаковые описания для моделей в такой стратегии.
Можно задаться вопросом: что лучше брать при обучении моделей для прогноза на несколько шагов вперёд – истинные значения или же предсказания предыдущих моделей. Если брать истинные, то мы можем точнее построить модели прогнозирования, но, с другой стороны, на этапе применения вы будете использовать прогнозы, а они могут иметь другое распределение, чем истинные данные, в частности, могут иметь смещение и большую дисперсию. В таком случае мы получим плохие следующие прогнозы.
Модели для нескольких временных рядов
В реальности очень часто нужно прогнозировать сразу огромное количество временных рядов.
Примеры:
- Предсказание температуры для различных регионов/городов.
- Предсказания уровня продаж для различных типов товаров (молоко/яблоки/мясо).
Проблема:
- модель на каждый временной ряд – слишком много ресурсов и не масштабируемо;
- мало моделей – плохие предсказания для каждого ряда по отдельности.
Идея: создавать модели не для каждого временного ряда, а для группы временных рядов. Иначе говоря, разделить объекты на категории, и для каждой категории создавать отдельную модель.
Оценка качества моделей
Для оценка качества моделей прогнозирования временного ряда в основном используются метрики качества регрессии.
- Средняя квадратичная ошибка
- Средняя абсолютная ошибка
Эти метрики показывают, например, на сколько рублей или на сколько единиц товара мы ошибемся.
Также могут использоваться:
- Средняя абсолютная ошибка в процентах
- Взвешенная средняя ошибка в процентах.
Эти метрики достаточно популярны из-за того, что позволяют оценить качество в относительных величинах без зависимости от шкалы измерений.
Кросс-валидация для временных рядов.
Стандартные схемы кросс-валидации нельзя применять для временных рядов потому что значения во временных рядах нельзя перемешивать. Существует два способа построить кросс-валидацию на временных рядах.
Схема 1.
- Обучаемся на первых значениях временного ряда , прогнозируем следующие значений ряда .
- Обучаемся на , прогнозируем .
- ...
- Обучаемся на , прогнозируем .
- На каждой итерации считаем ошибки и усредняем.
Схема 2.
- Обучаемся на первых значениях временного ряда , прогнозируем следующие значений ряда .
- Обучаемся на , прогнозируем .
- ...
- Обучаемся на ,~прогнозируем~.
- Считаем ошибки и усредняем.
Эти две схемы отличаются только размером обучающего множества. В первом случае он постоянно растет, во втором – не меняется, а само обучающее множество при этом сдвигается. Ту или иную схему на практике стоит использовать в зависимости от того, какая решается задача. Например, если данных достаточно много и предполагается онлайн работа модели с периодическим дообучением, то обычно при каждом дообучении размер обучающего множества фиксируют. В таком случае имеет смысл воспользоваться второй схемой, чтобы оценить качество модели, обученной именно на таким количестве данных. Если же данных немного, то для обучения желательно использовать все доступные данные. В таком случае имеет смысл использовать первую схему.
Обратите внимание, что во всех случаях размер тестового интервала времени фиксирован. Это необходимое условие, потому как распределение значений метрики на разных размерах данных может отличаться. Вспомните, например, про зависимость дисперсии выборочного от размера выборки.
Резюме: стандартные модели ML для временных рядов
Преимущества
- Свободно используют дополнительную информацию – экзогенные факторы или признаки.
- Много рядов – много моделей. Нейронная сеть может иметь несколько выходов, и это позволяет прогнозировать сразу несколько рядов одной моделью. Пример: прогнозирование продаж различных товаров.
Недостатки
- Предсказательные интервалы напрямую не строятся.
- Иногда работают хуже стандартных моделей.
- Обработка признаков может быть труднее, чем в других моделях, которые мы рассмотрим далее.
- Интерпретация моделей может вызывать трудности у заказчика.
Декомпозиция временных рядов
Декомпозиция – процедура разложения временного ряда на три временных компоненты:
- Тренд – плавное долгосрочное изменение временного ряда.
- Сезонность – циклические изменения временного ряда с постоянным периодом сезонности .
- Ошибка – непрогнозируемая случайная компонента ряда.
Можно рассматривать аддитивную декомпозицию, в которой ряд представляется в виде , а также мультипликативную в виде . Нетрудно понять, что для построения мультипликативного разложения достаточно выполнить аддитивную декомпозицию для ряда .
Декомпозиция на основе скользящего среднего
Пусть – известный заранее период сезонности. Компоненты разложения вычисляются последовательно по следующим правилам.
- Тренд
Вычисляется с помощью скользящего окна длины : .
-
Сезонность
Усреднение значений по сезону после удаления тренда.- Вычитаем тренд ;
- Формируются подгрупп: ;
- -е значение сезонности вычисляется усреднением по -й группе .
-
Ошибка
.
STL-декомпозиция
Название метода расшифровывается как Seasonal-Trend decomposition using LOESS. Является более продвинутой моделю для декомпозиции временного ряда. Напоминание: LOESS – взвешенная линейная регрессия, где вес объекта пропорционален расстоянию от него до точек обучающей выборки.
Принцип работы:
- Инициализация тренда нулем: ;
- В цикле по до сходимости:
- Вычитаем из ряда текущее значение тренда .
- Формируются подгрупп: .
- С помощью LOESS в каждой группе в каждый момент времени предсказывается сезонность .
- Вычитаем из ряда полученную сезонность .
- С помощью LOESS предсказывается новое значение тренда .
Замечание. Пропущен шаг работы с выбросами.
Преимущества STL-декомпозиции:
- Больше настраиваемых параметров, позволяющих подогнать модель под любые данные.
- Сезонная компонента может изменяться с течением времени, и это изменение контролируется пользователем.
- Модель может быть устойчива к выбросам.