Building load forecasting: Hospital in SF

We can train a forecaster on another commom energy problem. In this, case we are training a 1-step ahead forecaster to predict the electricity consumption of a building.

The dataset contains one year of hourly observations. The training will occur on 11 months of the data, reserving the last month for evaluation.

[1]:
if 'google.colab' in str(get_ipython()):
    !pip install git+https://github.com/ourownstory/neural_prophet.git # may take a while
    #!pip install neuralprophet # much faster, but may not have the latest upgrades/bugfixes

import pandas as pd
from neuralprophet import NeuralProphet, set_log_level
# set_log_level("ERROR")
[2]:
# data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"
data_location = '../../../neuralprophet-data/datasets/'

sf_load_df = pd.read_csv(data_location +  'energy/SF_hospital_load.csv')
[3]:
sf_load_df.head(3)
[3]:
ds y
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

Generic forecast: Time-based features only

In this first section, we will train a model with time-features only like we would do with Facebook Prophet.

[4]:
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='plot')
_images/energy_hospital_load_5_0.png
log-SmoothL1Loss
        training                 (min:   -5.110, max:   -0.354, cur:   -5.110)
        validation               (min:   -4.747, max:   -0.412, cur:   -4.552)
[5]:
metrics.tail(1)
[5]:
SmoothL1Loss MAE RMSE RegLoss SmoothL1Loss_val MAE_val RMSE_val
108 0.006034 45.99676 63.704651 0.002061 0.010543 60.436569 86.829773
[6]:
forecast = m.predict(df_train)
fig = m.plot(forecast)
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.988% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.988% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
_images/energy_hospital_load_7_1.png
[7]:
forecast = m.predict(df_test)
m = m.highlight_nth_step_ahead_of_each_forecast(1)
fig = m.plot(forecast[-7*24:])
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.863% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.863% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
_images/energy_hospital_load_8_1.png
[8]:
fig_param = m.plot_parameters()
_images/energy_hospital_load_9_0.png

1-step ahead forecast with Auto-Regression

[9]:
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='plot')
_images/energy_hospital_load_11_0.png
log-SmoothL1Loss
        training                 (min:   -6.431, max:   -0.740, cur:   -6.293)
        validation               (min:   -6.479, max:   -1.179, cur:   -6.295)
[10]:
metrics.tail(1)
[10]:
SmoothL1Loss MAE RMSE RegLoss SmoothL1Loss_val MAE_val RMSE_val
108 0.001849 23.766048 35.326185 0.00114 0.001845 23.998619 36.330311
[11]:
forecast = m.predict(df_train)
fig = m.plot(forecast)
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.988% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.988% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
_images/energy_hospital_load_13_1.png
[12]:
forecast = m.predict(df_test)
m = m.highlight_nth_step_ahead_of_each_forecast(1)
fig = m.plot(forecast[-7*24:])
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.874% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.875% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
_images/energy_hospital_load_14_1.png
[13]:
fig_param = m.plot_parameters()
_images/energy_hospital_load_15_0.png

1-step ahead forecast with AR-Net: Using a Neural Network

Here, we will use the power of a neural Network to fit non-linear patterns.

[14]:
m = NeuralProphet(
    growth='off',
    yearly_seasonality=False,
    weekly_seasonality=False,
    daily_seasonality=False,
    n_lags=3*24,
    num_hidden_layers=4,
    d_hidden=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='plot')
_images/energy_hospital_load_17_0.png
log-SmoothL1Loss
        training                 (min:   -8.839, max:   -2.890, cur:   -8.839)
        validation               (min:   -8.656, max:   -3.286, cur:   -8.642)
[15]:
metrics.tail(1)
[15]:
SmoothL1Loss MAE RMSE RegLoss SmoothL1Loss_val MAE_val RMSE_val
108 0.000145 6.901227 9.84333 0.0 0.000176 7.593913 11.234858
[16]:
forecast = m.predict(df_train)
fig = m.plot(forecast)
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.988% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.988% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
_images/energy_hospital_load_19_1.png
[17]:
forecast = m.predict(df_test)
m = m.highlight_nth_step_ahead_of_each_forecast(1)
fig = m.plot(forecast[-7*24:])
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.874% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
INFO - (NP.df_utils._infer_frequency) - Major frequency H corresponds to 99.875% of the data.
INFO - (NP.df_utils._infer_frequency) - Defined frequency is equal to major frequency - H
_images/energy_hospital_load_20_1.png
[18]:
fig_comp = m.plot_components(forecast[-7*24:])
_images/energy_hospital_load_21_0.png
[ ]:

[ ]: