Прогнозирование потребности в энергии: Прогноз нагрузки для больницы в Сан-Франциско

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

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

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 # может занять некоторое время
    #!pip install neuralprophet # намного быстрее, но может не иметь последних обновлений/исправлений ошибок

import pandas as pd
from neuralprophet import NeuralProphet, set_log_level

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

sf_load_df = pd.read_csv(data_location + "energy/SF_hospital_load.csv")
sf_load_df.head(3)
dsy

0

2015-01-01 01:00:00

778.007969

1

2015-01-01 02:00:00

776.241750

2

2015-01-01 03:00:00

779.357338

Общий прогноз: только функции, основанные на времени.

В этом первом разделе мы будем обучать модель только с функциями времени, как если бы мы делали это с Facebook Prophet.

m = NeuralProphet(
    weekly_seasonality=6,
    daily_seasonality=10,
    trend_reg=1,
    learning_rate=0.01,
)
df_train, df_test = m.split_df(sf_load_df, freq="H", valid_p=1.0 / 12)

metrics = m.fit(df_train, freq="H", validation_df=df_test, progress="bar")
metrics.tail(1)
MAE_valRMSE_valLoss_valRegLoss_valepochMAERMSELossRegLoss

108

57.975113

80.128593

0.008979

0.0

108

46.005161

63.305355

0.004436

0.0

forecast = m.predict(df_train)
m.set_plotting_backend("plotly-static")
m.plot(forecast)
forecast = m.predict(df_test)
m = m.highlight_nth_step_ahead_of_each_forecast(1)
m.plot(forecast[-7 * 24 :])
m.plot_parameters()

Прогноз на 1 шаг вперед с авторегрессией

m = NeuralProphet(
    growth="off",
    yearly_seasonality=False,
    weekly_seasonality=False,
    daily_seasonality=False,
    n_lags=3 * 24,
    ar_reg=1,
    learning_rate=0.01,
)
df_train, df_test = m.split_df(sf_load_df, freq="H", valid_p=1.0 / 12)

metrics = m.fit(df_train, freq="H", validation_df=df_test, progress="bar")
metrics.tail(1)
MAE_valRMSE_valLoss_valRegLoss_valepochMAERMSELossRegLoss

108

24.246571

37.293633

0.002822

0.000877

108

23.822706

35.911766

0.002339

0.000877

forecast = m.predict(df_train)
m.set_plotting_backend("plotly-static")
m.plot(forecast)
forecast = m.predict(df_test)
m = m.highlight_nth_step_ahead_of_each_forecast(1)
m.plot(forecast[-7 * 24 :])
m.plot_parameters()

Прогноз на 1 шаг вперед с AR-Net: использование нейронной сети

Здесь мы будем использовать мощь нейронной сети для аппроксимации нелинейных закономерностей.

m = NeuralProphet(
    growth="off",
    yearly_seasonality=False,
    weekly_seasonality=False,
    daily_seasonality=False,
    n_lags=3 * 24,
    ar_layers=[32, 32, 32, 32],
    learning_rate=0.003,
)
df_train, df_test = m.split_df(sf_load_df, freq="H", valid_p=1.0 / 12)

metrics = m.fit(df_train, freq="H", validation_df=df_test, progress="bar")
metrics.tail(1)
MAE_valRMSE_valLoss_valRegLoss_valepochMAERMSELossRegLoss

108

7.14312

10.696775

0.00016

0.0

108

6.197587

9.060362

0.000093

0.0

forecast = m.predict(df_train)
m.set_plotting_backend("plotly-static")
m.plot(forecast)
forecast = m.predict(df_test)
m = m.highlight_nth_step_ahead_of_each_forecast(1)
m.plot(forecast[-7 * 24 :])
m.plot_components(forecast[-7 * 24 :])

Last updated