--- 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" ---
{% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}
{% endraw %} {% raw %}
{% endraw %}

Tests

{% raw %}
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.'
    )
{% endraw %} {% raw %}
test_no_leakage_season(n_series=10, input_size=10, output_size=8, seasonality=[6])
{% endraw %} {% raw %}
test_no_leakage_season(n_series=10, input_size=10, output_size=2, seasonality=[6])
{% endraw %} {% raw %}
test_no_leakage_season(n_series=10, input_size=10, output_size=8, seasonality=[12, 24])
{% endraw %} {% raw %}
test_no_leakage_season(n_series=10, input_size=10, output_size=8, seasonality=[6, 12])
{% endraw %}