zl程序教程

您现在的位置是:首页 >  其他

当前栏目

回顾︱DeepAR 算法实现更精确的时间序列预测(二)

2023-04-18 14:11:10 时间

deepAR已经上线Amazon SageMaker +GluonTS,有AWS的站台 + 本身的灵活性,实操可行性还是蛮高的。模型本身可以加入一些额外的属性信息,同时可以输出点预测 + 概率预测。 AWS也为此做了很多开发文档:

在机器学习中,目前主流的方法是利用LSTM等递归神经网络来对未来数据进行预测,这次介绍的DeepAR模型也不例外,不过不同的是,DeepAR模型并不是直接简单地输出一个确定的预测值,而是输出预测值的一个概率分布,这样做的好处有两点:

  • 1、很多过程本身就具有随机属性,因此输出一个概率分布更加贴近本质,预测的精度反而更高;
  • 2、可以评估出预测的不确定性和相关的风险。

1 DeepAR 预测算法优缺点

模型亮点:

  • 冷启动预测(迁移学习) 当我们想要为一个历史数据很少或无任何历史数据的时间序列生成预测时,会出现冷启动情况。这种情况在实践中常有发生,比如在引入新产品或推出新的 AWS 区域服务时。ARIMA 或 ES 等传统方法完全依赖于单个时间序列的历史数据,因此在冷启动情况下通常不太准确。我们以服装类商品 (例如运动鞋) 预测为例。 基于神经网络的算法 (例如 DeepAR) 可以根据其他类型运动鞋首次发布时的销售模式,学习新款运动鞋销售的典型行为。通过学习训练数据中多个相关时间序列的关系,DeepAR 可以提供比现有算法更精确的预测。
  • 概率预测(与WTTE-RNN比较像,不过WTTE使用得是:Weibull分布) DeepAR 还可生成点预测 (例如,一周内售出的运动鞋数量为 X) 和概率预测 (例如,一周内售出的运动鞋数量介于 X 和 Y 之间,概率为 Z%)。后者尤其适合产能规划等商业应用,在此类应用中,具体的预测分位数比可能性最大的结果更为重要。 例如,根据预测自动为运动鞋下订单的系统可能需要生成订单数量,以使仓库库存在 X% 的概率下满足客户需求。借助概率预测,根据预测的 X% 分位数得出订单数量,可以轻松做到这一点。 客户可以通过指定相应的似然函数超参数和推理时所需的分位数来利用此功能。
  • 多维度自变量(不仅仅是时间本身 ,还可以额外加入一些自变量)
  • 对实数和计数分别设计了不同的loss;
  • 数据预处理方面使用归一化的变换和预测使用weighted sampling。
  • 预测多条时间序列时,论文中提到可以对每条时间序序列进行category的编码,训练时进行embedding的学习
  • 可以提取每条时间序列的时间特征,作为feature输入到模型

缺点:

没有attention机制,对较长的时间序列可能会出现记忆丢失的问题,无法捕获长周期、季节等信息。 但在输入部分可以加入attention机制,比如用同期的数据作为一个特征。

对金融时序的独特有效性:

DeepAR模型不同于以往的时间序列预测模型,它输出的是未来数据的一个概率分布,我们需要通过采样的方法,用DeepAR递归地生成对于未来一段时间数据的预测,不过因为是从概率分布中采样得到的,这只是一条可能的“轨迹”,要计算期望值的话,就需要利用蒙特卡洛方法多次重复采样后取平均来得到。

个人感觉这种让模型输出概率分布的方法特别适用于像金融数据这类具有较大不确定性的时间序列数据,这类数据上往往具有一些噪声,这就导致直接对未来数据做直接预测并不一定可靠,而对于预测概率分布的DeepAR模型,最大化未来序列的似然函数的方式反而能够更好地反映出数据内在的随机性质,它不仅能够预测数值,还可以预测未来的波动,这一特点对于需要考虑风险的金融领域是非常有帮助的。

多重时间序列联合的问题的解决:

联合多重时间序列本身是一件挑战性十足的事,数据样本的不均衡导致了不同时间序列对于模型的影响程度是不同的。拿商品销售为例,销售数量多一个数量级,商品数量就少一个数量级,每个月卖10个的商品如果有100,000种,每个月卖100个的商品就只有10,000种,每个月卖1000个的商品就只有1000种。 这种不均衡样本导致输入值的量级差异,商品A每天销售数百个,商品B每天销售数万个,两个商品共同训练时商品A的信息会被忽略掉,因为相对于B而言,A对神经网络参数的影响太低。但是,A时间序列中隐含的信息是有价值的,数百个销售额仍然能够反映季节性和趋势性的变化。

而对于这种样本量级差异的解决方法,需要对商品销售量进行缩放,对应到神经网络中,即输入到神经网络前除以v, 输出后乘以v。如何选择为每一个商品选择对应的v是一个挑战,实践发现使用商品的历史销量均值是一个不错的选择。

2 DeepAR原理和实现过程

为了便于学习与时间相关的模式(如周末的峰值),DeepAR 会根据目标时间序列的频率自动创建特征时间序列。

例如,DeepAR 创建两个特征时间序列(一月中的某天和一年中的某天),其每周时间序列频率。它将这些派生的特征时间序列与您在训练和推理期间提供的自定义特征时间序列结合使用。下图显示了这些派生的时间序列特征中的两个:ui,1,t 表示一天中的小时以及 ui,2,t 一周中的某天。

算法自动生成这些特征时间序列。DeepAR下表列出了支持的基本时间频率的派生特征。

时间序列的频率

派生的特征

Minute

minute-of-hour, hour-of-day, day-of-week, day-of-month, day-of-year

Hour

hour-of-day, day-of-week, day-of-month, day-of-year

Day

day-of-week, day-of-month, day-of-year

Week

day-of-month, week-of-year

Month

一年中的某天

DeepAR 通过从训练数据集中的每个时间序列中随机采样多个训练示例来训练模型。

每个训练示例包括一对具有固定的预定义长度的相邻上下文和预测窗口。超参数控制网络可以往前看多长时间,context_length 超参数控制可以往后预测多长时间。

prediction_length在训练期间,算法忽略包含短于指定预测长度的时间序列的训练集元素。下图表示从元素 i 中提取的上下文长度为 12 小时且预测长度为 6 小时的五个样本。为简洁起见,我们省略了特征时间序列 xi,1,t 和 ui,2,t.

为了捕获季节性模式,DeepAR 还自动提供目标时间序列中的滞后值。在每小时频率的示例中,对于每个时间索引,t = T,模型公开 zi,t 值,过去大约 1、2 和 3 天出现。

对于推理,训练后的模型采用输入目标时间序列,该序列在训练期间可能已使用,也可能未使用,并预测下一个 prediction_length 值的概率分布。

由于 DeepAR 是在整个数据集上训练的,预测会考虑从类似时间序列中学习的模式。

算法的工作方式DeepAR https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/deepar_how-it-works.html

DeepAR 超参数 https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/deepar_hyperparameters.html

3 deepAR模型输入

可支持:

  • 时间序列的开始时间和长度可以不同。例如,在营销工作中,产品通常在不同日期进入零售目录,因此,它们的起始日期自然会不同。但是,所有系列必须具有相同的频率、分类特征数量和动态特征数量。
  • 根据文件中时间序列的位置将训练文件随机排序。换而言之,时间序列在文件中以随机顺序出现。
  • start — 格式为 YYYY-MM-DD HH:MM:SS 的字符串。开始时间戳不能包含时区信息。
  • target — 表示时间序列的浮点值或整数的数组。可以将缺失的值编码为 null 文字、JSON 格式的 "NaN" 字符串或 Parquet 格式的 nan 浮点值。
  • dynamic_feat(可选)— 一个或多个表示自定义特征时间序列(动态特征)向量的浮点值或整数的数组。如果设置此字段,则所有记录必须具有相同数量的内部数组(相同数量的特征时间序列)。
  • cat(可选)— 可用于对记录所属的组进行编码的分类特征的数组。分类特征必须编码为一个以 0 开始的正整数序列。

4 deepAR模型评估

点预测评估:

DeepAR 算法使用不同的准确性指标评估训练后的模型。该算法通过以下方式计算测试数据上的均方根误差 (RMSE):

分布式评估:

算法使用加权分位数损失评估预测分布的准确度。对于范围为 [0, 1] 的分位数,加权分位数损失定义如下:

5 deepAR关联实践代码

除了Amazon SageMaker还有哪些有开放的代码? 官方开源项目:

关于电力数据集的 DeepAR 演示 https://github.com/awslabs/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/deepar_electricity/DeepAR-Electricity.ipynb

使用 DeepAR - Synthetic 数据进行时间序列预测 https://github.com/aws/amazon-sagemaker-examples/blob/master/introduction_to_amazon_algorithms/deepar_synthetic/deepar_synthetic.ipynb

5.1 code - tensorflow版本

https://www.jianshu.com/p/8a900b9ad3d3

github: https://github.com/arrigonialberto86/deepar

import tensorflow as tf
import tensorflow_probability as tfp


class DeepAR(tf.keras.models.Model):
    """
    DeepAR 模型
    """
    def __init__(self, lstm_units):
        super().__init__()
        # 注意,文章中使用了多层的 LSTM 网络,为了简单起见,本 demo 只使用一层
        self.lstm = tf.keras.layers.LSTM(lstm_units, return_sequences=True, return_state=True)
        self.dense_mu = tf.keras.layers.Dense(1)
        self.dense_sigma = tf.keras.layers.Dense(1, activation='softplus')


    def call(self, inputs, initial_state=None):
        outputs, state_h, state_c = self.lstm(inputs, initial_state=initial_state)


        mu = self.dense_mu(outputs)
        sigma = self.dense_sigma(outputs)
        state = [state_h, state_c]


        return [mu, sigma, state]


def log_gaussian_loss(mu, sigma, y_true):
    """
    Gaussian 损失函数
    """
    return -tf.reduce_sum(tfp.distributions.Normal(loc=mu, scale=sigma).log_prob(y_true))

5.2 最佳代码实践 - pytorch版本

https://github.com/jingw2/demand_forecast

•DeepAR
•MQ-RNN
•Deep Factor
•LSTNet
•TPA-LSTM
•LSTNet Github
•TPA-LSTM Github
•Uber Extreme Event Forecast 1
•Uber Extreme Event Forecast 2
•Modeling Extreme Events in Time Series Prediction

参考文献:

DeepAR: Probabilistic Forecasting with Autoregressive Recurrent Networks https://arxiv.org/abs/1704.04110

概率自回归预测——DeepAR模型浅析 https://zhuanlan.zhihu.com/p/201030350

教程 | 如何使用 DeepAR 进行时间序列预测? https://mp.weixin.qq.com/s/88AIAyAAL9LFLutVcwGk2A

预测DeepAR算法 https://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/deepar.html