Урок 3: Сезонность

Компонент сезонности в NeuralProphet позволяет модели улавливать сезонные эффекты, такие как положительное или отрицательное влияние для определенного дня недели.

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

import pandas as pd
from neuralprophet import NeuralProphet, set_log_level

# Отключение сообщений журнала, кроме случаев ошибок
set_log_level("ERROR")

# Загрузка набора данных из CSV-файла с помощью pandas
df = pd.read_csv("https://github.com/ourownstory/neuralprophet-data/raw/main/kaggle-energy/datasets/tutorial01.csv")

# Модель и прогнозирование с годовой сезонностью
m = NeuralProphet(
    # Отключение точек изменения тренда
    n_changepoints=0,
    # Отключение компонентов сезонности, кроме годовой
    yearly_seasonality=True,
    weekly_seasonality=False,
    daily_seasonality=False,
)
m.set_plotting_backend("plotly-static")
metrics = m.fit(df)
forecast = m.predict(df)
m.plot(forecast)

При построении всех компонентов прогноза мы видим, что прогноз состоит из тренда и годовой сезонности, добавляемых аддитивным способом. Это означает, что наш прогноз y является суммой тренда и сезонности:

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

m.plot_components(forecast)

Функции plot_parameters и plot_components позволяют указать, какие компоненты нужно визуализировать. Таким образом, в следующих визуализациях мы сосредоточимся исключительно на сезонности, не отображая тренд.

Альтернативный способ визуализации сезонности состоит в том, чтобы изобразить параметры модели с помощью plot_paramters. На следующей визуализации показан вклад сезонности только за один период, здесь за один год для годовой сезонности.

m.plot_parameters(components=["seasonality"])

Сезонность в NeuralProphet моделируется с помощью Фурье-терминов. Можно считать, что Фурье-термины - это сумма нескольких функций синуса и косинуса с различными периодичностями и магнитудами. Таким образом, NeuralProphet может моделировать множественные сезонности. Сезонность может иметь произвольные периодичности (длину), например, годовую сезонность с ежедневными данными (\(p = 365.25\)) или с еженедельными данными (\(p = 52.18\)).

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

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

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

# Модель и прогнозирование
m = NeuralProphet(
    # Отключение точек изменения тренда
    n_changepoints=0,
    # Включение всех компонентов сезонности
    yearly_seasonality=True,
    weekly_seasonality=True,
    daily_seasonality=True,
)
m.set_plotting_backend("plotly-static")
metrics = m.fit(df)
forecast = m.predict(df)
m.plot(forecast)
m.plot_components(forecast, components=["seasonality"])

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

Для недельной сезонности мы можем увеличить изображение или построить график одного периода с помощью plot_parameters.

m.plot_parameters(components=["seasonality"])

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

Last updated