awslabs / gluonts

Probabilistic time series modeling in Python
https://ts.gluon.ai
Apache License 2.0
4.55k stars 748 forks source link

Plotting issues using MQCNN #1736

Closed parora07234 closed 2 years ago

parora07234 commented 2 years ago

I have plotted probabilistic forecasts using DeepAr and DeepState (prediction intervals) , but now I want to use MQCNN/MQRNN , but could not understand how to plot quantile forecast.

!pip install matplotlib

# Commented out IPython magic to ensure Python compatibility.
# %matplotlib inline
import mxnet as mx
from mxnet import gluon
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import json

!pip install gluonts

from gluonts.dataset.repository.datasets import get_dataset, dataset_recipes
from gluonts.dataset.util import to_pandas

print(f"Available datasets: {list(dataset_recipes.keys())}")

dataset = get_dataset("electricity_nips", regenerate=False)

entry = next(iter(dataset.train))
train_series = to_pandas(entry)
train_series.plot()
plt.grid(which="both")
plt.legend(["train series"], loc="upper left")
plt.show()

entry = next(iter(dataset.test))
test_series = to_pandas(entry)
test_series.plot()
plt.axvline(train_series.index[-1], color='r') # end of train dataset
plt.grid(which="both")
plt.legend(["test series", "end of train series"], loc="upper left")
plt.show()

print(f"Length of forecasting window in test dataset: {len(test_series) - len(train_series)}")
print(f"Recommended prediction horizon: {dataset.metadata.prediction_length}")
print(f"Frequency of the time series: {dataset.metadata.freq}")

from gluonts.model.seq2seq import MQCNNEstimator
from gluonts.model.seq2seq import MQRNNEstimator
from gluonts.mx import Trainer

estimator = MQCNNEstimator(
    prediction_length=dataset.metadata.prediction_length,
    context_length=4* 24,
    freq=dataset.metadata.freq,
    trainer=Trainer(
        ctx="cpu",
        epochs=5,
        learning_rate=1e-3,
        num_batches_per_epoch=100),
        # decoder_mlp_dim_seq =[30],
        channels_seq=[30,30,30],
        dilation_seq=[1,3,5],
        kernel_size_seq=[7,3,3],
        quantiles=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] 
)

predictor = estimator.train(dataset.train)

from gluonts.evaluation import make_evaluation_predictions

forecast_it, ts_it = make_evaluation_predictions(
    dataset=dataset.test,  # test dataset
    predictor=predictor,  # predictor
    num_samples=100,  # number of sample paths we want for evaluation
)

forecasts = list(forecast_it)
tss = list(ts_it)

from gluonts.model.forecast import QuantileForecast

quantiles=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

from gluonts.model.forecast import QuantileForecast

# quantiles = np.array([[1., 2., 3.], [2., 3., 4.,], [3., 4., 5.,]])

forecast = QuantileForecast(
    quantiles,
    start_date=pd.Timestamp("2020-01-01 00:00:00"),
    freq="h",
    forecast_keys=["0.1", "0.2", "0.3","0.4", "0.5", "0.6","0.7","0.8" ,"0.9"]
)

forecast.plot()
plt.show()

from gluonts.evaluation import Evaluator

evaluator = Evaluator(quantiles=[0.1, 0.5, 0.9])
agg_metrics, item_metrics = evaluator(iter(tss), iter(forecasts), num_series=len(dataset.test))

print(json.dumps(agg_metrics, indent=4))

item_metrics.head()

Error message or code output

After running forecast, I get error as below

AttributeError: 'list' object has no attribute 'shape'

Environment

)

dai-ichiro commented 2 years ago

Try this sample script.

import matplotlib.pyplot as plt

from gluonts.dataset.repository.datasets import get_dataset, dataset_recipes
from gluonts.dataset.util import to_pandas

dataset = get_dataset("electricity_nips", regenerate=False)

from gluonts.model.seq2seq import MQCNNEstimator
from gluonts.mx import Trainer

estimator = MQCNNEstimator(
    prediction_length=dataset.metadata.prediction_length,
    context_length=4* 24,
    freq=dataset.metadata.freq,
    trainer=Trainer(
        ctx="cpu",
        epochs=3,
        learning_rate=1e-3,
        num_batches_per_epoch=100),
        channels_seq=[30,30,30],
        dilation_seq=[1,3,5],
        kernel_size_seq=[7,3,3],
        quantiles=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] 
)

predictor = estimator.train(dataset.train)

from gluonts.evaluation import make_evaluation_predictions

forecast_it, ts_it = make_evaluation_predictions(
    dataset=dataset.test,  # test dataset
    predictor=predictor,  # predictor
    num_samples=100,  # number of sample paths we want for evaluation
)

forecast_entry = next(iter(forecast_it))
ts_entry = next(iter(ts_it))

forecast_entry.plot()
plt.plot(ts_entry[-96:])

plt.show()

Hope this helps.

lostella commented 2 years ago

Hey @parora07234, does @dai-ichiro suggestion above help? If so, this issue could be closed