Преобразователь временного слияния: прогнозирование временных рядов с помощью глубокого обучения — полное руководство

Создавайте точные и интерпретируемые прогнозы

Создано с помощью ДАЛЛЕ [1]

Согласно [2], Трансформатор временного синтеза превосходит все известные модели глубокого обучения для прогнозирования временных рядов.

В том числе избранное Дерево повышения градиента модель для табличных данных временных рядов.

Но что это Трансформатор временного синтеза (TFT)[3] и почему это так интересно?

В этой статье мы кратко расскажем о новинках Трансформатор временного синтеза и создадим комплексный проект на Прогнозирование спроса на энергию. В частности, мы рассмотрим:

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

Давай нырнем!

Для более глубокого анализа архитектуры Temporal Fusion Transformer ознакомьтесь с моим предыдущим гайд.

Tвременный FUsion Tтрансформер (ТФТ) — это модель на основе Трансформера, которая использует самовнимание для захвата сложной временной динамики нескольких временных последовательностей.

TFT поддерживает:

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

Одна из этих черт уникальна для Трансформатор временного синтеза. Мы рассмотрим это в следующем разделе.

Среди известных моделей временных рядов DL (например, ДипАР[4]), TFT выделяется тем, что поддерживает различные типы функций. Это:

  • Изменяющийся во времени известный
  • Изменяющийся во времени неизвестный
  • Инвариантный ко времени реальные
  • Инвариантный ко времени категорический

Например, представьте, что у нас есть случай прогнозирования продаж:

Допустим, нам нужно спрогнозировать продажи трех товаров. num sales является целевой переменной. CPI index или number of visitors Он изменяющийся во времени неизвестный функции, поскольку они известны только до времени прогнозирования. Однако, holidaysи special days Он изменяющийся во времени известный Мероприятия.

Ассоциация product id is инвариантная во времени (статическая) категоричная особенность. Другие функции, которые являются числовыми и не зависят от времени, такие как yearly_revenue можно отнести к категории неизменяемый во времени действительный.

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

Примечание: Все изображения и рисунки в этой статье созданы автором.

В этом уроке мы используем TemporalFusionTransformer модель из Прогнозирование PyTorch библиотека и PyTorch Lightning:

pip install torch pytorch-lightning pytorch_forecasting

Весь процесс включает в себя 3 вещи:

  1. Создайте фрейм данных pandas с нашими данными временных рядов.
  2. Оберните наш фрейм данных в набор данных временной серии пример.
  3. Передайте наш набор данных временной серии экземпляр для TemporalFusionTransformer.

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

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

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

Фигура 1: Кадр данных sample_data pandas

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

Затем мы обертываем наш фрейм данных в набор данных временной серии пример:

Все аргументы говорят сами за себя: max_encoder_length определяет период ретроспективного анализа и max_prediction_length указывает, сколько точек данных будет предсказано. В нашем случае мы оглядываемся на 3 временных шага в прошлое, чтобы получить 2 прогноза.

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

Этот пакет содержит тренировочные значения [0,1] из первого временного ряда (group 0) и тестовые значения[2,3,4]. Если вы повторно запустите этот код, вы получите другие значения, поскольку данные по умолчанию перемешиваются.

В нашем проекте будет использоваться ЭлектричествоДиаграммы нагрузки20112014 [5] набор данных из UCI. Блокнот для этого примера можно скачать с сайта здесь:

Этот набор данных содержит данные об энергопотреблении (в киловаттах) 370 клиентов/потребителей с 15-минутной частотой. Данные охватывают 4 года (2011–2014 гг.).

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

Мы выполняем предварительную обработку данных в соответствии с [3]:

  • Агрегируем нашу целевую переменную power_usage по часам.
  • Найдите самую раннюю дату для каждого временного ряда, в котором мощность не равна нулю.
  • Создайте новые функции: month, day, hour и day_of_week.
  • Выберите все дни между 2014–01–01 и 2014–09–07.

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

Загрузить данные

Wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!разархивировать
LD2011_2014.txt.zip

Предварительная обработка данных

Каждый столбец представляет потребителя. Самый начальный power_usage значения 0.

Далее мы агрегируем почасовые данные. Из-за размера и сложности модели мы обучаем ее только на 5 потребителях (для тех, у кого значения ненулевые).

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

Последний предварительно обработанный кадр данных называется time_df. Распечатаем его содержимое:

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

Исследовательский анализ данных

Выбор 5 потребителей/временных рядов не случаен. power usage каждого временного ряда имеет разные свойства, такие как среднее значение:

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

Давайте построим первый месяц каждого временного ряда:

Рисунок 2: Первый месяц всех 5 временных рядов/потребителей.

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

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

Создание загрузчиков данных

На этом этапе мы передаем наш time_df до набор данных таймсериес формат, который чрезвычайно полезен, потому что:

  • Это избавляет нас от необходимости писать собственный загрузчик данных.
  • Мы можем указать, как TFT будет обрабатывать функции набора данных.
  • Мы можем легко нормализовать наш набор данных. В нашем случае нормализация обязательна, поскольку все временные последовательности различаются по величине. Таким образом, мы используем ГруппаНормализатор нормализовать каждый временной ряд индивидуально.

Наша модель использует окно ретроспективного анализа в одну неделю (7*24) для прогнозирования энергопотребления на следующие 24 часа.

Также обратите внимание, что hours_from_start является одновременно временным индексом и изменяющейся во времени функцией. power_usage наша целевая переменная. Для демонстрации наш набор проверки — последний день:

Базовая модель

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

В качестве простой базовой линии мы прогнозируем кривую энергопотребления предыдущего дня:

Обучение модели временного термоядерного трансформатора

Мы можем обучить нашу модель TFT, используя знакомую Trainer интерфейс от PyTorch Lightning.

Обратите внимание на следующие вещи:

  • Мы используем Ранняя остановка обратный вызов для мониторинга потери проверки.
  • МЫ ИСПОЛЬЗУЕМ Тензорборд для регистрации наших показателей обучения и проверки.
  • В нашей модели используется Квантильная потеря — особый тип потерь, который помогает нам выводить интервалы прогнозирования. Дополнительную информацию о функции квантильных потерь см. проверьте эту статью.
  • Мы используем 4 внимание головы, как оригинальная бумага.

Теперь мы готовы построить и обучить нашу модель:

Вот и все! Через 6 эпох срабатывает EarlyStopping и останавливает обучение.

Загрузите и сохраните лучшую модель

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

!zip -r model.zip Lightning_logs/lightning_logs/version_1/*

Чтобы снова загрузить модель, разархивируйте модель.zip и выполните следующее — просто запомните лучший путь к модели:

Проверьте тензорную доску

Взгляните поближе на кривые обучения и проверки с помощью Tensorboard:

Оценка модели

Получите прогнозы на наборе проверки и вычислите среднее значение P50 (квантиль-медиана) от:

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

Постройте прогнозы на данных проверки

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

Присмотритесь к raw_predictions переменная:

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

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

Мы создаем один участок для каждого потребителя (всего 5).

Рисунок 3: Прогнозы по данным проверки для MT_002
Рисунок 4: Прогнозы по данным проверки для MT_004
Рисунок 5: Прогнозы по данным проверки для MT_005
Рисунок 6: Прогнозы по данным проверки для MT_006
Рисунок 7: Прогнозы по данным проверки для MT_008

Результаты весьма впечатляющие.

Наши Трансформатор временного синтеза Модель смогла отразить поведение всех пяти временных рядов как с точки зрения сезонности, так и с точки зрения величины!

Также обратите внимание, что:

  • Мы не проводили никакой настройки гиперпараметров.
  • Мы не реализовали какие-либо необычные методы проектирования функций.

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

Постройте прогнозы для определенного временного ряда

Ранее мы строили прогнозы на основе данных проверки, используя idx аргумент, который перебирает все временные ряды в нашем наборе данных. Мы можем быть более конкретными и выводить прогнозы для определенного временного ряда:

Рисунок 7: Прогноз на день вперед для MT_004 на тренировочном наборе

In Рисунок 7, мы планируем день вперед MT_004 потребитель по индексу времени=26512.

Помните, наш столбец индексации времени hours_from_start начинается с 26304, и мы можем получать прогнозы начиная с 26388 (поскольку мы установили ранее min_encoder_length=max_encoder_length // 2 что равно 26304 + 168//2=26388

Прогнозы за пределами выборки

Давайте создадим прогнозы за пределами выборки, помимо конечной точки данных проверки, которая 2014–09–07 23:00:00

Все, что нам нужно сделать, это создать новый фрейм данных, который содержит:

  • Количество N=max_encoder_length прошлые даты, которые действуют как окно ретроспективного анализа — данные кодера в терминологии TFT.
  • Будущие даты размера max_prediction_length для которого мы хотим вычислить наши прогнозы — данные декодера.

Мы можем создавать прогнозы для всех пяти наших временных рядов или только для одного. Рисунок 7 показывает прогнозы для потребителей за пределами выборки MT_002:

Рисунок 7: Прогноз на день вперед для MT_002

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

И еще хуже обстоят дела с моделями глубокого обучения, которые считаются черными ящиками. Такие методы, как LIME и ШАП может обеспечить объяснимость (в некоторой степени), но не очень хорошо работает для временных рядов. Кроме того, они являются внешними апостериорными методами и не привязаны к конкретной модели.

Трансформатор временного синтеза обеспечивает три типа интерпретируемости:

  • По сезонности: TFT использует свой новый Интерпретируемое внимание нескольких голов механизм расчета важности прошлых временных шагов.
  • По функциям: TFT использует свои Сеть выбора переменных модуль для расчета важности каждой функции.
  • Устойчивость к экстремальным событиям: Мы можем исследовать, как ведут себя временные ряды во время редких событий.

Если вы хотите подробно узнать о внутренней работе Интерпретируемое внимание нескольких голов и Сеть выбора переменных, проверьте мою предыдущую статью.

Сезонная интерпретация

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

Серые линии на всех предыдущих графиках представляют оценки внимания. Посмотрите еще раз на эти графики — вы что-нибудь заметили? Рисунок 8 показывает результаты Рисунок 7 а также учитывает оценки внимания:

Рисунок 8: Прогноз на день вперед для MT_001 с отображением сезонности

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

Если мы усредним кривые внимания по всем временным шагам и временным рядам (а не только по 5, которые мы использовали в этом уроке), мы получим симметрично выглядящую форму в Рисунок 9 из бумаги TFT:

Рисунок 9: Временные закономерности для набора данных по электричеству (Источник)

Вопрос: Что в этом хорошего? Разве мы не можем просто оценить закономерности сезонности с помощью таких методов, как графики АКФ, разложение сигнала по времени и т. д.?

Ответ: Истинный. Однако изучение весов внимания TFT имеет дополнительные преимущества:

  1. Мы можем подтвердить, что наша модель отражает очевидную сезонную динамику наших последовательностей.
  2. Наша модель также может выявить скрытые закономерности, поскольку веса внимания текущих входных окон учитывают все прошлые входные данные.
  3. График весов внимания — это не то же самое, что график автокорреляции: график автокорреляции относится к определенной последовательности, тогда как веса внимания здесь фокусируются на влиянии каждого временного шага путем просмотра всех ковариат и временных рядов.

Функциональная интерпретируемость

Ассоциация Сеть выбора переменных компонент TFT может легко оценить Важность функции:

Рисунок 10: Важность особенностей данных проверки

In Рисунок 10, мы замечаем следующее:

  • Ассоциация hour и day_of_week имеют высокие оценки как по прошлым наблюдениям, так и по будущим ковариатам. Тест в оригинальной статье приводит к такому же выводу.
  • Ассоциация power_usage очевидно, является наиболее влиятельной наблюдаемой ковариатой.
  • Ассоциация consumer_id здесь не очень важно, поскольку мы используем только 5 потребителей. В статье TFT, где авторы используют всех 370 потребителей, эта переменная более значима.

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

Обнаружение экстремальных событий

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

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

Это какой-то случайный шум или скрытая устойчивая закономерность, ускользающая от нашей модели?

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

Не все значения некоторых объектов присутствуют в наборе проверочных данных, поэтому мы показываем только hour и consumer_id:

Рисунок 11: Прогнозы и фактические значения (нормализованные средние значения) за час
Рисунок 12: Прогнозы и фактические значения (нормализованные средние значения) для Consumer_id

На обоих рисунках результаты обнадеживают. В Рисунок 12, мы замечаем, что потребитель MT_004 немного отстает от других потребителей. Мы могли бы убедиться в этом, если нормализуем потери P50 каждого потребителя с их средним энергопотреблением, которое мы рассчитали ранее.

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

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

Мы можем беспрепятственно использовать Трансформатор временного синтеза Оптуна для выполнения настройки гиперпараметра:

Проблема в том, что, поскольку TFT — это модель на основе трансформатора, вам потребуются значительные аппаратные ресурсы!

Трансформатор временного синтеза несомненно, является важной вехой для сообщества временных рядов.

Модель не только достигает результатов SOTA, но также обеспечивает основу для интерпретации прогнозов. Модель также доступна в Дартс библиотека Python, основанная на библиотеке прогнозирования PyTorch.

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

Преобразователь временного слияния: прогнозирование временных рядов с помощью глубокого обучения — полное руководство, опубликованное из источника https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 через https://towardsdatascience.com/feed

<!–

->

Отметка времени:

Больше от Блокчейн-консультанты