Прогнозируйте молниеносные одномерные временные ряды с помощью пакета Nixtla StatsForecast

StatsForecast — это пакет, в который входит набор статистических и эконометрических моделей для прогнозирования одномерных временных рядов. Он отлично работает с большими временными рядами и не только претендует на 20-кратное ускорение, чем известный пакет pmdarima, но и 500-кратное ускорение, чем фб пророк.

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

Мы будем использовать набор данных Общий объем продаж вина в Австралии для одного временного ряда. Набор данных будет использоваться для сравнения функции auto_arima StatsForecast с функцией известного пакета pmdarima. Второй — это выдержка из набора данных М4, который содержит 1,476 временных рядов. Идея второго примера состоит в том, чтобы показать вам, как подготовить данные для прогнозирования нескольких временных рядов с помощью пакета.

Почему так быстро?

Прежде чем мы начнем, вы можете быть настроены скептически и задаться вопросом, в чем секрет такой скорости. На это есть две основные причины.

Во-первых, StatsForecast использует Numba. Numba — это компилятор Just-In-Time (JIT) для Python, который довольно хорошо работает с кодом NumPy и преобразует такие части, как массивы, алгебраические функции и т. д., в быстрый машинный код.

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

Начало работы и предпосылки

Чтобы установить StatsForecast, просто выполните следующую команду, если хотите установить пакет с помощью pip:

pip install statsforecast

Чтобы установить его с помощью conda, выполните:

conda install -c nixtla statsforecast

Структура данных

StatsForecast должен иметь данные временных рядов в определенной структуре:

+-----------+----------+-------+
| unique_id |    ds    |   y   |
+-----------+------------------+
|     0     | Jan 2021 |  100  |
|     0     | Feb 2021 |  200  |
|     0     | Mar 2021 |  150  |
+-----------+------------------+
  • Индексный столбец с именем unique_id.
  • Столбец ds, содержащий дату или числовое значение.
  • Столбец y, который является целевой переменной нашего одномерного временного ряда.

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

Прогнозирование с помощью StatsForecast

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

Общий объем продаж вина в Австралии (отдельные временные ряды)

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

Поскольку это один временной ряд, мы устанавливаем индекс для всех данных равным 0, создаем ds столбец для даты и столбец y для значений продаж (строки 11–17).

После этого шага мы преобразуем столбец ds в datetime (строка 18). Общие данные о вине представлены на месячном уровне. Когда мы конвертируем его с помощью datetime, мы получаем формат год-месяц-день, всегда начиная с первого дня месяца. Позже это может привести к проблемам при использовании метода прогнозирования (дата результата всегда будет в конце месяца). Вот почему мы добавляем здесь MonthEnd(1).

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

После того, как мы привели наши данные в нужный вид, мы можем приступить к инициализации StatsForecast:

Для StatsForecast необходимы следующие параметры:

  • Фрейм (обучающий) данных
  • Модели, которые вы хотите использовать как кортежи с названием модели и соответствующими параметрами (auto_arima, 12)
  • Частота («M» для месяцев, «Y» для лет и т. д.)
  • Необязательным является параметр n_jobs, который можно использовать для включения параллельных вычислений при работе с несколькими временными рядами.

Как упоминалось в начале, StatsForecast поставляется с набором других статистических и эконометрических моделей. Вы можете указать несколько параметров моделей (строка 7) в виде кортежей с их конкретными параметрами. Полный список всех представленных моделей можно найти здесь.

В этом примере мы используем только модель auto_arima и устанавливаем для параметра длины сезона значение 12. Параметр n_job по умолчанию имеет значение 1. Его увеличение имеет смысл только в том случае, если у нас есть несколько временных рядов в нашем наборе данных.

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

Время вычисления заняло всего 2,78 с.

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

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

Мы получаем MAE 1592,865459735577.

Сравнение с пакетом pmdarima

Давайте теперь сравним производительность и точность с auto_arima function пакета pmdarima.

При использовании подхода StatsForecast auto_arima мы имеем время вычислений 86 секунд и MAE 1951,2410193026085

Сравнивая производительность обоих пакетов и отображая результаты прогноза на графике (рис. 3), мы видим, что StatsForecast auto_arimaработает в 30 раз быстрее и точнее, чем пакет pmdarima. .

Данные M4 (несколько временных рядов)

Поскольку мы уже знакомы с прогнозированием одного временного ряда, мы сосредоточимся на более сложном примере. Данные M4 можно найти здесь. Для ради простоты и демонстрации мы ориентируемся только на ежедневные данные для микроэкономических временных рядов (1,476 различных временных рядов). Как упоминалось выше, цель этого раздела — показать вам, как привести несколько временных рядов в правильную форму для StatsForecast.

Начнем с загрузки частей набора данных M4 и преобразования столбцов в строки:

Необработанные данные (рис. 4) будут преобразованы в следующую форму (рис. 5).

После этого шага мы добавляем информацию о наборе данных (в основном о его категории) в наш тест и обучаем кадры данных (строки 2–3). Мы также создаем индекс unique_id, который содержит категорию и идентификатор каждого временного ряда (строки 5–6).

Результат после этих шагов пререкания выглядит так:

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

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

Код добавляет к каждому временному ряду последовательность чисел (начиная с 1), которые представляют соответствующие дни. Помните: столбец ds может содержать числовые значения или даты. Результат выглядит следующим образом:

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

Мы устанавливаем продолжительность сезона на 7 и частоту на «D», потому что у нас есть ежедневные данные. В отличие от нашего первого примера, мы устанавливаем n_jobs не на 1, а на количество различных временных рядов, которые мы хотим спрогнозировать. n_jobs определяется количеством доступных ядер и различными временными рядами. Если временных рядов больше, чем доступных ядер, функция min вернет количество доступных ядер.

Выполнение прогноза заняло 3 минуты 11 секунд при MAE 3541,514063940959.

Заключение

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

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

Дополнительные ссылки

👉 github-страница StatsForecast

👉 Статья TDS от соучредителя Федерико Гарса Рамиреса

👉 github-страница Pmdarima

👉 Обзор метрик ошибок временных рядов