--- title: Exponential Smoothing - Recurrent Neural Network keywords: fastai sidebar: home_sidebar summary: "ESRNN pytorch implementation." description: "ESRNN pytorch implementation." nb_path: "nbs/models_esrnn__esrnn_model.ipynb" ---
def test_no_leakage_season(n_series, input_size, output_size, seasonality):
"""
This test checks no leakage for seasonality.
"""
t.manual_seed(1)
model = _ESRNN(n_series=n_series, input_size=input_size, output_size=output_size,
output_size_m=1, n_t=0, n_s=0,
es_component='multiplicative', seasonality=seasonality, noise_std=0.000000001,
cell_type='GRU',
add_nl_layer=False, dilations=[[1, 2]], state_hsize=30)
S = t.empty((n_series, 0))
X = t.empty((n_series, 0))
Y = t.normal(0, 1, (n_series, 2 * (input_size + output_size)))
Y += Y.min().abs() + 10
idxs = t.arange(n_series)
# Testing different values for output_size
# forecasts should be the same in all cases
# except for numeric exceptions
Y_to_test = [Y] * 4
Y_to_test[1][:, -output_size:] = 10_000
Y_to_test[2][:, -output_size:] = 0
Y_to_test[3][:, -output_size:] = -10_000
forecasts = []
for Y in Y_to_test:
# forward es and rnn
windows_y_insample, windows_y_outsample, levels, seasonalities = model.es(S, Y, X, idxs, step_size=1)
trends = model.rnn(windows_y_insample)
trends = trends.permute(1, 0, 2)
# predict es
y_hat = model.es.predict(trends=trends, levels=levels, seasonalities=seasonalities, step_size=1)
forecasts.append(y_hat)
assert all(t.allclose(forecasts[0], forecast) for forecast in forecasts), (
'Season leakage detected ',
'please check.'
)
test_no_leakage_season(n_series=10, input_size=10, output_size=8, seasonality=[6])
test_no_leakage_season(n_series=10, input_size=10, output_size=2, seasonality=[6])
test_no_leakage_season(n_series=10, input_size=10, output_size=8, seasonality=[12, 24])
test_no_leakage_season(n_series=10, input_size=10, output_size=8, seasonality=[6, 12])