Kaggle 商品销量预测季军方案出炉,应对时间序列问题有何妙招
https://www.leiphone.com/news/201803/fPnpTdrkvUHf7uAj.html
雷锋网 AI 研习社消息,Kaggle 上 Corporación Favorita 主办的商品销量预测比赛于两个月前落下帷幕,此次比赛的奖金池共计三万美元,吸引到 1675 支队伍参赛。
近日,Private Leaderboard 上的亚军 SoLucky 团队在 arxiv 上发表了一篇论文,阐述了其获胜方案,雷锋网 AI 研习社对论文内容进行编译整理如下:
作者参加了在 Kaggle 上举办的 Corporacion Favorita Grocery Sales Forecasting 销量预测比赛,并取得了第二名的成绩。
这场比赛是基于时间序列数据的基础机器学习问题,论文中阐明了总体分析和解决方案。
作者的方法基于空洞卷积神经网络(dilated convolutional neural network)并进行了改善,来对时间序列进行预测。利用这种技术,在 n 个示例批次中不断迭代,能够快速和准确地对大量时间序列数据进行处理。
比赛背景
Kaggle 等竞赛平台举办的时间序列比赛目前已经成为机器学习流行赛事,这些竞赛有助于推进机器学习顶尖技术的发展,将其用于实际领域。
时间序列是不太为人所知的分析领域。由于数据存在着季节性、动态性和周期性的特征,数据序列是非线性的,并存在噪声,因此很难准确进行识别和预测。
神经网络在近几年的热度急剧增长,这使人们对预测有了截然不同的理解。硬件的进步使得我们能够在一定时间内利用深度神经网络解决问题。目前,深度学习是一个可行的解决方案,利用这项技术,近年来研究者们在基准数据集的分类精度上打破了很多记录。
作者在本文中讨论了解决 Corporacion Favorita Grocery Sales Forecasting 商品销量预测问题的方法,描述并分析了将卷积神经网络应用于时间序列数据。
数据集描述
数据被分为两部分——训练数据和测试数据。训练数据用于模型训练,测试数据被分为几部分,分别用于在公共和私人的排行榜上进行模型的准确性评估。这场比赛中,Corporacion Favorita 提供 125,497,040 个训练观察值和 3370,464 个测试观察值。
数据集由按日销售额、商店编号、商品编号和促销信息组成。此外,主办方还提供交易信息、石油价格、商店信息和假期。
该竞赛使用 NWRMSLE(标准化加权均方根对数误差)作为评价指标。
问题定义
实体店中的采购和销售需要保持平衡。稍微将销售预测过量,店里就会积存许多货物,要是积压了不易储存的商品会更加糟糕。而要是将销量预测过低,设想一下,当顾客把钱都付了,却发现没货,那这家店的口碑将会急剧下降。
此外,随着零售商增加新的门店,那里的顾客又可能存在独特的需求,比如他们想要新的产品,口味随季节而变化,那问题将变得更加复杂,产品市场如何真的很难预知。
在这次比赛中,主办方希望参赛者建立一个更准确的预测产品销量的模型。作者的目标是建立一个可能应用于实际,并具有最高准确度的销量预测模型。
主要存在如下三种挑战:
噪声数据:尽管组织者尽力准备并提供了大量数据,但其中存在有噪声标签的数据。有些数据(石油价格、假期、交易)与目标没有关联,在之后根本不会使用。
不可见数据:有这样一种情况,在测试集中出现了不可见的数据。由于存在这类不可见的商店/商品数据,模型的行为将不可预测。原因如下:训练集中不包括销售额为 0 的记录,但是测试集包含所有的商店/商品组合(不管商店此前是否销售该商品)。最后,作者假设这些不可见的组合只是零销售额数据,用 0 来进行替换。
准确度:因为这个实验是严格按照比赛规则进行的,作者尝试了所有可能用来提高预测准确度的方法。
可选方案
下面的这些架构基于神经网络,但在这个比赛中,最终结果不如作者最后使用的 WaveNet 模型,但他们相信这种架构可以提供一种完全不同的方法来解决问题,产生出一些有趣的洞见,甚至在其他比赛中超越 WaveNet。
循环神经网络
循环神经网络(RNN)可以将当前节点的输出作为下一个节点的输入,可以如下描述:相较于其他深度学习算法,RNN 已经被广泛用于预测时间序列问题,并被定位为预测此类数据数组问题的最先进的方法。
这些网络的效率可以通过重复的连接来解释,这些连接允许网络访问以前的时间序列值的整个历史。
可以将 RNN 看成同一个网络的多个副本,每个副本会传递消息给后续副本。由于自身属性,RNN 与序列和列表密切相关。在过去的几年中,将 RNN 应用于时间序列预测问题上已经取得了惊人的成果。
其中具有象征意义的是 LSTMs,这是一种非常特殊的 RNN,在许多任务上,它比标准 RNN 的表现要好得多。
GRU 架构也可以作为解决当前问题的方法,它们与 LSTMs 相似,结构更简。
作者的方法
基于 WaveNet CNN 网络并做了一些额外的扩展和修改。
近年来,深度学习技术的发展促使研究人员探索出各种时间序列预测方法,其中就有 WaveNet。WaveNet 是一个生成模型,这意味着模型可以针对一些条件输入生成实值数据(real-valued data)序列。
该架构背后的核心思想是空洞因果卷积(dilated causal convolutions)。由于没有循环连接和跳跃步骤,空洞卷积训练起来比 RNN 要快。
目前,因果卷积存在的问题之一是:为了增大感受野,需要用到多层卷积或者或很多大滤波器。
空洞卷积不存在这些问题,它使用上采样滤波器代替特征映射(feature maps)。换句话说,空洞卷积允许只增加核的视野在层间维持特征映射的大小,另外,可以用更少的参数捕获输入的全局视图。
为了能够产生 16 天的预测值,作者对模型进行了修改。因为训练使用的是下一步预测值,错误会持续累积。为了解决这个问题,他们使用 sequence to sequence 方法,编码器和解码器不会共享参数。解码器将会在产生长序列时处理累积的噪声。这里还用了亚当优化器更新网络权重。数据是通过小批次产生的,随机采样 128 个序列。
由于整个数据集大约包含 17 万序列 x 365 天,所以在每次训练迭代中都能向模型输入不同的数据。考虑到这一点,该模型能很好地处理过拟合问题。
在训练过程中,学习率衰减系数设置为 0.0005。作者将过去 16 天的训练数据做成一个集合,并将其用于验证。销售量的变化和促销信息可以用来生成的季度和年度模型。
在最后若干个上千或上万的的小批次中,模型会稍微出现过拟合,所以结果会有一点波动。
为了解决过拟合问题,平滑短期波动,着重于长期的动态性和周期性趋势,作者用到移动平均法(Moving average)。在 5000 次小批量迭代之后,模型开始预测,之后每过 2000 次迭代产生预测。在特定的迭代之后,如下图所示,5 个模型的平均性能优于单个模型。为了将模型准确性进一步提高,最终,作者使用指数移动平均法(exponential moving average),利用局部交叉验证(local cross-validation)计算出平滑因子(smooth factor)。
该模型有很好的捕获时间序列数据规律的能力,因此很多特性都没有被使用。其中一些是单位产品销售额和促销信息。
总结
企业面临一个明显的问题——市场是不可预测的。任何销售预测,无论你的分析条件多么严谨,都可能是完全错误的。如果市场状况保持相对不变,一种可靠的预测方法就是使用历史数据。作者的经验表明,卷积神经网络非常善于处理历史数据,捕捉季节性的趋势、周期和无规律的趋势,如下图所示。
他们描述了一种使用 CNN WaveNet 的方法,这是一个 sequence to sequence 架构,在销售预测方面,它是解决时间序列预测问题的有效方法(如下图)。
在未来,需要对层数更多的 CNN 进行更深入的研究,以完成更复杂的任务。为了训练更深的网络,需要大量的数据。在未来,对不同类型和领域的数据进行分析可能是另一个有趣的方向。此外,将不同技术融合起来也能获得相当的准确性。
比赛地址:https://www.kaggle.com/c/favorita-grocery-sales-forecasting
论文地址:https://arxiv.org/pdf/1803.04037.pdf
雷锋网(公众号:雷锋网) AI 研习社编译整理。
雷锋网版权文章,未经授权禁止转载。详情见转载须知。
Kaggle 商品销量预测季军方案出炉,应对时间序列问题有何妙招的更多相关文章
- 2017 Gartner数据科学魔力象限出炉,16位上榜公司花落谁家?
https://www.leiphone.com/news/201703/iZGuGfnER4Sv2zRe.html 2017年Gartner数据科学平台(在2016年被称作“高级分析平台”)的魔力象 ...
- Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测
Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931 近日,Artur Suilin 等人发布了 Kaggl ...
- 【旧文章搬运】PE感染逆向之修复(Serverx.exe专杀工具出炉手记)
原文发表于百度空间,2008-10-4看雪论坛发表地址:https://bbs.pediy.com/thread-73948.htm================================== ...
- 用Python爬取分析【某东618】畅销商品销量数据,带你看看大家都喜欢买什么!
618购物节,辰哥准备分析一波购物节大家都喜欢买什么?本文以某东为例,Python爬取618活动的畅销商品数据,并进行数据清洗,最后以可视化的方式从不同角度去了解畅销商品中,名列前茅的商品是哪些?销售 ...
- 微信小程序开发视频教程新鲜出炉
微信小程序开发公测了,可是对于新手来说,不同的框架不同的开发机制,如何快速适应呢?微信小程序开发视频教程新鲜出炉了,从零开始一步一步搭建微信小程序,每个章节都会涉及到不同的知识点,等教程学习完你不但掌 ...
- 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面.
刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面.
- 23套新鲜出炉的网站和手机界面 PSD 素材
Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面.这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型. 在这篇文章 ...
- 22套新鲜出炉的 Web & Mobile PSD 用户界面素材
在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件.这些线框图和 UI 设计工具包让设计师在设计用户界面原型的时候能够非常便利. Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这 ...
- 20个新鲜出炉的网站模板【HTML & PSD】
这里给大家分享20 个新鲜出炉的免费网站模板.这些设计元素将成为你下一个项目的重要素材,可以帮你节省很多的时间.与往常一样,我们经常漫游网络,寻找最好的资源, HTML.CSS 和 PSD 等等,记得 ...
随机推荐
- pygame系列_font游戏字体_源码下载
在pygame游戏开发中,一个友好的UI中,漂亮的字体是少不了的 今天就给大伙带来有关pygame中字体的一些介绍说明 首先我们得判断一下我们的pygame中有没有font这个模块 if not py ...
- 群晖NAS使用Docker安装迅雷离线下载出现the active key is not valid.
出现这种情况多半是挂了,也有可能是不稳定的网络,重装Docker镜像可能会解决,只有不断试,没什么好的解决方法.
- Windows访问Linux的Ext4格式分区
Ext2Fsd是Windows下一套很实用的Driver,虽然名称是ext2fsd但ext3/ext4都可读取,安装完成后电脑便可直接认得ext格式扇区 虽然官方介绍只能支持到Windows 8,但实 ...
- FindWindow用法
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配.这个函数不查找子窗口.在查找时不区分大小写. 函数型:HWND FindWindow(LPCTSTR IpClassN ...
- SQLPrompt_7.2.2.273〖含注册机〗(支持低版本和最高版本SQL2016+VS2015)
SQLPrompt_7.4.1.564[含注册机](支持低版本和最高版本SQL2016+VS2015) http://download.csdn.net/detail/wozengcong/97601 ...
- delphi 隐藏标题栏
1.隐藏窗体的标题栏在Delphi中隐藏窗体的标题栏,相信大家都会说是一个件十分容易的事情,只需要设置BorderStyle的属性为bsNone就可以了,不过这种设置方法不但去掉了窗体的标题栏,而 ...
- [Mac入门]如何在Mac下显示Finder中的所有文件
在Unix下工作,你可能需要处理一些“特殊“文件或文件夹,例如/usr,/bin, etcf,或一些"dot files"(如.bash_profile).但是Linux/Unix ...
- Unity3D实践系列04, 脚本的生命周期
Unity3D脚本生命周期是指从脚本的最初唤醒到脚本最终销毁的整个过程.生命周期的各个方法被封装到了MonoBehaviour类中.具体来说如下: 1.In Editor Mode 编辑模式 当在编辑 ...
- 利用进程ID获取主线程ID
利用进程ID获取主线程ID,仅适用于单线程.多线程应区分哪个是主线程,区分方法待验证 (1)好像可以用StartTime最早的,不过通过线程执行时间不一定可靠,要是在最开始就CreateThread了 ...
- [转]浅论ViewController的加载 -- 解决 viewDidLoad 被提前加载的问题(pushViewController 前执行)
一个ViewController,一般通过init或initWithNibName来加载.二者没有什么不同,init最终还是要调用initWithNibName方法(除非这个ViewControlle ...