Субдневные данные
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