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