Руководство по оптимизации гиперпараметров для более точных прогнозов: от трендов и сезонности до прогнозов AR-Net.

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

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

ВНИМАНИЕ: библиотека меняется и могут быть различия от версии к версии. В следующих параграфах мы покажем, как наиболее важные параметры влияют на модель, и дадим некоторые рекомендации по их использованию. Мы сосредоточимся на экспериментах, которые мы проводили в версии 0.3.2. Пожалуйста, прочитайте официальную документацию [1] для получения исчерпывающего и обновленного понимания всех из них.

Параметры, связанные с трендом

Мы начнем с самого известного компонента: тренда, который представляет собой долгосрочное изменение временного ряда.

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

  • n_changepoints: количество точек изменения, выбранных в серии для тренда.
  • changepoint_range: диапазон обучающих данных, используемых в соответствии с тенденцией.

Значение по умолчанию для changepoint_range — 0,8, а значение по умолчанию для n_changepoint — 5. Это означает, что 5 точек изменения будут распределены на равном расстоянии в первых 80% обучающих данных. набор.

диапазон_точки_изменения

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

n_changepoints

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

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

trend_reg

В дополнение к этим двум основным параметрам можно изменять параметр trend_reg. Это упорядочивает скорость роста точки изменения, а значит, упорядочивает изменения скорости тренда.

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

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

Параметры, связанные с сезонностью

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

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

ежедневная_сезонность, еженедельная_сезонность, годовая_сезонность

Значения по умолчанию: ежедневная_сезонность =6, еженедельная_сезонность =4, ежедневная_сезонность =6. Иногда эти значения не отражают сезонность наших рядов: наша дневная сезонность может быть более плавной, а годовая сезонность — более резкой, но, к счастью, можно изменить порядок Фурье для удовлетворения конкретных потребностей.

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

График на рисунке 5 представляет годовую сезонность, если установлено значение 6, а график на рисунке 7 представляет годовую сезонность, если установлено значение 5. Чем выше порядок Фурье, тем выше сложность модели.

сезонность_рег

Аналогично тренду, параметр регуляризации может быть установлен и для сезонности, этот параметр называется Seasonity_reg, а значение по умолчанию равно 0. «Маленькие значения (0,1–1) позволяют соответствовать большим сезонным колебаниям, тогда как большие значения в диапазон 1–100 налагает более серьезные штрафы на коэффициенты Фурье и, таким образом, ослабляет сезонность». Давайте выясним его влияние на примере:

На рисунке 7 для yearly_ Seasonality установлено значение 6, а для Seasonality_reg установлено значение 0, а на рисунке 8 для yearly_ Seasonality установлено значение 6, а для Seasonality_reg больше 50. Как видите, во втором случае амплитуда уменьшается (обратите внимание, в первом случае ось y находится в диапазоне от -2000 до 2000, а во втором - от от -1000 до 1000). Влияние этого параметра довольно сильное, и его трудно контролировать, поскольку он колеблется от 0 до 100 со странной динамикой. Поэтому мы советуем попробовать различные возможные значения годовой, дневной и еженедельной сезонности, а затем попытаться смоделировать Seasonality_reg, позволяя ему изменяться в небольших диапазонах.

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

Существует 4 основных параметра, касающихся авторегрессии: n_lags, ar_reg, num_hidden_layers и d_hidden.

n_lags

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

ar_reg

Строго говоря, следующий параметр называется ar_reg и регулирует степень разреженности (рис. 9). Если вы выбрали высокое значение для n_lags (поскольку вы оцениваете долгосрочные зависимости или прогнозируете далекое будущее), этот параметр может помочь снизить вычислительные затраты и устранить неважные задержки. Аналогично другим параметрам регуляризации вы можете настроить их, а не исправлять.

num_hidden_layers, d_hidden

Последние два параметра относятся к конфигурации глубокого AR. Этими параметрами являются: num_hidden_layers и d_hidden ,первый позволяет нам выбирать, сколько скрытых слоев мы хотим, второй позволяет нам определить, как много нейронов в каждом слое. Эти параметры можно подключить к конвейеру настройки, чтобы найти наилучшие значения. Однако риск чрезмерно сложных моделей высок. На рисунке 10 можно оценить, как количество нейронов в скрытом слое влияет на динамику, изучаемую моделью. Глубокую AR целесообразно реализовывать только в том случае, если вы знаете, что динамика нелинейна.

Параметры, связанные с моделью

К модели относятся пять основных параметров: loss_func, оптимизатор, пакетный размер, эпохи и скорость обучения. Благодаря работе ребят из NeuralProphet строго необходимы только первые два.

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

Параметры batch_size и epochs не являются обязательными, поскольку авторы реализовали некоторую эвристику для автоматического выбора подходящих значений (рис. 11 слева). сторона). Автоматические значения — хороший выбор для быстрого тестирования модели или в качестве эталона. Однако мы предлагаем поэкспериментировать с ними. Например, нам пришлось использовать более широкий размер пакета по сравнению с тем, который был выбран эвристикой, чтобы справиться с проблемами переобучения.

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

Дополнительные параметры

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

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

Затем есть некоторые параметры обработки данных (impute_missing, imput_linear, impute_rolling, drop_missing). Они предназначены для того, чтобы выбрать, как справиться с недостающими данными, отбросить их или приписать их, и как. Хотя эта возможность может показаться особенно полезной, мы хотели бы предупредить вас о компромиссе с точки зрения контроля. Действительно, если вы выберете конвейер вменения отсутствующих данных, вы потеряете контроль над этими недостающими данными. В нашем случае отсутствие данных означает сбой в конвейере данных, поэтому мы отключили такое вменение, чтобы в случае отсутствия данных алгоритм остановился и выдал ошибку, и мы могли понять, что что-то пошло не так. Также есть очень полезный параметр для нормализации: normalize. NeuralProphet предоставляет различные методы нормализации: от min-max до 0-центрированного. Далее можно нормализовать как переменную отклика, так и регрессоры.

И последнее, но не менее важное: глобальные параметры модели: global_normalization, global_time_normalization,known_data_notmalization. Одним из величайших преимуществ NeuralProphet является возможность реализации глобальной модели. Эта конфигурация позволяет моделировать несколько похожих временных рядов с помощью одной общей модели. Каждый временной ряд может иметь свои собственные регрессоры, но в целом тренд и сезонность являются общими. Однако в последних версиях эти компоненты можно моделировать независимо. Помимо явного преимущества в вычислениях и времени, такая конфигурация позволяет прогнозировать новые или неполные серии благодаря параметрам, изученным на других. Кроме того, было показано, что глобальные модели обеспечивают лучшее обобщение и меньшее переобучение по сравнению с несколькими локальными моделями. Это справедливо и при рассмотрении сложных моделей, которые, если их принять на местном уровне, будут переобуваться. Интересно, что было показано, что всегда существует глобальная модель, работающая по крайней мере так же хорошо, как локальные модели, независимо от родственности рядов [4]. Тем не менее, как показано в [5], существует множество других факторов, которые могут повлиять на это утверждение. Наконец, если рассматривать все временные ряды одновременно, размер обучения резко увеличился.

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

Заключение

В этом руководстве представлен обзор того, как настроить гиперпараметры Neural Prophet для оптимизации. С помощью этой статьи ученые, работающие с данными, теперь могут выполнять настройку гиперпараметров с гораздо лучшим пониманием. Кроме того, мы включили некоторые идеи из нашего опыта, чтобы дать вам советы, которые являются результатом месяцев экспериментов (и неудач).

В заключение отметим, что благодаря возможности настройки гиперпараметров и дополнительной гибкости компонента AR-Net возможности этой модели безграничны: от простых со всеми параметрами по умолчанию до тщательно настроенных. Однако важно помнить, что модель постоянно развивается и совершенствуется, поэтому крайне важно быть в курсе последних событий. В целом, NeuralProphet — мощный инструмент, который определенно стоит изучить всем, кто интересуется прогнозированием временных рядов. Действительно, наше путешествие началось с простой модели по умолчанию, просто для изучения инструмента, а теперь это точно настроенная модель в производстве.

Эта статья была написана в сотрудничестве с Риккардо Тамбоне.

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

[1] О. Трибе, Х. Хевамалаж, П. Пилюгина, Н. Лаптев, К. Бергмейр и Р. Раджагопал, «NeuralProphet: объяснимое прогнозирование в масштабе», arXiv,2021.

[2] Документация NeuralProphet, [Онлайн]. Доступно: https://neuralprophet.com/.

[3] О. Трибе, Н. Лаптев и Р. Раджагопал, «AR-Net: простая авторегрессивная нейронная сеть для временных рядов», arXiv,2019.

[4] П. Монтеро-Мансо и Р. Дж. Хиндман, «Принципы и алгоритмы прогнозирования групп временных рядов: локальность и глобальность», International Journal of Forecasting,vol. 37, нет. 4, стр. 1632–1653, 2021.

[5] Х. Хевамалаж, К. Бергмейр и К. Бандара, «Глобальные модели прогнозирования временных рядов: исследование с помощью моделирования», Pattern Recognition,vol. 124, 2022.