概念#
Estimator 和 Predictor#
GluonTS 使用两个主要的抽象概念,称为 Estimator
和 Predictor
。
每个 Predictor
都实现了 .predict(..)
方法,该方法在给定输入时间序列的情况下,将返回预测结果。
forecasts = predictor.predict(data)
相比之下,Estimator
被训练来生成一个 Predictor
,然后使用该 Predictor
进行实际预测。
predictor = estimator.train(train_data)
forecasts = predictor.predict(data)
将 Estimator
和 Predictor
分成两个类的原因是,许多模型需要专门的训练步骤来生成全局模型。这个全局模型只需训练一次,但用于对所有时间序列进行预测。
这与局部模型形成对比,局部模型针对单个时间序列进行拟合,因此试图捕捉每个时间序列的特征,而不是整个数据集的特征。
训练全局模型可能需要很长时间:长达数小时,有时甚至数天。因此,将模型训练作为预测请求的一部分是不可行的,它是在一个单独的“离线”步骤中进行的。相比之下,拟合局部模型通常快得多,并且是作为预测的一部分“在线”完成的。
在 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
。