目錄
頭文件
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()
實驗結果