Понимание того, как Prophet делает то, что делает.

Этот пост является продолжением предыдущей статьи, в которой мы использовали упрощенную модель Prophet для прогнозирования индекса FTSE100. В этом посте мы рассмотрим некоторые внутренние механизмы модели Пророка, чтобы понять, как именно составляются прогнозы.

Сюжет компонентов Prophet

Используя предыдущий пример FTSE100, мы можем вызвать model.plot_components (прогноз_df) для построения графиков ниже.

Эти графики дают нам некоторое представление о том, как формируется модель. График тренда (вверху) показывает линейную, кусочную функцию с приблизительно соответствующими значениями для нашего набора данных на протяжении многих лет. Похоже, это базовый уровень для прогнозов.
Недельный график (в центре) демонстрирует интересное поведение - будние дни имеют небольшое отрицательное влияние на прогнозы (примерно -50), а по выходным мы видим большие всплески. Это кажется странным, поскольку в нашем наборе данных нет данных за выходные, но это результат подгонки 7-дневной периодической функции только к 5-дневным данным. К счастью, это не проблема, так как нам не нужно прогнозировать выходные.
Годовой график (внизу) показывает гораздо более изменчивое влияние на прогнозы (от -200 до +180) с частыми точками изменения повсюду. Это указывает на более чувствительную и сложную взаимосвязь между временем года и индексом FTSE100, чем день недели.

Как сформулирован Пророк?

Prophet принимает фрейм данных минимум с двумя столбцами: «ds» - наша временная метка, а «y» - наша целевая переменная. В этом есть смысл, поскольку приведенная выше формула отображает только функции, зависящие от t (времени).

y (t) - наша функция, которая просто описывает прогноз.
g (t) - наша функция тренда, это может быть кусочно-линейный или кусочно-логистический тренд. (Вы можете выбрать рост = 'flat', чтобы удалить здесь любую аппроксимацию тренда, хотя это приведет к большой неопределенности в любых нестандартных наборах данных.)
s (t) - наша сезонная функция, это ряд Фурье. приближение к внутрисуточным, недельным или годовым сезонным компонентам. Они устанавливаются автоматически при обнаружении внутрисуточных / еженедельных / годовых данных.
h (t) - наша функция праздников / событий. Prophet принимает фрейм данных с датами и верхние / нижние окна, в которых временные ряды могут быть затронуты этими событиями. Они были опущены в базовой модели.
ε - наши члены погрешности, предполагается, что они распределены нормально.

Функция тренда

Функция тренда обычно принимает одну из двух форм: кусочно-линейный или кусочно-логистический тренд роста. В прогнозе FTSE100 использовалась линейная кусочная аппроксимация (и это правильно, поскольку моделирование большинства финансовых инструментов, поскольку логистический рост является опасной практикой…).

Линейный рост
L
годового роста обычно моделируется как вариант:

Где f (t) - наше приближение, k - наша скорость роста, t - время, а m - некоторое значение смещения, чтобы приспособиться к различным окнам нашей зависимой переменной, t.
В приведенном ниже примере есть скорость роста (k) равно 1, а смещение (м) равно 2.

Prophet расширяет эту модель и использует компактные обозначения для описания сложностей при расширении ее до кусочно-линейной модели роста:

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

Вектор a (t) представляет двоичные выходные данные, которые показывают, какие корректировки скорости роста действительны для данного момента времени. Это переключатель «вкл / выкл» для наших корректировок темпа роста (и параметра смещения). Он транспонирован, чтобы обеспечить допустимое умножение векторов на вышеупомянутые векторы.
Вектор δ представляет наш вектор корректировок скорости роста, если у нас есть 5 различных линейных темпов роста, он будет просто содержать 5 различных значений для наших корректировок скорости роста (k корректируется значением в δ). Умножение на наш (транспонированный) вектор a (t) просто дает правильную корректировку скорости роста для этого момента времени.
Вектор τ представляет наши корректировки для параметр смещения (м). Так же, как наш вектор δ, при умножении на наш (транспонированный) вектор a (t) дает правильную корректировку скорости роста, это дает правильную корректировку параметра смещения для соедините концы линейных «кусочков», которые образуют нашу кусочную функцию.

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

Логистический рост
Логистический рост обычно моделируется как несколько вариаций:

Где f (t) - наше приближение, C - пропускная способность или потолок для нашей популяции, k - наш темп роста, t - время и m - некоторая величина смещения, чтобы приспособиться к различным окнам нашей зависимой переменной, t. < br /> Эта модель приближается и выходит на плато в точке C, когда наш экспоненциальный член (e) приближается к нулю. В приведенном ниже примере показана пропускная способность ©, равная 10, скорость роста (k), равная 1, и смещение ( м) из 0.

Prophet расширяет эту модель дальше, получая следующее уравнение:

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

Наша постоянная пропускная способность C становится C (t), что означает, что она зависит от времени, а не от константы. Остальные поправки к формуле точно такие, как описано в разделе линейного роста.

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

Автоматический выбор точки изменения тенденции
Prophet автоматически выбирает точки изменения скорости роста. Это достигается путем создания единого набора точек изменения «A» (по умолчанию 25), выведенных из первого процента «B» (по умолчанию 80) нашего набора данных. Применяется разреженный (лапласовский) априор, как показано ниже, где параметр τ позволяет нам напрямую контролировать частоту ненулевых значений. Это, в свою очередь, контролирует количество потенциальных точек изменения тренда, которые в конечном итоге используются.

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

Затем мы можем сравнить этот график с выбранными точками изменения тренда.

Мы можем наблюдать сокращение с 25 потенциальных точек изменения до 10 завершенных. Здесь важно отметить, что, когда τ приближается к 0, модель не выбирает точек изменения тренда, это означает, что аппроксимация будет выполнена с исходной скоростью роста (k) и будет напоминать стандартную линейную / логистическую модель роста, а не модель. кусочная модель, которую мы здесь обсуждали.

Сезонная функция

Сезонная функция состоит из приближений ряда Фурье к нашим внутридневным, недельным и годовым тенденциям. В примере с FTSE100, поскольку у нас нет внутридневных данных, таким образом аппроксимируются только недельные и годовые тренды. Ряд Фурье аппроксимирует функцию (или сигнал) путем суммирования синусоидальных и косинусоидальных волн, как показано ниже.

Если нотация вас не устраивает, надеюсь, простой пример аппроксимации «пилообразного сигнала» поможет прояснить этот процесс. Красная линия - это сигнал, который мы пытаемся аппроксимировать, а синяя линия - это приближение нашего ряда Фурье. Мы увеличиваем количество терминов с 2 до 10 до 50.

Как показывают приведенные выше графики, по мере того, как количество членов увеличивается (или приближается к бесконечности), приближение приближается к исходному сигналу. Это увеличение количества терминов означает, что в аппроксимацию включается больше «высокочастотных» волн, что приводит к большому количеству колебаний на нашем 50-членном графике.
По умолчанию Prophet укладывает еженедельную сезонность в 3 члена. , а также годовая сезонность с 10 сроками. Эти несколько условий обеспечивают подгонку к низкочастотным сезонным трендам, делая модель менее чувствительной к большим резким сезонным колебаниям и потенциальному переобучению.

После того, как сезонные компоненты аппроксимируются с помощью ряда Фурье, применяется предварительное сглаживание (см. Ниже) для генерации сезонного компонента модели s (t).

Праздничная функция

Prophet позволяет вводить пользовательские даты для обозначения соответствующих событий в наборе данных. Это полезно, когда аналитик обладает знаниями в конкретной предметной области, которые могут помочь в прогнозировании. Библиотека Prophet также содержит список национальных (и независимых) праздников, а также возможные диапазоны их влияния на модель.
Хотя мы не использовали праздники в нашей исходной модели, мы можем импортировать (встроенный) Праздники Великобритании и покажите их.

Для указанных праздников вокруг них строится диапазон дат, позволяющий каждому празднику влиять на диапазон дат с обеих сторон. Параметр (для изменения прогноза) присваивается дням в указанном диапазоне. Затем применяется предварительное сглаживание (см. Ниже).

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

Резюме

Хотя Facebook Prophet предлагает быстрый и интуитивно понятный способ прогнозирования данных временных рядов, может быть полезно понять некоторые внутренние механизмы ваших моделей. Надеюсь, эта статья развеивает немного магии Пророка. В следующей статье будет обсуждаться выбор гиперпараметров с использованием некоторых представлений о модели, которые мы получили здесь.