阅读本手册需要一定mxnet、gluon操作基础。
本文使用cpu训练代码。
个人博客地址:https://zmkwjx.github.io
本文github地址:https://github.com/zmkwjx/GluonTS-Learning-in-Action
GluonTS官网地址:https://gluon-ts.mxnet.io
在GluonTS中,DeepAR实现了一种基于RNN的模型,使用自回归递归网络进行概率预测,是一种在大量相关时间序列上训练自回归递归网络模型的基础上,用于产生准确概率预测的方法。与最新技术相比,其准确性提高了15%左右。
概率预测(即根据时间序列的过去来估计时间序列的未来的概率分布)是优化业务流程的关键因素。
DeepAR支持两个数据通道。所需的train通道描述了训练数据集。可选test通道描述了算法用于训练后评估模型准确性的数据集。您可以采用JSON行格式提供训练和测试数据集。
指定训练和测试数据的路径时,可以指定一个文件或包含多个文件的目录,这些文件可以存储在子目录中。如果指定目录,则DeepAR会将目录中的所有文件用作相应通道的输入。默认情况下,DeepAR模型使用 .json文件 输入数据。
# 后面将对该方法进行介绍
common.FileDataset("此处填入训练数据文件夹的绝对路径", freq="H")
2.1 输入数据字段格式
{"start": "2009-11-01 00:00:00", "target": [5, "NAN", 7, 12]}
{"start": ..., "target": [5, "NAN", 7, 12], "dynamic_feat": [[1, 0, 0, 1]]}
如果您使用JSON文件,则该文件必须为JSON Lines格式。例如:
{"start": "2009-11-01 00:00:00", "target": [4.3, "NaN", 5.1, ...], "feat_static_cat": [0, 1], "feat_dynamic_real": [[1.1, 1.2, 0.5, ...]]}
{"start": "2012-01-30 00:00:00", "target": [1.0, -5.0, ...], "feat_static_cat": [2, 3], "feat_dynamic_real": [[1.1, 2.05, ...]]}
{"start": "1999-01-30 00:00:00", "target": [2.0, 1.0], "feat_static_cat": [1, 4], "feat_dynamic_real": [[1.3, 0.4]]}
在此示例中,每个时间序列都有两个关联的分类特征和一个时间序列特征。
如果对算法进行无条件训练,它将学习一个“全局”模型,该模型在推理时与目标时间序列的特定身份无关,并且只受其形状的约束。
如果该模型以提供给每个时间序列的 feat_static_cat 和 feat_dynamic_real 特征数据为条件,则预测很可能受到具有相应 cat 特征的时间序列特征的影响。例如,如果 target 时间序列表示服装商品需求,则您可以关联一个二维 cat 向量,该向量在第一个组件中编码商品类型(例如,0 = 鞋子,1 = 连衣裙),在第二个组件中编码商品颜色(例如,0 = 红色,1 = 蓝色)。示例输入如下所示:
{ "start": ..., "target": ..., "feat_static_cat": [0, 0], ... } # red shoes
{ "start": ..., "target": ..., "feat_static_cat": [1, 1], ... } # blue dress
在推导时,您可以请求预测其 feat_static_cat 值为在训练数据中观察到的 feat_static_cat 值的组合的目标,例如:
{ "start": ..., "target": ..., "feat_static_cat": [0, 1], ... } # blue shoes
{ "start": ..., "target": ..., "feat_static_cat": [1, 0], ... } # red dress
2.2 训练数据准则
2.3 加载路径中包含的JSON Lines文件的数据集
common.FileDataset 加载路径中包含的 JSON Lines 文件的数据集。
class gluonts.dataset.common.FileDataset(path: pathlib.Path, freq: str, one_dim_target: bool = True)
2.4 构造DeepAR网络
class gluonts.model.deepar.DeepAREstimator(freq: str, prediction_length: int, trainer: gluonts.trainer._base.Trainer = gluonts.trainer._base.Trainer(batch_size=32, clip_gradient=10.0, ctx=None, epochs=100, hybridize=True, init=“xavier”, learning_rate=0.001, learning_rate_decay_factor=0.5, minimum_learning_rate=5e-05, num_batches_per_epoch=50, patience=10, weight_decay=1e-08), context_length: Optional[int] = None, num_layers: int = 2, num_cells: int = 40, cell_type: str = ‘lstm’, dropout_rate: float = 0.1, use_feat_dynamic_real: bool = False, use_feat_static_cat: bool = False, use_feat_static_real: bool = False, cardinality: Optional[List[int]] = None, embedding_dimension: Optional[List[int]] = None, distr_output: gluonts.distribution.distribution_output.DistributionOutput = gluonts.distribution.student_t.StudentTOutput(), scaling: bool = True, lags_seq: Optional[List[int]] = None, time_features: Optional[List[gluonts.time_feature._base.TimeFeature]] = None, num_parallel_samples: int = 100)
2.5 例子
train_data = common.FileDataset("此处填入训练数据文件夹的绝对路径", freq="H")
test_data = common.FileDataset("此处填入需要预测数据文件夹的绝对路径", freq="H")
estimator = deepar.DeepAREstimator(
prediction_length=24,
context_length=100,
use_feat_static_cat=True,
use_feat_dynamic_real=True,
num_parallel_samples=100,
cardinality=[2,1],
freq="H",
trainer=Trainer(ctx="cpu", epochs=200, learning_rate=1e-3)
)
predictor = estimator.train(training_data=train_data)
for test_entry, forecast in zip(test_data, predictor.predict(test_data)):
to_pandas(test_entry)[-100:].plot(figsize=(12, 5), linewidth=2)
forecast.plot(color='g', prediction_intervals=[50.0, 90.0])
plt.grid(which='both')
plt.legend(["past observations", "median prediction", "90% prediction interval", "50% prediction interval"])
plt.show()
prediction = next(predictor.predict(test_data))
print(prediction.mean)
prediction.plot(output_file='graph.png')