Субдневные данные

NeuralProphet может делать прогнозы для временных рядов с субдневными наблюдениями, если передать в него датафрейм со временными метками в столбце ds. Формат временных меток должен быть YYYY-MM-DD HH:MM:SS - см. пример csv файла здесь. Когда используются субдневные данные, дневная сезонность будет автоматически учитываться.

В этом разделе мы применяем NeuralProphet к данным с разрешением в 5 минут (ежедневные температуры в Йосемити).

if "google.colab" in str(get_ipython()):
    # Удаляем предустановленные пакеты из Colab, чтобы избежать конфликтов
    !pip uninstall -y torch notebook notebook_shim tensorflow tensorflow-datasets prophet torchaudio torchdata torchtext torchvision
    !pip install git+https://github.com/ourownstory/neural_prophet.git@examples_cond_seas # может занять некоторое время
    #!pip install neuralprophet # намного быстрее, но может не иметь последних обновлений/исправлений ошибок

import pandas as pd
from neuralprophet import NeuralProphet, set_log_level, df_utils

set_log_level("ERROR")
data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"

df = pd.read_csv(data_location + "yosemite_temps.csv")

Теперь мы попытаемся предсказать погоду на следующие 7 дней. Разрешение данных 5 минут означает, что у нас есть 60/5*24=288 значений в день. Таким образом, мы хотим сделать прогноз на 7*288 периодов вперёд.

Используя здравый смысл, мы устанавливаем:

  • Во-первых, мы отключаем недельную сезонность, поскольку природа не следует календарю человеческой недели.

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

m = NeuralProphet(
    n_changepoints=0,
    weekly_seasonality=False,
)
m.set_plotting_backend("plotly-static")
metrics = m.fit(df, freq="5min")
future = m.make_future_dataframe(df, periods=7 * 288, n_historic_predictions=True)
forecast = m.predict(future)
m.plot(forecast)
m.plot_parameters()

Повседневная сезонность кажется логичной, если учитывать, что время записывается в формате GMT, тогда как местное время в Йосемити — GMT-8

Улучшение тренда и сезонности

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

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

  • увеличиваем changepoints_range, так как мы делаем краткосрочный прогноз

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

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

m = NeuralProphet(
    changepoints_range=0.95,
    n_changepoints=50,
    trend_reg=1,
    weekly_seasonality=False,
    daily_seasonality=10,
)
m.set_plotting_backend("plotly-static")
metrics = m.fit(df, freq="5min")
future = m.make_future_dataframe(df, periods=60 // 5 * 24 * 7, n_historic_predictions=True)
forecast = m.predict(future)
m.plot(forecast)
m.plot_parameters()

Last updated