预测不了世界杯比分就预测百威啤酒销量送数据竞赛冠军笔记

2018-08-04 00:07
未知

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

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

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

  观察缺失值的情况。因为百威提供的数据质量很高,所以不需要考虑填充缺失值。(下图白色Unnamed:3为缺失值)

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

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

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

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

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

  另:日期对齐也是时间序列预测问题中常见的技术。比如中国春节在一月或者二月,需要考虑历史数据上春节的月份和今年春节的时间点是不是对的上。如果对不上是预处理,会提高预测的精度。还有一些业务相关的逻辑。比如销量为零,售价不为零之类。也需要做处理。

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

  基础特征方面,百威提供原始数据集的特征,在此基础上做了一些各维度的统计聚合,需要各维度聚合——时间、门店、商品。

  比如,日期衍生(是否是节假日,本周的节假日有几天,距离下一个工作日有几天)、商品、门店属性、各类高级计算。新商品从第一天开始售卖,累计的销售天数。

  2014年Facebook在论文中提出的方法——GBDT生成特征,论文认为决策树的模型可以自动做一些特征的组合和转换。

  说白了就是把Input放进去之后,看每一棵树,落在每一个叶子的节点上,以此做一个新的特征,原始论文中,把特征放在一个逻辑回归的模型中去做,当然你也可以把输出的特征和原始的特征加在一起,放在XGBoost、或者FM(Factorization Machine 因子分解机,又称分解机器,旨在解决大规模稀疏数据下的特征组合问题)。

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

  在比赛中,我们用Keras做了Embedding实现,把商品、日期、门店做了Embedding,套几个全连接的层,加一些东西,一直到输出到结果。

  左边月份的聚类,7、8、9月热,距离在图上近,天气比较冷的月份在图中距离差的比较远。

  右边t-SNE图是所有门店的图,因为得到的数据门店都用的ID(全数字)来表示,所以只能推测是行为模式比较像、或者地理位置比较近的门店是脱敏数据,所以没有办法检验。

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

  时间预测模型的示意图:GAM库,时间预测模型比较简单、预测值稳定,可解释性强,黑点是真实值,深蓝色预测值,淡蓝色是置信区间。因为有很多点捕捉不到,所以误差会大。

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

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

  我们把预测值销量归一化,Embedding网络示意图,计算资源需求较大。超参数调优、网络结构。

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

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

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

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

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

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

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

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

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

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

  预测结束后,会对模型做最终的调优。主要看模型会在哪些点上产生误差。如何通过各种方法产生大的误差,误差最大的点要进行细致深入的分析,为什么会出现这样的误差。日后我们通过各种方法去解决大误差。一个新产品,第一次在要预测的月份售卖。卖出了几千份。用历史数据很难预测准确。所以会产生误差。

  这种情况可以建立子模型专门去新品销售数量的预测。融合模型:用了三个XGBoost、LightGBM、Random Forest,其实也可以用时间序列和神经网络,但是主要是因为计算资源有限,所以没有观察最终融合的效果。最后得到的MAPE: 0.236。比起基准线,好了很多。

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

责任编辑:admin