如何预测百威啤酒销量?数据竞赛冠军笔记分享 思路

转载: http://dy.163.com/v2/article/detail/DHALCA3N0511VFT2.html

  赛题背景

  组织方:微软加速器

  真实数据来源:几家顶级快消品牌

  上海站:百威英博命题,并提供脱敏的业务数据

  提出三个问题:

  1.库存需求预测

  2.销售数量预测

  3.经销商违规行为检测

  数据大致的情况

  原始数据中,大致包含了百威全国400多家门店的数据,商品的种类800多个,一整年历史销售数据,精确到每日,数据400多万行。需要预测未来一个月内未来商品的销量。

  第一步:数据探索

  先进行数据探索,理解一下数据的分布,和大致的特征。后面怎么样去做你的模型。数值分布,统计检验。不可能上来就跑个模型,看下效果。

  

  常用方法一:数值分布,统计检验,左边直方图,即数据的分布情况,右边这个是皮尔森相关性检验(Pearson correlation coefficient),就是特征之间的相关度是什么样的。

  

  Python的库missing number。观察缺失值的情况。因为百威提供的数据质量很高,所以不需要考虑填充缺失值。

  

  常用预测方法二:

  预测方法一:历史数据用折线图等形式画出来,从历史中寻找商品和门店的行为规律。

  有的有规律性,有的没有。如下图。

  

  所以各个商品之间行为的模式(pattern)不一样。

  这样的分析有什么好处呢?通过分析发现,有的商品数据点很稀少。需要分别建立模型,有些不需要建立模型。历史上出现一两次的情况,可以历史平均和预测为零来处理。不用极端数据影响整体的效果。

  预测方法二:正则化。基于统计规则,历史上某些值的平均值,比他两三个标准差偏差还要多的话,会认为异常值,我们会把这些值缩小一下。

  预测方法三:基于模型预测,先构建一个简单的模型,训练后,跑一下模型,观察误差特别大的点,也有可能是离群值或者异常值。这样就可以针对他们做一些处理。

  预测方法四:移动平均。

  预测方法五:对数据进行log的预处理。

  Log预处理是时间序列和线性模型中经常会遇到。很多情况下,会要求你的时间序列的值是稳定的,有时也会对预测值做Log处理,有时也会做差分处理。还有一些线性模型对残差,大多数假设是一个正态分布的残差。

  如果数值分布的偏度很高,也会有问题,会用log来做预处理。

  日期对齐也是时间序列预测问题中常见的技术。比如中国春节在一月或者二月,需要考虑历史数据上春节的月份和今年春节的时间点是不是对的上。如果对不上是预处理,会提高预测的精度。

  还有一些业务相关的逻辑。比如销量为零,售价不为零之类。也需要做处理。

  以上是数据探索的过程。

  特征工程的构建

  加入地理位置,门店当地的经济指数,当时气温、赛事、节假日、促销活动等。

  聚类方法:用无监督的方法,对原始数据进行聚类,把相像的门店或者产品放在一起。分别来做子模型,或者把标签当做特征加进去。

  基础特征方面,百威提供原始数据集的特征,在此基础上做了一些各维度的统计聚合,需要各维度聚合——时间、门店、商品:比如,日期衍生(是否是节假日,本周的节假日有几天,距离下一个工作日有几天)、商品、门店属性、各类高级计算。新商品从第一天开始售卖,累计的销售天数。

  高级的特征处理方式:

  

  2014年Facebook在论文中提出的方法——GBDT生成特征,论文认为决策树的模型可以自动做一些特征的组合和转换。说白了就是把Input放进去之后,看每一棵树,落在每一个叶子的节点上,以此做一个新的特征,原始论文中,把特征放在一个逻辑回归的模型中去做,当然你也可以把输出的特征和原始的特征加在一起,放在XGBoost、或者

  FM(Factorization Machine因子分解机,又称分解机器,旨在解决大规模稀疏数据下的特征组合问题)。

  

  图片是Embedding的方法,因为深度学习的应用比较火的结果,大家都有兴趣把深度学习的模型,应用到商业分析里面。这个借鉴了word2vec的方法,让相近的门店与产品,本来是稀疏的特征,希望通过一系列的Embedding转换之后,转换到稠密的向量空间中,一些相近的商品门店,在向量空间中距离比较近,这样起到了特征转换。

  在比赛中,我们用Keras做了Embedding实现,把商品、日期、门店做了Embedding,

  套几个全连接的层,加一些东西,一直到输出到结果。

  t-SNE降维处理,画在二维的图标上面,

  

  左边月份的聚类,789月热,距离在图上近,天气比较冷的月份在图中距离差的比较远。右边t-SNE图是所有门店的图,因为得到的数据门店都用的ID(全数字)来表示,所以只能推测是行为模式比较像、或者地理位置比较近的门店是脱敏数据,所以没有办法检验。

  模型调优

  基线:历史平均(一般来说对复杂的,实际数据的预测问题,对历史销量平均做预测值)

  时间序列: SARIMAX, tbats, generalized additive model(广义加性模型)

  树模型: Random Forest, XGBoost, LightGBM

  深度学习: embedding, wide and deep, LSTM在特征工程之后,我们会做一些模型的选择。,还有一些方法,比如时间序列等方法。

  树模型是数据科学比赛常用的,XGBoost、随机森林、因为是微软的比赛,我们尝试了微软的LightGBM,实现效果如何。还尝试了深度学习的模型embedding、wide and deep, LSTM等模型。

  历史平均、简单平均、加权平均,移动平滑平均都可以使用。比赛中MAPE: 0.744,这个数值为后续服务,模型调优的基线。

  

  时间预测模型的示意图:GAM库,时间预测模型比较简单、预测值稳定,可解释性强,黑点是真实值,深蓝色预测值,淡蓝色是置信区间。

  有很多点捕捉不到,所以误差会大。

  时间序列的可解释性

  

  趋势:7、8、9月天气热,啤酒销量好;节假日、周末周期性强。

  树模型:

  应用非常广泛,尤其是非图像的,文本、语音,商业数据很多主流的方法就是树模型,

  1.Random Forest

  2.GBRT

  优点:

  对于离群值的鲁棒性较好

  数据分布要求低(不需要做预测力,神经网络一般会要求做归一化,让数据的分布一致一些,否则模型效果会差。)

  可解释性强(每个节点都会告诉你,分裂的规则)

  可以用于特征选择(训练完会告诉你权重,可以依次来选择一些特征,把精简之后的特征喂给其他的模型,比如线性回归等简单的模型)

  这次比赛,

  主要用XGBoost、LightGBM库对比

  XGBoost

  Train time: 487.68 seconds

  MAPE: 0.251

  LightGBM(虽然需要指定超参数、但是效果很好)

  Train time: 19.19 seconds

  MAPE: 0.256

  

  深度学习:

  我们把预测值销量归一化,

  Embedding网络示意图,

  计算资源需求较大

  超参数调优

  网络结构

  Embedding size

  Dropout

  MAPE: 0.654

  赛题中400万的数据,跑起来非常慢,因为比赛中没有使用GPU所以训练的时间还是比较久的。

  另外一点,Embedding把原始的特征输入,虽然特征工程少一些,但网络的超参数需要调整,而且很多然而没有理论依据,说白了就是尝试,一直尝试哪个会比较好,MAPE: 0.654比平均值稍微好一点。比起XGBoost的基准线还是差了很多。

  

  把线性模型的东西加进来,可以两个模型一起训练,线性模型主要做记忆功能,历史上出现的模式可以通过线性模型,记忆下来。

  Deep Models提升泛化能力。

  下图是用TensorFlow来实现wide and deep models。

  

  左边是deep model的实现,右边是线性模型(wide层)。

  

  图中为,原始论文中的特征的构建方式,deep models那层要求输入是密集型的,稀疏是不能直接做输入的,所以要做转换,有的用Embedding等来做转换。

  

  模型选择完后,需要进行模型的训练和调优,其中重要的一步是交叉验证,在时间序列中,交叉验证有一个重点——构建与真实场景一致的切分方式。在时间序列中用一个连续的一段时间去预测紧接着的时间一个时间切分,切分方式与真实场景一致,随机切分不是在真实场景中的切分方式。会影响效果。

  超参数的调整

  1.启发式调优

  用经验。比较简单的是用启发式的调优,先固定一个比较大的learning rate去调树的数量、树的深度、叶子节点分页需要的条件之类的。

  2.网格搜索

  把所有想要尝试的参数写下来。网格搜索自动把所有的组合尝试一遍,帮你找到最优的组合,把最优的结果返回给你。

  3.贝叶斯优化

  把超参数搜索的过程看成高斯过程,库会自动尝试不同参数,然后寻找下一个最可能出现比较低的loss的尝试,搜索空间的计算量比网格搜索小很多。

  

  模型融合

  用模型融合的方法来做效果提升。做完这个超参数调整之后,一般来说,最后用模型融合的方法来做效果提升,首先保证模型具有一定的差异性,可以选择不同随机数种子,生成不同的预测结果,最后再把各个模型融合起来。

  

  比较常见的模型融合的方法是Blending和Stacking。是现在有很多库已经实现了,调用非常方便。Stacking就是把各个模型的预测值预测出来,把预测值作为特征输入下一层模型中,下一层自动选择最好的融合参数,有的模型权重高,有的权重低。把最后融合好的预测值给输出。

  误差分析

  预测结束后,会对模型做最终的调优。主要看模型会在哪些点上产生误差。如何通过各种方法产生大的误差,误差最大的点要进行细致深入的分析,为什么会出现这样的误差。日后我们通过各种方法去解决大误差。

  

  一个新产品,第一次在要预测的月份售卖。卖出了几千份。用历史数据很难预测准确。所以会产生误差。这种情况可以建立子模型专门去新品销售数量的预测。融合模型方面,用了三个XGBoost、LightGBM、Random Forest,其实也可以用时间序列和神经网络,但是主要是因为计算资源有限,所以没有观察最终融合的效果。最后得到的MAPE: 0.236,比起基准线,好了很多。(完)

  补充:

  观远数据团队也在探索,如何将深度学习应用到商业分析领域,现在来说还是待决的问题,不像图像和语音识别技术已经取得和很大的进展,深度学习在商业分析领域处理较少数据量,复杂规律、复杂业务特征等方面很有挑战。期待数据科学家的加入。

  以上内容为观远数据技术合伙人周远技术公开课分享笔记,未能与本人确认所有细节,仅供参考。赛事为微软大中华区智能零售(Smart Retail)解决方案新创企业黑客松上海站。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值