GluonTS 快速預測時間序列

目錄

頭文件

1、定義數據集

2、構建簡單前饋網絡(MLP)進行預測

3、訓練完成之後對測試數據預測進行評估

4、對結果進行畫圖展示

5、訓練代碼


 

頭文件

import mxnet as mx
from mxnet import gluon
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import json
from gluonts.dataset.common import ListDataset

1、定義數據集

定義一個樣本數量爲10,每個樣本有100個時間序列的數據集,數據集預測的長度是後24個數值

N = 10  # number of time series
T = 100  # number of timesteps
prediction_length = 24
freq = "1H"
custom_dataset = np.random.normal(size=(N, T))
start = pd.Timestamp("01-01-2019", freq=freq)  # can be different for each time series

註釋:start表示這個時間序列開始的時間,freq表示時間按照這個時間長度進行不斷累加(相當於等差數列)

2、構建簡單前饋網絡(MLP)進行預測

這裏構建輸入爲(100-24),兩層隱藏層(40, 40),輸出層爲24

def creat_SFFEstimator():
    from gluonts.model.simple_feedforward import SimpleFeedForwardEstimator
    from gluonts.trainer import Trainer

    estimator = SimpleFeedForwardEstimator(
        num_hidden_dimensions=[40, 40],
        prediction_length=prediction_length,
        context_length=100,
        freq=freq,
        trainer=Trainer(ctx="cpu",
                        epochs=5,
                        learning_rate=1e-3,
                        num_batches_per_epoch=1
                        ),
    )
    # 使用構建的Estimator(可自定義),在訓練集上訓練
    predictor = estimator.train(train_ds)
    return predictor

3、訓練完成之後對測試數據預測進行評估

def evaluation(predictor):
    from gluonts.evaluation.backtest import make_evaluation_predictions
    from gluonts.evaluation import Evaluator

    forecast_it, ts_it = make_evaluation_predictions(
        dataset=test_ds,  # test dataset
        predictor=predictor,  # predictor
        num_samples=10,  # number of sample paths we want for evaluation
    )
    forecasts = list(forecast_it)
    tss = list(ts_it)

    ts_entry = tss[0]
    forecast_entry = forecasts[0]

    evaluator = Evaluator(quantiles=[0.1, 0.5, 0.9])
    agg_metrics, item_metrics = evaluator(iter(tss), iter(forecasts), num_series=len(test_ds))
    print (agg_metrics)

    return forecast_entry, ts_entry

4、對結果進行畫圖展示

def plot_prob_forecasts(forecast_entry, ts_entry):
    plot_length = 48
    prediction_intervals = (50.0, 90.0)
    legend = ["observations", "median prediction"] + [f"{k}% prediction interval" for k in prediction_intervals][::-1]

    fig, ax = plt.subplots(1, 1, figsize=(10, 7))
    ts_entry[-plot_length:].plot(ax=ax)  # plot the time series
    forecast_entry.plot(prediction_intervals=prediction_intervals, color='g')
    plt.grid(which="both")
    plt.legend(legend, loc="upper left")
    plt.show()

5、訓練代碼

def unconstom_train():
    # 創建
    predictor = creat_SFFEstimator()
    # 評估、預測
    forecast_entry, ts_entry = evaluation(predictor)
    # 展示
    plot_prob_forecasts(forecast_entry, ts_entry)

unconstom_train()

實驗結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章