В этой статье показано, как создавать многоэтапные прогнозы временных рядов с помощью XGBoost на примере 24-часового прогнозирования цен на электроэнергию.

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

XGBoost [1] — это быстрая реализация дерева с градиентным усилением. Он получил хорошие результаты во многих областях, включая прогнозирование временных рядов. Например, документ «Действительно ли нам нужны модели глубокого обучения для прогнозирования временных рядов?» показывает, что XGBoost может превзойти нейронные сети в ряде задач прогнозирования временных рядов [2].

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

Оставшаяся часть этой статьи структурирована следующим образом:

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


Описание набора данных и постановка задачи

Данные в этом руководстве представляют собой оптовые цены на электроэнергию на спотовом рынке в евро/МВтч из Дании. Данные находятся в свободном доступе на Энергидатасервис [4] (доступны по всемирной, бесплатной, неисключительной и иной неограниченной лицензии на использование [5]). Данные имеют почасовое разрешение, что означает, что в данный день имеется 24 точки данных. Мы будем использовать данные с 1 января 2017 года по 30 июня 2021 года, в результате чего будет получен набор данных, содержащий 39 384 почасовых наблюдения за оптовыми ценами на электроэнергию.

Цель этого руководства — показать, как использовать алгоритм XGBoost для создания прогноза Y, состоящего из mчасов прогноза цен на электроэнергию с учетом входных данных, X ,состоящий из nчасов прошлых наблюдений за ценами на электроэнергию. Этот тип проблемы можно рассматривать как задачу прогнозирования одномерных временных рядов. Более конкретно, мы сформулируем задачу прогнозирования как задачу машинного обучения под наблюдением.

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

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

Для контролируемой задачи машинного обучения нам нужен помеченный набор данных. Мы получаем помеченный набор данных, состоящий из пар (X,Y), с помощью так называемого подхода с фиксированной длиной скользящего окна. При таком подходе окно длиной n+m «скользит» по набору данных и в каждой позиции создает пару (X,Y). Скользящее окно начинается при первом наблюдении за набором данных и перемещается на S шагов при каждом скольжении. В этом уроке мы будем использовать размер шага S=12. Подход со скользящим окном взят из статьи «Действительно ли нам нужны модели глубокого обучения для прогнозирования временных рядов?» [2], в котором авторы также используют XGBoost для прогнозирования на несколько шагов вперед.

В коде помеченный набор данных получается путем создания списка кортежей, где каждый кортеж содержит индексы, которые используются для нарезки данных. Первый кортеж может выглядеть так: (0, 192). Это означает, что создается срез, состоящий из точек данных 0–192. Список индексных кортежей создается функцией get_indices_entire_sequence(), которая реализована в модуле utils.py репозитория. Для вашего удобства он отображается ниже.

Затем список индексных кортежей используется в качестве входных данных для функции get_xgboost_x_y(), которая также реализована в модуле utils.py в репозитории. Опять же, это показано ниже. Аргументами функции являются список индексов, набор данных (например, обучающие данные), горизонт прогноза, m, и длина входной последовательности, n. Функция выводит два пустых массива:

  1. Все входные данные модели, то есть X, имеющие форму (количество экземпляров, n).
  2. Все целевые последовательности, т. е. Y, имеющие форму (количество экземпляров, m).

Затем эти две функции используются для создания обучающих и тестовых наборов данных, состоящих из пар (X,Y), например:

Генерация многоэтапных прогнозов временных рядов с помощью XGBoost

После того, как мы создали данные, необходимо создать экземпляр модели XGBoost.

Затем мы оборачиваем его в функциональность MultiOutputRegressor() scikit-learn, чтобы модель XGBoost могла создавать выходную последовательность длиной более 1. Эта оболочка соответствует одному регрессору на цель, и каждая точка данных в целевой последовательности считается целью в этом контекст. Таким образом, когда мы прогнозируем на 24 часа вперед, обертка фактически соответствует 24 моделям для каждого экземпляра. Это делает функцию относительно неэффективной, но модель по-прежнему обучается намного быстрее, чем нейронная сеть, такая как модель трансформатора. Любознательному читателю кажется, что пакет xgboost теперь изначально поддерживает предсказания с несколькими выходами [3].

Обернутый объект также имеет функцию predict(), известную нам по другим моделям scikit-learn и xgboost, поэтому мы используем ее для создания тестовых прогнозов.

Модель прогнозирования временных рядов XGBoost способна давать разумные прогнозы прямо из коробки без настройки гиперпараметров. Как видно из записной книжки в репозитории к этой статье, средняя абсолютная ошибка прогнозов составляет 13,1 евро/МВтч. Среднее значение набора тестовых данных составляет 54,61 евро/МВтч.

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

Полный пример можно найти в блокноте в этом репозитории:



Краткое содержание

В этом руководстве мы рассмотрели, как обрабатывать ваши данные временных рядов, чтобы их можно было использовать в качестве входных данных для модели временных рядов XGBoost, а также мы увидели, как обернуть модель XGBoost в функцию с несколькими выходами, позволяющую модели производить выходные последовательности длиннее 1. Как видно из MAE и графика выше, XGBoost может давать разумные результаты без какой-либо предварительной обработки данных и настройки гиперпараметров. Это говорит о том, что XGBoost хорошо подходит для прогнозирования временных рядов — идея, которая также поддерживается в вышеупомянутой научной статье [2].

Вот и все! Надеюсь, вам понравился этот пост 🤞

Пожалуйста, оставьте комментарий, дайте мне знать, что вы думаете.

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

И не стесняйтесь связаться со мной в LinkedIn.

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

[1] https://arxiv.org/abs/1603.02754

[2] https://arxiv.org/abs/2101.02118

[3] https://www.linkedin.com/posts/tunguz_datascience-machinelearning-artificialintelligence-activity-6985577378005614592-HnXU?utm_source=share&utm_medium=member_desktop

[4] https://www.energidataservice.dk/tso-electricity/Elspotprices

[5] https://www.energidataservice.dk/Conditions_for_use_of_Danish_public_sector_data-License_for_use_of_data_in_ED.pdf