概念#

Estimator 和 Predictor#

GluonTS 使用两个主要的抽象概念,称为 EstimatorPredictor

每个 Predictor 都实现了 .predict(..) 方法,该方法在给定输入时间序列的情况下,将返回预测结果。

forecasts = predictor.predict(data)

相比之下,Estimator 被训练来生成一个 Predictor,然后使用该 Predictor 进行实际预测。

predictor = estimator.train(train_data)
forecasts = predictor.predict(data)

EstimatorPredictor 分成两个类的原因是,许多模型需要专门的训练步骤来生成全局模型。这个全局模型只需训练一次,但用于对所有时间序列进行预测。

这与局部模型形成对比,局部模型针对单个时间序列进行拟合,因此试图捕捉每个时间序列的特征,而不是整个数据集的特征。

训练全局模型可能需要很长时间:长达数小时,有时甚至数天。因此,将模型训练作为预测请求的一部分是不可行的,它是在一个单独的“离线”步骤中进行的。相比之下,拟合局部模型通常快得多,并且是作为预测的一部分“在线”完成的。

在 GluonTS 中,局部模型可直接用作预测器,而全局模型则作为 Estimator 提供,需要先进行训练。

# global DeepAR model
estimator = DeepAREstimator(prediction_length=24, freq="H")
predictor = estimator.train(train_data)

# local Prophet model
predictor = ProphetPredictor(prediction_length=24)

数据集#

在 GluonTS 中,Dataset 是时间序列对象的集合。每个对象都包含列(或字段),这些列(或字段)表示时间序列的属性。

大多数模型使用 target 列来表示我们希望预测未来值的那个时间序列。

{"target": [1, 2, 3, 4, 5, 6]}

请注意,target 列并非由 GluonTS 强加给模型,而是大多数模型约定俗成地使用它。

API#

更准确地说,Dataset 的定义如下

DataEntry = dict[str, Any]

class Dataset(Protocol):
    def __iter__(self) -> Iterator[DataEntry]:
        ...

    def __len__(self) -> int:
        ...

换句话说,任何可以产生字典的对象都可以作为 Dataset