使用 DeepAR 进行时间序列预测
在2019年的WAIC(世界人工智能大会)上 , 笔者在AWS展台中布置并展示了一个使用DeepAR进行时间序列预测的项目 , 受到了广泛的来自客户、参观者以及同事的关注 , 其中大部分是被展示项目中真实的电商客户的数据及成果吸引 , 进行了一定的经验交流 。 在得到肯定之后 , 笔者在年前又与部分互联网、旅游行业的业务负责人沟通 , 发现时间序列预测有着广泛的适用场景 , 能直接帮助决策者做出有数据支撑的重要决策 。

文章图片
图1WAIC中展示的时间序列预测DEMO
在本篇博客中 , 会简要介绍时间序列预测的场景、常见的分类及对应算法、DeepAR算法的优势以及如何使用DeepAR算法进行时间序列预测 。
场景介绍
绝大部分行业场景 , 尤其是互联网行业 , 每天都会产生大量的数据 。 游戏中每时每刻都会产生大量的玩家日志信息;旅游应用中每天有各类酒店各种交通工具的实时价格;涉及供应链和日销量的零售电商 , 每月都为生产(购进)多少货而发愁;就连生产电子元器件、供电箱等传统生产企业 , 这些零件每时每刻都会产生大量的数据 。 而我们称这种不同时间收到的 , 描述一个或多种特征随着时间发生变化的数据 , 为时间序列数据(TimeSeriesData) 。
而结合上文中的时间序列数据 , 我们能够做什么?最显而易见的是 , 我们可以通过过去产生的时间序列数据 , 来预测未来 。 我们可以通过游戏历史的玩家消费时间序列数据 , 预测该玩家在接下来一周的付费意愿和付费大致金额 , 从而定制化的推送相关游戏礼包和活动 , 这通常和传统的用户画像是互补的 。 旅游应用中 , 利用历史数据对未来酒店、机票的价格进行预测 , 从而为用户推荐最低价的购买点(例如:提示用户五天后购买会更便宜) , 这一个小功能就足够获取大量忠实用户并实现变现 , 而北美已经有网站实现了这个功能来预测机票价格 。 有了每日销量的历史数据 , 我们可以预测接下来每天的销量范围 , 从而更有针对性的进货或者推出折扣促销政策 , 保证商品的供需平衡 。 某大型供电箱生产销售企业常常头疼于电箱的维修难 , 维修贵 , 如果能利用传感器收集上来的历史数据训练出模型 , 在电箱故障前提前预警 , 那不论是维修还是提前更换 , 成本总比电箱彻底不工作后再去维修要少 。
一言以蔽之 , 时间序列预测就是通过多种维度的数据本身内在与时间的关联特性 , 其中可能包含季节性、趋势性等等特征 , 利用历史的数据预测未来的场景 , 细分场景除了上述所介绍的之外 , 还有很多很多 , 由于篇幅关系 , 这里不做过多的展开介绍 。
时序预测分类及算法
时序预测从不同角度看有不同分类 , 从实现原理的角度 , 可以分为传统统计学 , 机器学习(又分非深度学习和深度学习) 。 按预测步长区分 , 可以分为单步预测和多步预测 , 简单来说就是一次预测未来一个时间单元还是一次预测未来多个时间单元的区别 。 按输入变量区分 , 可以分为自回归预测和使用协变量进行预测 , 区别在于维度中是否含有协变量 , 例如预测未来销售量时 , 如果只接受时间和历史销售量数据 , 则是自回归预测 , 如果可以接受天气、经济指数、政策事件分类等其他相关变量(称为协变量) , 则称为使用协变量进行预测 。 按输出结果区分 , 可以分为点预测和概率预测 , 很多模型只提供了点预测而不提供概率预测 , 点预测模型后再加蒙特卡洛模拟(或其他转化为概率预测的方式)往往不能准确反映模型输出的预测概念 , 而在大多数场景下 , 概率预测更贴近事实情况 , 对于未来的预测本身就应该是一种概率分布 。 按目标个数区分 , 可以分为一元、多元、多重时间序列预测 。 举例理解 , 使用历史的销售量预测未来1天的销售量为一元时间序列预测 , 使用历史的进店人数、销售量、退货量预测未来1天的进店人数、销售量、退货量(预测目标有三个)为多元时间序列预测 , 使用历史的红烧牛肉面、酸菜牛肉面、海鲜面的销售量预测未来1天的红烧牛肉面、酸菜牛肉面、海鲜面的销售量(预测目标有三种)为多重时间序列预测 。 这些分类是不同角度下的分类 , 同一种算法往往只能是分类中的一种 , 例如传统的统计学算法只适合做自回归预测而不适合协变量预测 。

文章图片
图2时序预测分类对应关系
时序预测算法有很多很多 , 在这里只介绍典型的四种算法 , 并着重介绍DeepAR算法 。

文章图片
图3四种时序预测算法
简单移动平均SMA是统计学中易实现的一种算法 , 他能很有效的体现出数据长期的趋势 , 但无法反映数据周期性的变化 。 将自回归(AR)的算子加上移动平均(MA) , 就是ARIMA算法 。 回归能够反映数据的周期性规律 , 和移动平均形成互补 , 从统计学的角度可以很好的预测一元与时间强相关场景下的时间序列 , 由于原理简单好理解 , 算法也只是一行数学公式 , ARIMA也常常在时间序列预测时先拿来做第一步实验(baseline) 。
长短期记忆算法LSTM是在循环神经网络RNN的基础上 , 引出了遗忘门和记忆门 , 从而可以在长期训练的过程中筛选出我们需要的内容 。 在时间序列预测中 , LSTM对于一元预测场景的效果还是不错的 。
DeepAR是一个自回归循环神经网络 , 使用递归神经网络(RNN)结合自回归AR来预测标量(一维)时间序列 。 在很多应用中 , 会有跨一组具有代表性单元的多个相似时间序列 。 DeepAR会结合多个相似的时间序列 , 例如是不同方便面口味的销量数据 , 通过深度递归神经网络学习不同时间序列内部的关联特性 , 使用多元或多重的目标个数来提升整体的预测准确度 。 DeepAR最后产生一个可选时间跨度的多步预测结果 , 单时间节点的预测为概率预测 , 默认输出P10 , P50和P90三个值 。 这里的P10指的是概率分布 , 即10%的可能性会小于P10这个值 。 通过给出概率预测 , 我们既可以综合三个值给出一个值预测 , 也可以使用P10–P90的区间做出相应的决策 。 有关DeepAR数学运算背景的更多信息 , 请参阅DeepAR:概率性预测与自回归递归网络 。
DeepAR算法优势
时间序列预测在真正去做的时候 , 难免会遇到关于数据的问题 , 例如无法完整收集所有影响因素的数据 , 影响因素在未来具有不确定性 , 有时只有很少甚至没有历史数据 。 数据往往是卡住大多数时序预测工作负载最大的问题 。
DeepAR能够在一定程度上减轻对数据的要求 。 作为一种监督学习算法 , DeepAR直接在模型内部补充缺省值 。 在导入数据的过程中 , 我们不需要人为的扫描数据寻找缺省值 , 不需要为如何填补缺省值大费周章 , DeepAR模型内部会解决这一问题 。 利用DeepAR , 可以将时间序列与多个分组关联 , 可以处理统计学难以处理的非线性问题和规模问题 , 可以在几乎没有历史数据的情况下执行冷启动时间序列预测 , 只需要有类似的事件序列相支持 。 例如 , 我有历史方便面的销售数据若干 , 现在新上市了一款自热米饭 , 只有几天的数据 , 依然可以使用DeepAR结合历史方便面的数据预测自热米饭的未来销售走势 。 这也是算法的一大亮点 。
联合多重时间序列本身是一件挑战性十足的事 , 数据样本的不均衡导致了不同时间序列对于模型的影响程度是不同的 。 拿商品销售为例 , 销售数量多一个数量级 , 商品数量就少一个数量级 , 每个月卖10个的商品如果有100,000种 , 每个月卖100个的商品就只有10,000种 , 每个月卖1000个的商品就只有1000种 。 这种不均衡样本导致输入值的量级差异 , 商品A每天销售数百个 , 商品B每天销售数万个 , 两个商品共同训练时商品A的信息会被忽略掉 , 因为相对于B而言 , A对神经网络参数的影响太低 。 但是 , A时间序列中隐含的信息是有价值的 , 数百个销售额仍然能够反映季节性和趋势性的变化 。

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

文章图片
图5多重时间序列联合一个可行方案
在DeepAR中这些问题的方案都包含在了算法内部 , 从而省去了前期大量的数据规整和清洗工作 。 这也就使得从使用的角度上 , DeepAR的上手难度并不高 。 并且 , 在AmazonSageMaker和AmazonForecast这两个服务中 , 都可以快速方便的直接调用现成实现好的算法 , 输入自己的数据进行训练 。
DeepAR使用
如果您是一个刚上手机器学习的小白 , AmazonForecast是一项完全托管的服务 , 可以使用包含DeepAR在内的机器学习算法来提供高度准确的预测 , 您可以手动指定算法或让服务根据预测效果自己选择 。 AmazonForecast以Amazon.com使用的相同技术为基础 , 利用机器学习将时间序列数据与其他变量相结合 , 以获得预测结果 。 使用AmazonForecast无需具备任何机器学习经验 。 您只需要提供历史数据 , 以及您认为可能会影响预测结果的任何其他数据 。 训练、超参数调整、模型部署这些过程全部是服务自动执行 , 数个小时后就可以利用生成好的终端节点进行预测 。 AmazonForecast也能够在模型上线后持续迭代并优化您的模型 。
如果您想要动手来自行训练 , 更多的定制化和手动处理数据 , 控制训练过程 , 以及自定义部署流程 , AmazonSageMaker是更好的选择 。 AmazonSageMaker是一项完全托管的服务 , 可以帮助开发人员和数据科学家快速构建、训练和部署机器学习(ML)模型 。 SageMaker完全消除了机器学习过程中每个步骤的繁重工作 , 让开发高质量模型变得更加轻松 。 AmazonSageMaker覆盖了从数据打标签到最终模型部署一整套的步骤支持和现成的容器化方法 , 使得开发人员和数据科学家可以专注于他们所擅长的业务以及科学研究之中 。 DeepAR作为SageMaker内建的算法 , 可以通过数行代码调用 , 就可以直接开始模型训练 。 SageMaker也提供了数个DeepAR相关示例 , 可以在初期仿照示例笔记本处理自己的业务数据并生成模型 , 降低学习曲线 。
在SageMaker上启用一个笔记本实例 , DeepAR的示例笔记本在Jupyter的示例中可以找到:

文章图片
pic6
点击Use , 进入示例笔记本:

文章图片
图6SageMaker中使用DeepAR
使用内置算法DeepAR , 我们需要设置容器的名称forecasting-deepar:

文章图片
图7设置容器名称
数据预处理 , 按照文档中的数据格式要求进行数据预处理 , 设置时间序列的跨度 , 预测跨度 , 起始终止时间 , 并切分训练和测试数据集:

文章图片
图8数据预处理
SageMaker中使用的是封装好的DeepAR模型容器 , 我们只需要在笔记本中指定相关的命令参数和训练参数 , 就可以开始训练 。 相面给出了一个示例定义:

文章图片
图9训练参数定义
模型训练完成后 , 可以定义预测方法类 , 并一步调用API执行部署:

文章图片
图10定义推理方式并部署
这样我们就训练好了一个DeepAR用于预测电力供应的模型 , 可以在笔记本中继续尝试去预测接下来的几组数据并与历史数据进行比对 。 我们在实际使用SageMaker的过程中 , 可以先简单跑一遍示例代码 , 再逐步替换其中的数据、和改写数据预处理的代码 。 当您对相关代码掌握后 , 可以尝试独立来编写其他流程的代码 , 自定义在每一个步骤中实现业务的需求 。
最后 , 我希望通过这篇博客能够给您一些时间序列预测的指导 , DeepAR作为时间序列预测中一个亮点十足的算法 , 能够帮助您短时间内取得不错的准确率 。 AmazonForecast和AmazonSageMaker都能在不同阶段给到您支持 。
【使用 DeepAR 进行时间序列预测】本篇作者

文章图片
推荐阅读
- 深圳市场监管|深圳进口冻品须入集中监管仓进行消杀和抽样核酸检测
- 使馆|重要提醒!中国驻布基纳法索大使馆凌晨发布:经埃塞俄比亚转机赴华乘客,24日起转机前5天内须进行核酸检测
- 商务部|商务部:对澳大利亚进口相关葡萄酒进行反倾销立案调查
- 林郑月娥首度承认使用信用卡受限|被美国列入制裁名单,林郑月娥首度承认使用信用卡受限,有不便但感光荣
- spring框架之注解的使用
- 手机卡|“欠费”后的实名手机卡,没使用也不去注销,结果会怎样?
- 接口|视频上云网关平台EasyCVR接口文档使用中需要注意哪些?
- 费码|河南省推广使用转供电优惠“码”上查 减费“红包”直达小微企业
- 3d电影|看3D电影须先买眼镜?影院称为了防疫且可循环使用
- 铜川一村道路面坍塌成深坑,镇政府:待降雨结束,立即进行重新铺设
