- 阅读本手册需要一定mxnet、gluon操作基础
- 本文使用cpu训练代码
- 本文github地址:https://github.com/zmkwjx/GluonTS-Learning-in-Action
- GluonTS官网地址:https://gluon-ts.mxnet.io
1、DeepAR介绍
在GluonTS中,DeepAR实现了一种基于RNN的模型,使用自回归递归网络进行概率预测,是一种在大量相关时间序列上训练自回归递归网络模型的基础上,用于产生准确概率预测的方法。与最新技术相比,其准确性提高了15%左右。
概率预测(即根据时间序列的过去来估计时间序列的未来的概率分布)是优化业务流程的关键因素。
- 注意:此模型的代码与SageMaker的DeepAR预测算法背后的实现无关
2、DeepAR的输入/输出
DeepAR支持两个数据通道。所需的train通道描述了训练数据集。可选test通道描述了算法用于训练后评估模型准确性的数据集。您可以采用JSON行格式提供训练和测试数据集。
指定训练和测试数据的路径时,可以指定一个文件或包含多个文件的目录,这些文件可以存储在子目录中。如果指定目录,则DeepAR会将目录中的所有文件用作相应通道的输入。默认情况下,DeepAR模型使用 .json文件 输入数据。
- 载入数据集的方法
1 | # 后面将对该方法进行介绍 |
2.1 输入数据字段格式
start — 格式为 yyy-MM-DD HH:MM:SS 的字符串。开始时间戳不能包含时区信息。
target — 表示时间序列的浮点值或整数数组。您可以将丢失的值编码为null,或者在JSON中编码为”NAN”字符串:
1
{"start": "2009-11-01 00:00:00", "target": [5, "NAN", 7, 12]}
feat_dynamic_real (可选) — 代表自定义要素时间序列(动态要素)向量的浮点值或整数数组。如果设置此字段,则所有记录必须具有相同数量的内部数组(相同数量的特征时间序列)。此外,每个内部数组必须具有与关联target值相同的长度 。例如,如果目标时间序列代表不同产品的需求,则feat_dynamic_real可能是布尔时间序列,它指示是否对特定产品应用了促销:
1
{"start": ..., "target": [5, "NAN", 7, 12], "dynamic_feat": [[1, 0, 0, 1]]}
feat_static_cat (可选) — 可以用于对记录所属的组进行编码的分类特征数组。分类要素必须编码为基于0的正整数序列。例如,分类域{R,G,B}可以编码为{0,1,2}。来自每个分类域的所有值都必须在训练数据集中表示。
如果您使用JSON文件,则该文件必须为JSON Lines格式。例如:
1 | {"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, ...]]} |
在此示例中,每个时间序列都有两个关联的分类特征和一个时间序列特征。
如果对算法进行无条件训练,它将学习一个“全局”模型,该模型在推理时与目标时间序列的特定身份无关,并且只受其形状的约束。
如果该模型以提供给每个时间序列的 feat_static_cat 和 feat_dynamic_real 特征数据为条件,则预测很可能受到具有相应 cat 特征的时间序列特征的影响。例如,如果 target 时间序列表示服装商品需求,则您可以关联一个二维 cat 向量,该向量在第一个组件中编码商品类型(例如,0 = 鞋子,1 = 连衣裙),在第二个组件中编码商品颜色(例如,0 = 红色,1 = 蓝色)。示例输入如下所示:
1 | { "start": ..., "target": ..., "feat_static_cat": [0, 0], ... } # red shoes |
在推导时,您可以请求预测其 feat_static_cat 值为在训练数据中观察到的 feat_static_cat 值的组合的目标,例如:
1 | { "start": ..., "target": ..., "feat_static_cat": [0, 1], ... } # blue shoes |
2.2 训练数据准则
- 时间序列的开始时间和长度可以不同。例如,在营销工作中,产品通常在不同日期进入零售目录,因此,它们的起始日期自然会不同。但是,所有系列必须具有相同的频率、分类特征数量和动态特征数量。
- 根据文件中时间序列的位置将训练文件随机排序。换而言之,时间序列在文件中以随机顺序出现。
- 确保正确设置 start 字段。算法使用 start 时间戳来派生内部特征。
- 如果您使用分类特征 (feat_static_cat),则所有时间序列必须具有相同数量的分类特征。
- 如果您的数据集包含 feat_dynamic_real 字段,则算法会自动使用该字段。所有时间序列必须具有相同数量的特征时间序列。每个特征时间序列中的时间点与目标中的时间点一一对应。此外,feat_dynamic_real 字段中的条目应具有与 target 相同的长度。如果已使用 feat_dynamic_real 字段训练模型,则必须提供此字段以进行推理。此外,每个特征必须具有提供的目标的长度加上 prediction_length。
2.3 加载路径中包含的JSON Lines文件的数据集
common.FileDataset 加载路径中包含的 JSON Lines 文件的数据集。
class gluonts.dataset.common.FileDataset(path: pathlib.Path, freq: str, one_dim_target: bool = True)
- path: 包含数据集文件的路径。每个文件都会被认作训练数据源,除了以”.”开头和”_SUCCESS”结尾的文件外。文件中的有效行可以是: {“start”: “2014-09-07”, “target”: [0.1, 0.2]}
- freq: 时间序列中的观测频率
- one_dim_target: 是否仅接受单变量目标时间序列
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)
- freq: 时间序列中的观测频率
- prediction_length: 预测范围的长度
- context_length: 在计算预测之前要为RNN展开的步骤数(默认值:None,在这种情况下,context_length = projection_length)
- num_layers: RNN层数(默认值:2)
- num_cells: 每层的RNN信元数(默认值:40)
- cell_type: 要使用的循环单元格类型(可用:“ lstm”或“ gru”;默认值:“ lstm”)
- dropout_rate: 辍学正则化参数(默认值:0.1)
- use_feat_dynamic_real: 是否使用 feat_dynamic_real 数据中的字段(默认值:False)
- use_feat_static_cat: 是否使用 feat_static_cat 数据中的字段(默认值:False)
- use_feat_static_real: 是否使用 feat_static_real 数据中的字段(默认值:False)
- cardinality: 每个分类特征的值数。如果 use_feat_static_cat == True,则必须设置(默认:None)
- scaling: 是否自动缩放目标值(默认值:True)
- lags_seq: 用作RNN输入的滞后目标值的索引(默认值:None,在这种情况下,将根据频率自动确定这些值)
- time_features: 用作RNN输入的时间特征(默认值:None,在这种情况下,它们是根据频率自动确定的)
- num_parallel_samples: 每个时间序列的评估样本数,以在推理期间增加并行度。这是一个不影响准确性的模型优化(默认值:100)
2.5 例子
1 | train_data = common.FileDataset("此处填入训练数据文件夹的绝对路径", freq="H") |