精华内容
下载资源
问答
  • 2020-11-06 14:43:18

    预测性分析及常用的预测方法

    预测的目的

    数据分析最重要的目的就是从数据中寻找规律,找到能够指导我们未来实践的原则和方法,是产生智慧的主要途径。所以预测分析是数据分析的终极目的。虽然数据分析承担了很多功能,但是预测才是最为关键的,所以掌握数据分析和挖掘的预测方法才是数据分析师的看家本领。

    预测包括现象的预测和规律的预测。自然科学的本质上也是对事物的属性、本质和规律的预测。有了对事物的认知和对规律的掌握,我们就能够创造出更多的东西。商业也是如此,我们能够知道影响销售的因素,并能够掌握这些因素的数据,就能够对市场做出精准的预测,从而指导我们商业的决策,做到稳定的发展。但事物具有复杂性,我们无法掌握所有的信息,更无法轻易掌握所有的规律。

    随着大数据、物联网等技术的快速发展和应用,我们会拥有越来越多的数据,在这些数据上通过各种分析技术,我们就能够加工出越来越多的“智慧”,从而就能够知道我们的实践,而我们对未来的预测越来越精准,越来越有效。

    人们总是把数据分析师想象的过于美好,认为做大数据的人能够上知天文,下晓地理,能够准确的预测未来。人类掌握了一些基本的事物发展规律,对人类大脑、情感、心里的认知也逐步深入,但是我们对这些学科的掌握程度还远远达不到准确的预测未来的程度,至少现在还是没有这个能力,未来可能会有。

    我们经常说“以史为鉴”其实就是研究事物发展的历史,为我们研究新的事物做出指导,让我们对未来的事物有更远一点的估计。

    预测的必要性

    事物是复杂的,我们对事物的认知是有限的,正因为如此,事物在发展的过程中会发生超越我们预期的偶然时间和随机时间,我们把这些叫做误差,误差是必然存在的。随着我们对事物的认知越清楚,掌握的信息数据越完善,这个误差就睡越小,偶然时间就会越少。预测不准确的正常的,我们不能因为预测不准确而放弃对事物的预测,掌握未来发展是人类的本能,也是人类进化的动力。

    我们现在出行是,我们会根据地图应用提供的交通流量信息,选择不堵车最近的线路,这是一个典型的应用场景,把大数据当做平台和基础设施的应用场景。未来会有越来越多的这种应用场景,这就是预测在我们的日常生活中,影响着我们的日常生活。

    预测方法;

    1.经验预测法

    经验预测法是最为传统的预测法。如果我们有了丰富的生活阅历和工作经验,那么我们对事物的判断就会更加准确,从而能够做出更加合理的决策。

    我们认为一个优秀的人才一般都在优秀的公司中,所以企业会更加看中应聘者是不是在优秀的公司中工作过,这些都是为了佐证应聘者拥有丰富的相关“经验”。所以优秀的公司,在人才招聘方面的成本越低。而越是一般的公司,用人成本越高——因为我们过度依赖经验来管理。

    经验预测法在生活、工作中有大量的应用实例。人们最容易用自己过去的经验做出判断,所以人们几乎每时每刻都在做经验预测。量化的经验预测是一种数据化的方法。单纯依靠少数人的预测往往风险很高,因为我们每个人的生活经历都是有限的,并且看问题的视角也是有限的,所以对于重大决策,在没有其他更好的方法可以预测是,需要让更多的人一起利用经验来预测,这个方法被称为德尔菲法。

    德尔菲法是通过召集专家开会、通过集体讨论、得出一致预测意见的专家会议法既有联系又有区别。是一种专家预测方法。

    德尔菲法能发挥专家会议法的优点,即能充分发挥各位专家的作用,集思广益,准确性高。能把各位专家意见的分歧点表达出来,取各家之长,避各家之短。同时,德尔菲法又能避免专家会议法的缺点:权威人士的意见影响他人的意见;有些专家碍于情面,不愿意发表与其他人不同的意见;出于自尊心而不愿意修改自己原来不全面的意见。

    德尔菲法的主要缺点是:缺少思想沟通交流,可能存在一定的主观片面性;易忽视少数人的意见,可能导致预测的结果偏离实际;存在组织者主观影响

    2.类比预测法

    事物有很多的相似性,事物发展的规律也有相似性。例如人的成长历程,环境相同,人的成长历程也会有相近之处。当我们“阅人无数”后,基本上能够判断这个人是一个什么样的人。另外,人的行为习惯和思维习惯都有一致性,虽然会发生剧烈的变化,但在大多数情况下都是可以预测的。我们可以根据一个人对一件事情的反应,找到这个人的行为模式,从而预测其未来的行为模式,这就是类比预测法。

    人的行为模式的背后是人的心智模式。无论是九型人格学说还是MBTI的人格测试,其背后都是通过评测人的心智模式来预测人的行为模式,从而为人们找到一个比较好的事业发展规划。通过研究大量人员的行为模式,为个人以后的发展做出知道,这种方式的本质就是类比。

    通过一个行业的发展来类比另一个行业的发展,能够给我们很多的启发。例如智能手机取代了功能手机,苹果打败了诺基亚和摩托罗拉,成为智能手机的领导者。根据智能手机行业的发展规律,我们可以预测未来智能汽车的发展规律,特斯拉的创新性的智能汽车,不止单纯的电动汽车,如果不出意外,特斯拉很可能会彻底颠覆驱车行业,那些原有的行业大佬在未来短短的几年就会重新洗牌。

    就像智能手机一样,我们有理由相信智能汽车早晚会代替现在的功能性汽车。智能设备,智能家具,智能…都是不可逆的一种潮流,代表人类发展的趋势和规律。

    手机行业中,消费者的更换周期为2-3年,所以智能手机在2-3年就颠覆了手机行业原有的潮流。在城市中,消费这更换汽车的周期为5-7年,运用类比的方法,未来的5-7年就是智能手机慢慢取代原有汽车行业。取代是一个缓慢且顺应时代的产物,取代的周期就是消费者的一个更换周期。

    标杆研究也是一种类比的方法,可以通过研究标杆企业的做法借鉴其经营和管理的决策。如果一家公司采用某种管理模式成功解决了一类问题,那么我们也可以采用同样的方法来解决类似的问题。所以当我们对于某些管理问题找不到方法的时候,做简单有效的方法就是寻找标杆企业的做法。学会站在巨人的肩膀上看待问题。

    类比法也有局限性,主要的局限在于类的可比性。类比的本质含义就是同类的或者相近类别之间的对比,如果不具有可比性,则类比的预测就会出现问题。当然,没有两个事物是完全相同的,也没有相同的历史和未来,我们还需要在不同类别中寻找共同点,在这个共同点上找到差异,例如:智能手机用了2年就颠覆了手机行业,那是因为消费者更换手机的周期比较短。汽车行业就不适用这个周期,因为消费者更换汽车的周期要比手机的更换周期长的多。

    所以,我们类比的过程中,我们要思考可比的基础是什么,从而做出预测,对结论进行修订,确保预测的合理性和准确性,并在以后的过程中反思忽略了哪些重要因素,以后在进行预测时,还需要考虑哪些因素。

    3.惯性时间预测法

    惯性预测法是根据事物发展的惯性进行预测,其中最典型的就是趋势分析。炒股的人除了要看基本的股值点数外,还要看趋势线,并根据趋势线来判断什么地方时拐点。

    本质上,惯性只存在于信息不对称的领域,在信息足够对称的情况下,大家转向的风向一致,那么股票价格就不会有这样的波动图形。在信息不够对称的环境下,以信息谋取利润的行业就会有更多的暴力。如果信息已经充分对称了,那么以信息谋取利润的行业就会消失。未来商品的价格会越来越透明,根据信息不对称来销售商品的公司会倒闭。

    时间序列分析模型是最典型的惯性分析法,其本质就是探寻一个事物的数量化指标随时间变化的规律。如果事物完全按照时间顺序发展,则一定会按照一定的规律继续发展下去,如果是向上的趋势,就会继续向上发展;如果是向下的趋势,就会继续向下发展;如果存在周期性,就会按照周期性的规律发展;如果具有循环往复的特征,就会按照循环往复的特征发展下去

    从上面的描述中可以看出时间序列模型最本质的局限;忽略了现在的变化影响因素。即如果事物过去都是向上发展的,则时间序列认为事物还会继续向上发展,但是因为某些因素的原因,出现了下滑,则这个因素不予考虑,会认为是误差或者受随机因素的影响。

    时间序列模型有多种类型,这些类型的分类是从事物变化是否具有规律性来评价的。如果事物的变化很有规律性,而随机影响较小,则可以通过惯性预测法对事物的变化进行预测;如果事物变化是有规律的,但是噪声过大,容易掩盖事物自身的规律,这个时候惯性预测法就不太使用了。噪声的大小是我们是否可以使用惯性预测法来预测的非常重要的因素,噪声大,规律就容易被掩盖,噪声小,我们可以通过趋势来发现事物的规律。

    我们对事物变化规律的认知其实是有限的。一般来说,再利用惯性发探测事物变化规律时,我们能够掌握三种变化规律的探测,分别是季节性、周期性、趋势性。季节性是与时间变化有关系的变化规律。周期性是与变量取值有关系的,盛极而衰,触底反弹。趋势性是随时间呈增长或者下降的趋势,这个趋势可能线性的,也可能是幂级增长或者指数增长。

    4.逻辑关系预测法

    逻辑关系预测法从预测的角度来看是最简单的方法,但从算法探索的角度来看则是最难得方法。两个事物为什么会相关,其背后逻辑是什么,一直困扰着数据分析师。

    沃尔玛的“纸尿裤和啤酒”的事件,让我们觉得纸尿裤和啤酒的销售量有较大的相关性。但是这个相关性能否站的住脚,是否有足够的逻辑解释,是否在任何情况都适用,还是需要数据的支持,没有数据的完美论证。

    在逻辑关系方面,我们可以用各种模型来解读数据,需要不断尝试才能找到一个最佳的逻辑关系。有些逻辑关系只在特殊的情景下才成立,而在其他的情境下就不会成立。逻辑关系的数学模型不是一成不变的,他会随时间、市场状况的变化而变化。

    每个逻辑规律都有其成立的条件。在广告投放初期构建的模型,不见得适合中期和后期;品牌的知名度较低的时候,广告与销售额的关系会被弱化,边际效应显现。当公司的品牌已经非常强大的时候,广告本应该承担一个提醒功能,这个时候如果还是采用说服式广告就非常不妥了,消费者会觉得这是“忽悠”,其自我保护机制显现,导致一些负面的成绩。

    5.比例预测法

    比例是一个数学术语,在数学中,如果一个变量的变化总是伴随着另一个变量的变化,则两个变量是成比例的。我们的日常生活中处处充满着比例。例如:奶茶中奶和茶的比例可以带来不一样的口感,混凝土中砂石、水泥、水的比例,会呈现不同的强度。

    运用比例预测法,其实就是针对以往的数据,对其进行分类汇总整理后,对未来的数据按照一定的比例进行预测,这种比例就是通过以往的数据总结出来的比例。人的行为方式、兴趣爱好在短时间是不会发生较大的变化,我们的预测其实就是在预测人的行为方式和思维,这也就是为什么可以使用比例预测法的原因,因为人的行为方式、兴趣爱好不会轻易改变。

    小编喜欢吃鸡肉,可能再不出现较大的事情之前,这点爱好是不会改变的,通过一段时间的数据收集、汇总、分析。就能够预测出未来的一段时间吃鸡肉的这个概率。一个人的行为方式可能会受到外界因素的影响,可能预测的准确率不会太高。但是如果换做是分析几万,几十万或者更多的人的行为方式兴趣爱好进行整理汇总,在进行预测性分析,那么准确率就会很稳定。

    比例预测法的重点就是在无特殊情况下的一种状态下的预测,例如:一家大型购物中心,前5个月的会员销售占比为50%,那么在第六个月的会员销售占比也会是在50%左右。前5个月的周一到周五的日均销售额为100万,周六周日的日均销售是200万。那么我们可以根据本月工作日和双休日的天数,预测出这个月的一个销售额。

    商业中有一个重要的比例;【10:6:3:1】。讲的是,在每10个顾客中,会有6个人会感兴趣,其中3个人会购买,最终会有1个人进行复购。这个比例在很多销售行业都很适用。这也就是为什么到了一定的节假日,各大商场购物中心花重金进行宣传营销,目的是为了提高10这个基数,基数上升了,最终的3和1也就自然多了。

    比例预测法也有其局限性,比例预测法成立的前提是需要有大量的数据源,但是当数据较少的情况下,比例预测法就没有效果,反而会误导我们的决策。

    更多相关内容
  • 时间序列预测方法最全总结!

    万次阅读 多人点赞 2021-03-12 00:15:38
    时间序列预测就是利用过去一段时间的数据来预测未来一段时间内的信息,包括连续型预测(数值预测,范围估计)与离散型预测(事件预测)等,具有非常高的商业价值。需要明确一点的是,与回归分析预测模型...

    时间序列预测就是利用过去一段时间的数据来预测未来一段时间内的信息,包括连续型预测(数值预测,范围估计)与离散型预测(事件预测)等,具有非常高的商业价值。

    需要明确一点的是,与回归分析预测模型不同,时间序列模型依赖于数值在时间上的先后顺序,同样大小的值改变顺序后输入模型产生的结果是不同的。如之前的文章所介绍,时间序列可以分为平稳序列,即存在某种周期,季节性及趋势的方差和均值不随时间而变化的序列,和非平稳序列。如何对各种场景的时序数据做准确地预测,是一个非常值得研究的问题。

    本文为大家总结时间序列预测的有关方法,浅析这些技术并探索如何可以提高这些方法的预测效果。

    01

    基本规则法

    要预测一个时间序列,我们首先需要发现其变化的规律。最基本的方法,就是通过人工经验,挖掘时序数据的演化特征,找到时序变化的周期,从而预估时间序列的未来走势。具体的观察一个时间序列,当序列存在周期性时,提取时间序列的周期性特征进行预测。

    图 | 抽取时序的周期进行拟合

    02

    传统参数法

    之前我们介绍了时间序列的统计分析方法,该方法可以将时间序列的演化变为数学参数,天然的,我们可以通过拟合好的模型,进行时间序列的预测。

    传统的参数预测方法可以分为两种,一种拟合标准时间序列的餐顺方法,包括移动平均,指数平均等;另一种是考虑多因素组合的参数方法,即AR,MA,ARMA等模型。这类方法比较适用于小规模,单变量的预测,比如某门店的销量预测等。总的来说,基于此类方法的建模步骤是:

    首先需要对观测值序列进行平稳性检测,如果不平稳,则对其进行差分运算直到差分后的数据平稳;
    在数据平稳后则对其进行白噪声检验,白噪声是指零均值常方差的随机平稳序列;
    如果是平稳非白噪声序列就计算ACF(自相关系数)、PACF(偏自相关系数),进行ARMA等模型识别,
    对已识别好的模型,确定模型参数,最后应用预测并进行误差分析。
    

    这类方法一般是统计或者金融出身的人用的比较多,对统计学或者随机过程知识的要求比较高。而在数据挖掘的场景中比较难适用,因为需要大量的参数化建模。比如有一个连锁门店的销售数据,要预测每个门店的未来销量,用这类方法的话就需要对每个门店都建立模型, 这样就很难操作了。

    03

    时间序列分解

    时间序列分解法是数年来一直非常有用的方法,一个时间序列往往是一下几类变化形式的叠加或耦合:

    长期趋势(Secular trend, T):长期趋势指现象在较长时期内持续发展变化的一种趋向或状态。
    季节变动(Seasonal Variation, S):季节波动是由于季节的变化引起的现象发展水平的规则变动
    循环波动(Cyclical Variation, C):循环波动指以若干年为期限,不具严格规则的周期性连续变动
    不规则波动(Irregular Variation, I): 不规则波动指由于众多偶然因素对时间序列造成的影响
    

    图 | 原始时间序列

    时间序列分解模型

    /加法模型

    加法模型的形式如下:

    加法模型中的四种成分之间是相互独立的,某种成分的变动并不影响其他成分的变动。各个成分都用绝对量表示,并且具有相同的量纲。

    /乘法模型

    乘法模型的形式如下:

    乘法模型中四种成分之间保持着相互依存的关系,一般而言,长期趋势用绝对量表示,具有和时间序列本身相同的量纲,其他成分则用相对量表示。

    /加乘混合模型

    以上两种方式的混合

    时间序列的长期趋势分析

    图 | 拟合的时序趋势

    /移动平均法

    在原时间序列内依次求连续若干期的平均数作为其某一期的趋势值,如此逐项递移求得一系列的移动平均数,形成一个平均数时间序列。

    /时间回归法

    使用回归分析中的最小二乘法,以时间t或t的函数为自变量拟合趋势方程。常用的趋势方程如下:

    一阶线性方程
    二次(多次)方程曲线
    指数曲线
    

    时间序列季节变动分析

    时间序列短期会受季节等短期因素影响,从而存在一些周期性


    图 | 拟合的季节变动

    /乘法模型-季节指数

    乘法模型中的季节成分通过季节指数来反映。常用的方法称为移动平均趋势剔除法。步骤如下:

    1. 计算一动平均值

    2. 从序列中剔除移动平均值

    时间序列循环变动分析

    时序长期来看会存在一个循环往复,通常通过剩余法来计算循环变动成分C:

    如果有季节成分,计算季节指数,得到季节调整后的数据TCI
    根据趋势方程从季节调整后的数据中消除长期趋势,得到序列CI
    对消去季节成分和趋势值的序列CI进行移动平均以消除不规则波动,得到循环变动成分C
    

    图 | 拟合的长期循环变动

    时间序列不规则变动分析

    除了以上三种变动信息,剩下的为不规律的时序变动信息。如有需要,可以进一步分解出不规则变动成分:

    对于一个时间序列,剔除长期趋势,季节性,循环变动因素之后,剩下的就是不规则变动因素

    图 | 拟合的不规则变动

                 Prophet

    这里特别提一个Facebook 所服务化的时间序列预测工具,Prophet,具体可以参考官网说明。该方法类似于STL时序分解的思路,增加考虑节假日等信息对时序变化的影响。

    04

    机器学习

    近年来时间序列预测方法,多采用机器学习方式。机器学习的方法,主要是构建样本数据集,采用“时间特征”到“样本值”的方式,通过有监督学习,学习特征与标签之前的关联关系,从而实现时间序列预测。常用的场景有:

    /单步预测

    在时间序列预测中的标准做法是使用滞后的观测值,作为输入变量来预测当前的时间的观测值。这被称为单步单变量预测。

    /多步预测

    另一种预测问题类型是使用过去的观测序列 来预测未来的观测序列。这就是多步预测或序列预测。

    /多变量预测

    另一个重要的时间序列称为多元时间序列,即每个时间有多个观测值:

    这意味着我们通过不同的测量手段得到了多种观测值,并且希望预测其中的一个或几个值。例如,我们可能有两组时间序列观测值,我们希望分析这组多元时间序列来预测 

    基于以上场景,许多监督学习的方法可以应用在时间序列的预测中,比如svm/xgboost/逻辑回归/回归树/...

    05

    深度学习

    深度学习方法近年来逐渐替代机器学习方法,成为人工智能与数据分析的主流,对于时间序列的分析,有许多方法可以进行处理,包括:循环神经网络-LSTM模型/卷积神经网络/基于注意力机制的模型(seq2seq)/...

    /循环神经网络

    循环神经网络(RNN)框架及其变种(LSTM/GRU/...)是为处理序列型而生的模型,天生的循环自回归的结构是对时间序列的很好的表示。所采用的方式也是监督学习,不过不需要人为的构建时序特征,可以通过深度学习网络拟合时序曲线,捕捉时间先后顺序关系,长期依赖,进行特征学习与预测。

    /卷积神经网络

    传统的卷积神经网络(CNN)一般认为不太适合时序问题的建模,这主要由于其卷积核大小的限制,不能很好的抓取长时的依赖信息。但是最近也有很多的工作显示,特定的卷积神经网络结构也可以达到很好的效果,通常将时间序列转化为图像,再应用基于卷积神经网络的模型做分析。

    Gramian Angular Field (格拉姆角场GAF)

    将笛卡尔坐标系下的一维时间序列,转化为极坐标系表示,再使用三角函数生成GAF矩阵。计算过程:

    数值缩放:将笛卡尔坐标系下的时间序列缩放到[0,1]或[-1,1]区间
    极坐标转换:使用坐标变换公式,将笛卡尔坐标系序列转化为极坐标系时间序列
    角度和/差的三角函数变换:若使用两角和的cos函数则得到GASF,若使用两角差的cos函数则得到GADF
    

    Short Time Fourier Transform (短时傅里叶变换STFT)

    在语音信号处理场景使用很广泛,其目标主要将时间序列转为时频图像,进而采用卷积网络进行特征分析。


    /时间卷积网络

    时间卷积网络(TCN)是一种特殊的卷积神经网络,针对一维空间做卷积,迭代多层捕捉长期关系。具体的,对于上一层t时刻的值,只依赖于下一层t时刻及其之前的值。和传统的卷积神经网络的不同之处在于,TCN不能看到未来的数据,它是单向的结构,不是双向的。也就是说只有有了前面的因才有后面的果,是一种严格的时间约束模型,因此又被称为因果卷积。

    /基于注意力机制的模型

    在RNN中分析时间序列需要我们一步步的顺序处理从 t-n 到 t 的所有信息,而当它们相距较远(n非常大)时RNN的效果常常较差,且由于其顺序性处理效率也较低。基于注意力机制(Attention)的模型,采用跳步的方式计算每个数值之间的两两关联,然后组合这些关联分数得到一个加权的表示。该表示通过前馈神经网络的学习,可以更好的考虑到时序的上下文的信息。

    以上步骤如下动图所示:

    /结合CNN+RNN+Attention,作用各不相同互相配合

    主要设计思想:

    • CNN捕捉短期局部依赖关系

    • RNN捕捉长期宏观依赖关系

    • Attention为重要时间段或变量加权

    06

    一些需要注意的难点

    • 理解时间序列预测问题是要用历史数据预测未来数据

    • 时间序列问题的训练集、测试集划分

    • 特征工程方法及过程

    • 如何转化为监督学习数据集

    • LSTM计算过程理解,包括输入输出维度、参数数量等

    • seq2seq过程的理解,decoder实现

    • attention注意力机制的原理及实现,包括encoder-decoder attention, self attention, multi-head attention等

    • 时间卷积网络的含义,dilated-convolution 和 causal-convolution

    • prophet预测原理,各参数对模型拟合效果、泛化效果的影响

    • 时间序列基本规则法中周期因子得计算过程

    • 传统方法如周期因子、线性回归、ARMA等的预测结果表现为,预测趋势大致正确,但对波动预测不理想,体现在波动的幅度差异、相位偏移。

    • 时间序列分解方法。理解加法模型和乘法模型,判断分解模型的选取及分解技巧。

    /工具

    • tslearn:开源的时间序列机器学习python工具包

    • tsfresh:开源的时间序列特征提取python工具包

    • pyts:开源的时间序列分类Python工具包。提供预处理工具及若干种时间序列分类算法

    “整理不易,三连

    展开全文
  • 本文的出发点在于比较传统预测方法和机器学习预测方法。 本文使用的数据集来自 kaggle:M5 Forecasting — Accuracy。 该数据集包含有 California、Texas、Wisconsin 三个州的产品类别、部门、仓储信息等。基于这些...

    本文的出发点在于比较传统预测方法和机器学习预测方法。

    本文使用的数据集来自 kaggle:M5 Forecasting — Accuracy
    该数据集包含有 California、Texas、Wisconsin 三个州的产品类别、部门、仓储信息等。基于这些数据,需要预测接下来 28 天的每日销售量。

    涉及到的方法有:

    • 单指数平滑法
    • 双指数平滑法
    • 三指数平滑法
    • ARIMA
    • SARIMA
    • SARIMAX
    • Light Gradient Boosting
    • Random Forest
    • Linear Regression

    为了使用上述方法,首先导入相应的包/库:

    import time
    import warnings
    import numpy as np
    import pandas as pd 
    import seaborn as sns 
    import lightgbm as lgb
    from itertools import cycle
    from sklearn.svm import SVR
    import statsmodels.api as sm
    from pmdarima import auto_arima
    import matplotlib.pyplot as plt
    from datetime import datetime, timedelta
    from sklearn.metrics import mean_squared_error
    from sklearn.linear_model import LinearRegression
    from sklearn.ensemble import RandomForestRegressor
    from statsmodels.graphics.tsaplots import plot_acf
    from statsmodels.tsa.holtwinters import SimpleExpSmoothing, ExponentialSmoothing
    
    %matplotlib inline 
    plt.style.use('bmh')
    sns.set_style("whitegrid")
    plt.rc('xtick', labelsize=15) 
    plt.rc('ytick', labelsize=15) 
    warnings.filterwarnings("ignore")
    pd.set_option('max_colwidth', 100)
    pd.set_option('display.max_rows', 500)
    pd.set_option('display.max_columns', 500)
    color_pal = plt.rcParams['axes.prop_cycle'].by_key()['color']
    color_cycle = cycle(plt.rcParams['axes.prop_cycle'].by_key()['color'])
    
    

    然后导入数据集:

    data = pd.read_csv('data_for_tsa.csv')
    data['date'] = pd.to_datetime(data['date'])
    data.head()
    

    数据集前五行数据

    数据集包含了 2011-01-29 到 2016-05-22 期间的 1941 天的数据。其中最后 28 天作为测试集。

    预测目标是 demand,即:当日的产品销售量。


    接下来进行数据集划分

    测试集包含了 2016-03-27 到 2016-04-24 期间的 28 天的数据。
    2016-03-27 之前的其他数据则作为训练数据。

    train = data[data['date'] <= '2016-03-27']
    test = data[(data['date'] > '2016-03-27') & (data['date'] <= '2016-04-24')]
    
    fig, ax = plt.subplots(figsize=(25,5))
    train.plot(x='date',y='demand',label='Train',ax=ax)
    test.plot(x='date',y='demand',label='Test',ax=ax);
    

    时间序列数据


    为了便于对比所有方法的准确性,建立一个命名为 predictions 的 dataframe,将每个方法设为其中的一行。建立一个命名为stats的 dataframe,用于存储每个方法的性能表现和计算时间。

    predictions = pd.DataFrame()
    predictions['date'] = test['date']
    stats = pd.DataFrame(columns=['Model Name','Execution Time','RMSE'])
    

    训练及评价模型

    单指数平滑方法

    通过调用 SimpleExpSmoothing 包,可以使用 EWMA, Exponentially Weighted Moving Average方法——一种单指数平滑方法。

    使用 EWMA 方法,我们首先需要定义 span 变量——数据集的季节周期。

    fig, ax = plt.subplots(figsize=(15, 3))
    plot_acf(data['demand'].tolist(), lags=60, ax=ax);
    

    自相关图

    查看数据的自相关图可知,每隔七个数据,达到一个峰值,也就意味着任一数据与之前的第七个时间数据具有较高的相关性。所以这里将 span 设为 7。

    具体地,通过以下代码实现单指数平滑方法预测:

    t0 = time.time()
    model_name='Simple Exponential Smoothing'
    span = 7
    alpha = 2/(span+1)
    #train
    simpleExpSmooth_model = SimpleExpSmoothing(train['demand']).fit(smoothing_level=alpha,optimized=False)
    t1 = time.time()-t0
    #predict
    predictions[model_name] = simpleExpSmooth_model.forecast(28).values
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t1, 'RMSE':score},ignore_index=True)
    
    

    单指数平滑方法预测结果


    上述代码实现了对于数据的学习,通过 forcast(x),x=28,预测了接下来 28 天的数据。并且通过均方根误差衡量误差。

    双指数平滑方法

    单指数平滑方法只使用了一个平滑系数 α \alpha α,而双指数平滑方法则引入了第二个平滑系数 β \beta β,以反映数据的趋势。
    使用双指数平滑方法,我们需要定义 seasonal_periods

    具体代码如下:

    t0 = time.time()
    model_name='Double Exponential Smoothing'
    #train
    doubleExpSmooth_model = ExponentialSmoothing(train['demand'],trend='add',seasonal_periods=7).fit()
    t1 = time.time()-t0
    #predict
    predictions[model_name] = doubleExpSmooth_model.forecast(28).values
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t1, 'RMSE':score},ignore_index=True)
    

    双指数平滑方法预测结果

    三指数平滑方法

    三指数平滑方法进一步引入了系数以反映数据的趋势及季节性变化。

    具体代码如下:

    t0 = time.time()
    model_name='Triple Exponential Smoothing'
    #train
    tripleExpSmooth_model = ExponentialSmoothing(train['demand'],trend='add',seasonal='add',seasonal_periods=7).fit()
    t1 = time.time()-t0
    #predict
    predictions[model_name] = tripleExpSmooth_model.forecast(28).values
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t1, 'RMSE':score},ignore_index=True)
    
    

    三指数平滑方法预测结果


    从预测结果可以看出,三指数平滑方法能够学习数据的季节性变化特征。

    ARIMA

    使用 ARIMA 方法,首先需要确定 p,d,q 三个参数。

    • p 是AR项的顺序。
    • d 是使时间序列平稳所需的差分次数
    • q 是MA项的顺序。

    自动确定 ARIMA 所需参数

    通过调用 auto_arima 包,可以自动确定 ARIMA 所需的参数。

    t0 = time.time()
    model_name='ARIMA'
    arima_model = auto_arima(train['demand'], start_p=0, start_q=0,
                              max_p=14, max_q=3,
                              seasonal=False,
                              d=None, trace=True,random_state=2020,
                              error_action='ignore',   # we don't want to know if an order does not work
                              suppress_warnings=True,  # we don't want convergence warnings
                              stepwise=True)
    arima_model.summary() 
    

    auto_arima 的计算结果

    确定了 p,d,q 参数,就可以进行下一步的训练及预测:

    #train
    arima_model.fit(train['demand'])
    t1 = time.time()-t0
    #predict
    predictions[model_name] = arima_model.predict(n_periods=28)
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t1, 'RMSE':score},ignore_index=True)
    

    ARIMA 预测结果

    这里使用的简单ARIMA模型不考虑季节性,是一个(5,1,3)模型。这意味着它使用5个滞后来预测当前值。移动窗口的大小等于 1,即滞后预测误差的数量等于1。使时间序列平稳所需的差分次数为 3。

    SARIMA

    SARIMA 是 ARIMA 的发展,进一步引入了相关参数以使得模型能够反映数据的季节变化特征。

    通过 auto_arima 相关代码,将参数设置为 seasonal=True,m=7,自动计算 SARIMA 所需的参数。

    t0 = time.time()
    model_name='SARIMA'
    sarima_model = auto_arima(train['demand'], start_p=0, start_q=0,
                              max_p=14, max_q=3,
                              seasonal=True, m=7,
                              d=None, trace=True,random_state=2020,
                              out_of_sample_size=28,
                              error_action='ignore',   # we don't want to know if an order does not work
                              suppress_warnings=True,  # we don't want convergence warnings
                              stepwise=True)
    sarima_model.summary() 
    
    

    auto_arima 计算结果

    确定了参数后,接下来进行训练及预测:

    #train
    sarima_model.fit(train['demand'])
    t1 = time.time()-t0
    #predict
    predictions[model_name] = sarima_model.predict(n_periods=28)
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t1, 'RMSE':score},ignore_index=True)
    
    

    SARIMA 预测结果

    SARIMAX

    使用前面的方法,我们只能基于前面的历史数据进行预测。在 SARIMAX 中引入外生回归因子(eXogenous regressors),可以实现对时间序列数据以外的数据的分析。

    本例中,我们引入 sell_price 数据以辅助更好地预测。

    t0 = time.time()
    model_name='SARIMAX'
    sarimax_model = auto_arima(train['demand'], start_p=0, start_q=0,
                              max_p=14, max_q=3,
                              seasonal=True, m=7,
                              exogenous = train[['sell_price']].values,
                              d=None, trace=True,random_state=2020,
                              out_of_sample_size=28,
                              error_action='ignore',   # we don't want to know if an order does not work
                              suppress_warnings=True,  # we don't want convergence warnings
                              stepwise=True)
    sarimax_model.summary() 
    

    auto_arima 计算结果

    通过 auto_arima 自动计算了 SARIMAX 方法所需的参数后,可以直接进行训练和预测。

    #train
    sarimax_model.fit(train['demand'])
    t1 = time.time()-t0
    #predict
    predictions[model_name] = sarimax_model.predict(n_periods=28)
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t1, 'RMSE':score},ignore_index=True)
    

    SARIMAX 预测结果

    从预测结果可以看出,通过分析额外的数据,有助于减少误差。

    机器学习

    使用机器学习方法,首先需要特征数据以及指标数据。

    在本文中,基于时间序列数据构造特征数据如下:

    • 特征数据1:滞后数据。 选择 7 天前的 demand 数据作为特征数据。
    • 特征数据2:移动平均数据。选择 7 天前至 14 天之前的 demand 移动平均值数据作为特征数据。
    • 特征数据3:月销售均值
    • 特征数据4:每月销售最大值
    • 特征数据5:每月销售最小值
    • 特征数据6:每月销售最大值与最小值的差值
    • 特征数据7:每周销售均值
    • 特征数据8:每周销售最大值
    • 特征数据9:每周销售中值

    具体代码如下:

    def lags_windows(df):
        lags = [7]
        lag_cols = ["lag_{}".format(lag) for lag in lags ]
        for lag, lag_col in zip(lags, lag_cols):
            df[lag_col] = df[["id","demand"]].groupby("id")["demand"].shift(lag)
    
        wins = [7]
        for win in wins :
            for lag,lag_col in zip(lags, lag_cols):
                df["rmean_{}_{}".format(lag,win)] = df[["id", lag_col]].groupby("id")[lag_col].transform(lambda x : x.rolling(win).mean())   
        return df
    
    def per_timeframe_stats(df, col):
        #For each item compute its mean and other descriptive statistics for each month and dayofweek in the dataset
        months = df['month'].unique().tolist()
        for y in months:
            df.loc[df['month'] == y, col+'_month_mean'] = df.loc[df['month'] == y].groupby(['id'])[col].transform(lambda x: x.mean()).astype("float32")
            df.loc[df['month'] == y, col+'_month_max'] = df.loc[df['month'] == y].groupby(['id'])[col].transform(lambda x: x.max()).astype("float32")
            df.loc[df['month'] == y, col+'_month_min'] = df.loc[df['month'] == y].groupby(['id'])[col].transform(lambda x: x.min()).astype("float32")
            df[col + 'month_max_to_min_diff'] = (df[col + '_month_max'] - df[col + '_month_min']).astype("float32")
    
        dayofweek = df['dayofweek'].unique().tolist()
        for y in dayofweek:
            df.loc[df['dayofweek'] == y, col+'_dayofweek_mean'] = df.loc[df['dayofweek'] == y].groupby(['id'])[col].transform(lambda x: x.mean()).astype("float32")
            df.loc[df['dayofweek'] == y, col+'_dayofweek_median'] = df.loc[df['dayofweek'] == y].groupby(['id'])[col].transform(lambda x: x.median()).astype("float32")
            df.loc[df['dayofweek'] == y, col+'_dayofweek_max'] = df.loc[df['dayofweek'] == y].groupby(['id'])[col].transform(lambda x: x.max()).astype("float32")
        return df
    
    def feat_eng(df):
        df = lags_windows(df)
        df = per_timeframe_stats(df,'demand')
        return df
    
    

    准备数据:

    data = pd.read_csv('data_for_tsa.csv')
    data['date'] = pd.to_datetime(data['date'])
    train = data[data['date'] <= '2016-03-27']
    test = data[(data['date'] > '2016-03-11') & (data['date'] <= '2016-04-24')]
      
    data_ml = feat_eng(train)
    data_ml = data_ml.dropna() 
    
    useless_cols = ['id','item_id','dept_id','cat_id','store_id','state_id','demand','date','demand_month_min']
    linreg_train_cols = ['sell_price','year','month','dayofweek','lag_7','rmean_7_7'] #use different columns for linear regression
    lgb_train_cols = data_ml.columns[~data_ml.columns.isin(useless_cols)]
    X_train = data_ml[lgb_train_cols].copy()
    y_train = data_ml["demand"]
    
    

    模型拟合

    通过 light gradient boosting、linear regression、random forest 三种方法对数据进行拟合:

    #Fit Light Gradient Boosting
    t0 = time.time()
    lgb_params = {
            "objective" : "poisson",
            "metric" :"rmse",
            "force_row_wise" : True,
            "learning_rate" : 0.075,
            "sub_row" : 0.75,
            "bagging_freq" : 1,
            "lambda_l2" : 0.1,
            'verbosity': 1,
            'num_iterations' : 2000,
            'num_leaves': 128,
            "min_data_in_leaf": 50,
    }
    np.random.seed(777)
    fake_valid_inds = np.random.choice(X_train.index.values, 365, replace = False)
    train_inds = np.setdiff1d(X_train.index.values, fake_valid_inds)
    train_data = lgb.Dataset(X_train.loc[train_inds] , label = y_train.loc[train_inds], free_raw_data=False)
    fake_valid_data = lgb.Dataset(X_train.loc[fake_valid_inds], label = y_train.loc[fake_valid_inds],free_raw_data=False)
    
    m_lgb = lgb.train(lgb_params, train_data, valid_sets = [fake_valid_data], verbose_eval=0) 
    t_lgb = time.time()-t0
    
    #Fit Linear Regression
    t0 = time.time()
    m_linreg = LinearRegression().fit(X_train[linreg_train_cols].loc[train_inds], y_train.loc[train_inds])
    t_linreg = time.time()-t0
    
    #Fit Random Forest
    t0 = time.time()
    m_rf = RandomForestRegressor(n_estimators=100,max_depth=5, random_state=26, n_jobs=-1).fit(X_train.loc[train_inds], y_train.loc[train_inds])
    t_rf = time.time()-t0
    

    模型预测

    值得注意的是,在训练阶段,我们使用了7 天前的 demand 数据以及 7 天前至 14 天之前的 demand 移动平均值数据作为特征数据。但是在预测阶段,是没有 demand 数据的。因此这里需要借助滑动窗口,sliding window,的概念,也就是每次计算一个预测数据。
    为了计算移动平均值数据,设置滑动窗口长度为 15。

    通过滑动窗口方法预测未知数据的具体代码如下:

    fday = datetime(2016,3, 28) 
    max_lags = 15
    for tdelta in range(0, 28):
        day = fday + timedelta(days=tdelta)
        tst = test[(test.date >= day - timedelta(days=max_lags)) & (test.date <= day)].copy()
        tst = feat_eng(tst)
        tst_lgb = tst.loc[tst.date == day , lgb_train_cols].copy()
        test.loc[test.date == day, "preds_LightGB"] = m_lgb.predict(tst_lgb)
        tst_rf = tst.loc[tst.date == day , lgb_train_cols].copy()
        tst_rf = tst_rf.fillna(0) 
        test.loc[test.date == day, "preds_RandomForest"] = m_rf.predict(tst_rf)
        
        tst_linreg = tst.loc[tst.date == day , linreg_train_cols].copy()
        tst_linreg = tst_linreg.fillna(0)    
        test.loc[test.date == day, "preds_LinearReg"] = m_linreg.predict(tst_linreg) 
        
    test_final = test.loc[test.date >= fday]
    

    Light Gradient Boosting

    model_name='LightGB'
    predictions[model_name] = test_final["preds_"+model_name]
    
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test_final.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test_final['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t_lgb, 'RMSE':score},ignore_index=True)
    

    Light Gradient Boosting 预测结果

    Random Forest

    model_name='RandomForest'
    predictions[model_name] = test_final["preds_"+model_name]
    
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test_final.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test_final['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t_lgb, 'RMSE':score},ignore_index=True)
    

    Random Forest 预测结果

    Linear Regression

    model_name='LinearReg'
    predictions[model_name] = test_final["preds_"+model_name]
    
    #visualize
    fig, ax = plt.subplots(figsize=(25,4))
    train[-28:].plot(x='date',y='demand',label='Train',ax=ax)
    test_final.plot(x='date',y='demand',label='Test',ax=ax);
    predictions.plot(x='date',y=model_name,label=model_name,ax=ax);
    #evaluate
    score = np.sqrt(mean_squared_error(predictions[model_name].values, test_final['demand']))
    print('RMSE for {}: {:.4f}'.format(model_name,score))
    
    stats = stats.append({'Model Name':model_name, 'Execution Time':t_linreg, 'RMSE':score},ignore_index=True)
    

    Linear Regression 预测结果

    以上就是所有的预测方法及过程。各个方法的运算时间及结果误差如下:

    stats.sort_values(by='RMSE')
    stats.plot(kind='bar',x='Model Name', y='RMSE', figsize=(12,6), title="Model RMSE Comparison - Lower is better");
    

    各个方法的运算时间及结果误差对比

    各个方法的结果误差对比

    可以看出,传统预测方法的性能相较于机器学习预测方法较差。

    但是这个结论并不是绝对的。方法的准确度取决于不同的问题背景。
    机器学习方法依赖于特征数据。如果我们只有时间序列数据,那么特征数据较为缺乏,我们可以基于原始数据创建特征数据,如滞后数据、移动平均数据等。因此机器学习方法要呈现更好地预测结果,特征工程至关重要。在机器学习领域,某种程度上,数据才是起决定作用,而不是模型或者算法。

    最后,参加过这个比赛的应该都能看到我们的公众号

    展开全文
  • 电商销量预测方法综述

    千次阅读 2021-03-08 15:01:31
    但是销量的预测受影响复杂,传统的基于统计的计量模型,比如时间序列模型等由于对现实的假设情况过多,在实际场景中应用,本文利用R语言和Python梳理并实现了当前主流的电商销量预测方法:第一类是计量统计模型,以...

    摘要

    随着数字营销4.0的日趋成熟,大数据营销成为营销科学的研究重点,而其中,销量的准确预测具有重要意义,它对于自身营销规划、市场分析、物流规划都有重要意义。但是销量的预测受影响复杂,传统的基于统计的计量模型,比如时间序列模型等由于对现实的假设情况过多,在实际场景中应用,本文利用R语言和Python梳理并实现了当前主流的电商销量预测方法:第一类是计量统计模型,以ARIMA为代表;第二类是机器学习模型,主流的是基于树的集成学习,第三类是深度学习模型,主要以循环神经网络LSTM/GRUs为主的深度学习框架。本文详细介绍并通过实际数据实现以上三类基本预测方法。

    关键词:数字营销4.0;销量预测;计量统计;机器学习;深度学习;

    引言

    电商在目前的市场份额中占据了越来越重要的程度,随着企业和个人持续产生大量的数据,同时迎来包括移动互联网、云计算、人工智能、物联网等新兴技术的创新和发展,目前营销正在从以人为核心的营销3.0向以数字时代为核心的营销4.0迈进[1],营销4.0的核心即是将消费行为的整个路径数据实时追踪和记录,洞察背后的需求,制定相应合理有效的营销战略方案,但是在整个组织中负责数据科学任务的分析师通常具有关于他们支持的特定产品或服务的深厚领域专业知识,但通常没有时间序列预测方面的培训。这不仅是企业或品牌所迫切面临和解决的问题,也是大数据营销学术研究的意义所在。

    电商销量预测,依赖于科学的预测理论方法和合理的预测模型,国内外学者在这方面做了大量的工作[2-4],进行了深入的理论探索,并提出了很多针对实际数据的方法,电商销量预测有两个大致的方向:一个是因果推断,从机理出发,基于电商消费行为对销量的刻画,重在对市场营销进行指导,多采用基于概率的方法,虽然精度较差,但是可解释性强;另一个是数据驱动法,也即从数据角度,利用机器学习、深度学习等,主要是与销量,从海量的历史数据和相关数据中发掘信息,随着数据采集、存储难度下降,大规模计算变得越来越容易,通过模型来解决上述问题变得越来越多样,本文将聚焦于当前研究和应用算法,利用R/python来实现。

    模型驱动方法可以分为以下四个基本类型:第一类是计量统计模型,以时间序列、灰色模型为代表,第二类是机器学习模型,如随机森林(RandomForest)、支持向量机(SVM);第三类是深度学习模型,利用多层神经网络构造非线性函数,对应复杂的假设空间,使神经网络函数具有强大的模型拟合能力。主要是以循环神经网络RNN和卷积神经网络CNN为结构的seq2seq预测方法,本文将评价并实现其中的主流模型。

    在第1节,会介绍三种基本类型,并比较各类方法的优缺点和适用场景。第2节将对其中的主流和最新的方法进行实现和对比,第3节是总结和展望

    1 电商销量预测的基本方法

    销量预测,顾名思义,是根据历史数据来预测接下来一段时间的销售数量,由于顾客购买是一个复杂决策,通常会考虑价格、评论数、星级等产品属性,或是个人点击、评论等消费属性等因素,这些数据均带有时间标识,构成了多元的时间序列。在不同的应用场景和数据质量情况下,用到的数据也不同,有时会直接对销量进行建模,更多情况是联合其它相关信息而展开。

    前人利用不同的方法,对销量预测展开研究,李俊等(2012)[2]将GM(1,1)模型、非线性三次指数平滑预测模型和二次回归预测模型相结合组成了组合预测模型,依据某企业前10个月的销量,预测后两个月的销量。Singh等(2014)[3]将人工神经网络和模糊时间序列相结合,确定历史时间序列的间隔期,将不同间隔期的时间序列分为不同组进行预测。Li等(2015)[4]建立了动态自适应的BP神经网络学习算法来预测四川省消费产品的总销售额,提高了预测的准确度。

    1.1 计量统计模型

    为了辅助解决其它问题,我们需要提前了解下一阶段的销量数据,由于复杂性和噪声的因素,预测具有相当的随机性。在计量统计模型中,常常以概率分布表示随机性,用置信区间描述随机变量的置信度,同时,也能反映一定的因果关系。概率区间预测是进行置信区间描述的重要方法。

    自回归滑动平均(ARMA)是一种常见的时间序列模型,能够很好地刻画平稳时间序列之间的线性动态过程。由于实际情况中电商销量是非平稳的时间序列,建模之前需要通过差分运算对数据进行平稳化处理,以消除趋势项和周期项。即建立自回归积分滑动平均(ARIMA)模型。文[]运用ARIMA模型对销量预测,ARIMA模型可以表示为如下形式[5]:

    由于概率预测需要考虑各个数据所近似的分布,很多情况下,不同产品在不同月份都无法保证服从同一参数分布,因此,实际使用中常使用非参数方法估计误差的分布函数。但是这些方法更多的是提取信息而非预测,所以在实际使用中,用的较少。

    1.2 机器学习模型

    机器学习模型从历史数据学习规律,并将规律应用到未知数据上,是一种常见的预测方法。常见的机器学习方法有Logistic Regression、SVM、Naive Bayesian、BP神经网络等方法,在此基础上,根据实际情况有修改,但是,在做机器学习模型过程中,需要注意对特征工程的建立,良好的特征工程决定了结果的优劣。

    针对时序的本身特点,我们介绍两种主流的应用方法,LightGBM以及Facebook提出的一种解决模型prophet。

        1. LightGBM

    LightGBM是由微软在2017年提出的,在GBDT树模型的基础上,采用梯度Boosting框架对模型进行了改进[6],在保证训练效果的基础上,优化了训练速度和空间效率,甚至在面临数据量很大、特征很多的情况下,LightGBM都能表现出优秀的训练效率和准确率。目前,LightGBM算法在处理分类和回归问题时表现优秀,曾被用于电商平台的销量预测,本文将同时构建基于LightGBM算法的销量预测模型,用于对比实验。

    LightGBM算法通过引入基于梯度的one-side采样和互斥的特征捆绑,使得该算法在面对需要处理大数据量和高维特种的场景时,与同类型的XGBoost和SGB等树模型算法相比,在计算上它主要采用了直方图算法,速度和内存消耗使占据明显优势。

        1. Prophet

    Prophet是由Facebook提出的一种“大规模”预测的实用方法。它打算通过提供简单和可调的方法来自动化业务时间序列的公共特性[7]。

    Prophet是一种基于可加性模型预测时间序列数据的算法,在该模型中非线性趋势符合年度、每周和每日的季节性,以及假日效应。它最适合于具有强烈季节效应的时间序列和历史数据的几个季节。Prophet对于丢失的数据和趋势的变化是稳健的,并且通常能够很好地处理异常值。

    1.3 深度学习框架

    深度学习是作为机器学习的一个分支,最近这几年的发展可以说是日新月异,深度(多层)架构用于映射输入或观测特征与输出之间的联系[8]。这种深度架构使得深度学习特别适合处理复杂的大批量数据,同时,它将特征当做学习的一部分,所以不需要进行复杂的特征工程。典型的两种是卷积神经网络(CNN)和循环神经网络(RNN),其中CNN主要是由稠密的神经元通过不同的卷积核降低参数量从而提取信息。而RNN是将前几个时刻的输入存储在网络中,并影响到后续神经元的计算,理论上讲可以持续下去。所以可以逐级表示越来越抽象的概念或模式。

    LSTM是一种特殊的RNN网络,在销量预测过程中,相关文献和实践也表名了具有更高的检测精度。LSTM神经网络是在RNN网络[9]的基础上,改进了传统RNN的神经元内部结构,主要解决了RNN面对长时间依赖而导致模型拟合较差的情况,可以使网络记忆更长时间的内容[10-11]

    图1 LSTM神经元结构图

    其核心公式如下,其中激活函数sigmoid函数,传导由前时刻传来的信息。完成神经元信息的更新。

    这六个公式,保证了LSTM的长程依赖以及防止梯度消失。GRU是LSTM网络的一种效果很好的变体[12],它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种网络。GRU既然是LSTM的变体,因此也是可以解决RNN网络中的长依赖问题。

    除此之外,还有其他的,例如图卷积网络GNN[13]、时序卷积网络TCN[14]等框架,由于缺乏足够的解释性和本身结构的复杂性,目前在销量预测场景中尚不普及,但是在物理网预测、股票市场预测中,逐渐发挥作用,取得SOTA效果。

    2 实现过程

    电商销量预测具有较强的非线性、非平稳性,针对我们提到的预测方法由于侧重点不同,各有优势,在实际应用中,可以针对不同的情况选择合适的方法,同时,也可以采用适当组合的形式获得更好的模型效果。这部分将利用一大一小两个实际数据集,来实现上述提到的模型。

    2.1 数据准备

    本次共准备了两个数据集,分别来自数据科学竞赛平台Kaggle以及通过爬虫爬取的天猫某产品数据。其中,kaggle的数据集超过5G的数据,主要是来自厄瓜多尔不同的费沃里塔商店中数千件商品的销售量[16],条数达1.2亿条。训练数据包括日常销售(包括促销情况)、商店和商品信息。经过处理截取了2016-01-01到2017-12-25的近两年的数据(下表)。其中store_nbr,item_nbr分别代表店铺、商品ID,unit_sales根据产品情况来定,如果是称重则为浮点数,个数则为整数。

    表1 销售原始记录表

    经过处理,销售数据形式如下,一共594天的记录,每天有174,685条。

    通过爬虫用自己的数据集做计量相关模型,采集了2021年1月-2月的1144款商品共计104,000条销量数据。其中,采集频率为6h一次,按天聚合后,并从中提取中某一产品进行测试(如下表)。

    2.2 实现及结果解读

    考虑在实际应用中到并没有能够所有情况的银弹模型,遵循“奥卡姆剃刀”原理,我们根据实际数据来选择合适的算法。不同模型性能在不同的数据集中具有不同的表现(图)。可以看到,随着数据量的增大,深度学习为主的模型表现会显著提升。所以,我们会选择小数据集的

     

    图2 数据量与模型性能关系图

    在对数据进行必要的空缺值填补等预处理后,得到了可用数据,并对数据集进行20%测试、80%进行训练的划分用于观察训练效果好坏。

    Arima模型

    利用R语言的forcast包,自动提取(p,d,q)分别为p=1,q=0,l=0。最终预测一周。结果见下图。可以看到,其置信区间还是很大,预测精读并不理想。

    图3 Arima模型预测趋势及置信区间

    Prophet模型

    利用R语言的prophet包,设定相关参数,由于prophet仅是对时间和取值进行建模,所以是单指标的预测,但是区别于Arima,它允许我们对异常突变点、周期进行调节,由于产品销售的周期性波动,例如季节性商品,会出现突变点,在长期预测过程中,有时候我们需要考虑异常,有时需要消除异常,可以通过changepoint.prior.scale 来调整稀疏先验的程度。

    图4 Prophet 销量预测趋势图及置信区间

    同时,prophet由于采用加法模型,可以看趋势分解,寻找周期性规律。

    图5 prophet周期-趋势分解

    由于销量预测的场景是在多元指标构建过程中,同时,伴随大数据的出现,数据量通常是大批量的,所以我们需要考虑用更为复杂的机器学习和深度学习来实现。

    LightGBM模型

    LightGBM,主要利用python中的相关packages。由于机器学习的重点是需要特征工程,在这里,我们主要从时间上去构造,主要包括时间窗口范围内的近期值、求和、求分位数以及是否有促销等。主要利用python的pandas完成。

    考虑到树的模型容易过拟合,通过参数max_depth的降低;min_data_in_leaf最小记录数减小过拟合。

    最终,计算的三期预测损失为:0.38, 0.35, 0.40。

    GRUs模型

    首先,采用z-score对数据进行标准化处理;

    然后,利用基于Keras的CudnnGRUs来加速训练,这是一个seq2seq模型,参考web流量预测解决方案的架构。编码器和解码器都是GRUs。编码器的隐藏状态通过FC层连接器传递给解码器。这对于显著提高精度是很有用的。最终的模型损失图如下在训练轮次仅为20轮的情况下,模型损失就低于了机器学习利器Lightgbm。利用该模型,就可以对销量进行有效的预测。

    3 结论和展望

    电商销量预测在产品规划、库存、品牌宣传等方面具有重要作用,在实际应用过程中,需要根据实际的业务场景、数据特点和计算资源灵活选择,基于统计和传统机器学习的算法方法相对简单,计算快,可解释性强,即使没有相应的工具也可以自己去实现,而涉及深度学习等模型,虽然在准确率性能上有优势,但是想真正掌握和应用门槛较高,同时需要对时序数据在频谱上有深刻的内理解。

    对于感兴趣的读者,也有一些其它的关注点可以深入,比如近期出现的以亚马逊提出的DeepAR为主的AutoML又逐渐成为了热点,对于在电商/金融二级市场上动辄数十个大类成百上千甚至更大体量的商品,不可能一一构建模型,就可以利用DeepAR思想来实现多维和时间内在关联特性等综合考虑的模型。

    参考文献

    [1]杨扬, 刘圣, 李宜威和贾建民. 《大数据营销:综述与展望》. 系统工程理论与实践 40, 期 08 (2020年): 2150–58.

    [2]李俊,何刚.基于组合预测的商品销售量预测方法[J].统计与决策,2012,(8).

    [3]Singh P, Borah B. An Effective Neural Network and Fuzzy Time Series-Based Hybridized Model to Handle Forecasting Problems of Two Factors[J]. Knowledge and Information Systems,2014,38(3).

    [4]Li X, Xiang S, Zhu P, et al. Establishing a Dynamic Self-Adaptation Learning Algorithm of the BP Neural Network and Its Applications[J].International Journal of Bifurcation & Chaos,2015,25(14).

    [5] 张浒.时间序列短期预测模型研究与应用[D].华中科技大学, 2013

    [6]KE G.,MENG Q.,Finley T.,WANG T.,CHEN W.,MA W.,YE Q.,LIU T.Y. Lightgbm:A Highly Efficient Gradient Boosting Decision Tree[J].In Advances in Neural Information Processing Systems,2014:3149-3157.

    [7] Taylor SJ, Letham B. 2017. Forecasting at scale. PeerJ Preprints 5:e3190v2

    [8] Canny, John. A Computational Approach to Edge Detection[J]. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 1986.

    [9]Andrej Karpathy. The Unreasonable Effectiveness of Recurrent Neural Networks[DB/OL].http://karpathy.github.io/2015/05/21/rnn-

    effectiveness/.

    [10] Greff KSrivastava RKKoutnik J, et al. LSTM: A Search Space Odyssey.[j].IEEE Transactions on Neural Networks&Learning Systems, 2016

    [11]N. Srivastava, E. Mansimov, and R. Salakhutdinov. Unsupervised learning of video representations using lstms. In ICML, 2015.

    [12]Cho K , Van Merrienboer B , Gulcehre C , et al. Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation[J]. Computer Science, 2014.

    [13]He Y , Zhao J . Temporal Convolutional Networks for Anomaly Detection in Time Series[J]. Journal of Physics: Conference Series, 2019, 1213:042050-.

    [14]Shaojie Bai, J. Zico Kolter, and Vladlen Koltun An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling. Technical Report, arXiv:1803.01271, 201

    [15] https://www.kaggle.com/c/favorita-grocery-sales-forecasting

    展开全文
  • 本篇文章将总结时间序列预测方法,并将所有方法分类介绍并提供相应的python代码示例,以下是本文将要介绍的方法列表: 1、使用平滑技术进行时间序列预测 指数平滑 Holt-Winters 法 2、单变量时间序列预测 自回归 ...
  • 需求预测方法有很多,按照形式上的不同,需求预测方法可以分为定性预测和定量预测,定性预测备件需求就是以人为观察的方法来确定备件未来需求量,而定量预测备件需求就是采用数学统计的方法科学分析备件需求量。...
  • 降雨预测方法

    千次阅读 2020-05-30 19:14:15
    降雨预测方法 DBNPF (Deep Belief Network for Precipitation Forecast) 来源:张雷师兄论文:A deep-learning based precipitation forecasting 模型: 比较:RBF、SVM、ARIMA、ELM(extreme learning machine...
  • 数学建模 预测方法集锦

    千次阅读 2021-11-05 17:59:24
    预测方法集锦1.移动平均法2.指数平滑法3.差分指数平滑法4.自适应滤波法5.趋势外推(预测)法6.回归分析7.灰色预测 1.移动平均法 根据时间序列资料逐渐推移,依次计算包含一定项数的时序平均数,以反映长期趋势。 当...
  • 本发明涉及深度学习方法和交通流预测等技术领域,具体涉及一种基于遗传算法优化LSTM神经网络的交通流预测方法。背景技术:短时交通流的预测是交通管理部门采取交通控制和诱导措施的重要依据。通过对短时交通流的预测...
  • RNA 二级结构预测方法

    万次阅读 多人点赞 2019-12-13 16:30:42
    1 比较序列分析方法 比较序列分析方法,其工作原理其实比较简单,它以 RNA 序列中互补碱基间的共变联配(英文名称为 covariant-alignment)活动为基础;以已知的 RNA 序列的数据为依据标准,以查找被测算 RNA 序列中...
  • 数学模型天气预测方法By: Teja Balasubramanian 创建人:Teja Balasubramanian A new wave arises. Computer programming and artificial intelligence are at the vanguard of science and technology. Whether it...
  • 时间序列预测方法总结

    千次阅读 2021-08-11 19:15:49
    前言 一、 时间序列基本规则法 --周期因子法 二、线性回归–利用时间序列特征做...三、 传统时序建模方法-- ARMA、ARIMA 四、 时间序列分解-- 加法模型或乘法模型 五、 特征工程入手– 六 、 转化为监督学习数据集 ...
  • 短时交通预测方法总结

    万次阅读 多人点赞 2020-05-16 17:49:55
    交通流量预测方法可分为三类:统计方法模型、传统机器学习模型和深度学习模型。 一、统计方法模型 1.1 HA模型(History Average Model) Stephanedes 于1981 年将HA模型应用于城市交通控制系统。 算法定义 .....
  • 移动目标轨迹预测方法——概述

    千次阅读 2021-12-27 16:51:50
    1. 基于数据驱动的方法 通过海量的历史数据来挖掘移动目标的行为特征,结合目标的当前位置,预判目标的运动趋势。 概率统计:卡尔曼滤波、差分自回归移动平均模型、隐马尔可夫模型、高斯混合模型、贝叶斯网络 ...
  • 灰色预测的概念 灰色系统、白色系统和黑色系统 (1)白色系统是指一个系统的内部特征是完全已知的,既系统信息是完全充分的。 (2)黑色系统是一个系统的内部信息对外界来说是一无所知的,只能通过它与外界的联系来...
  • based criterion)4.ACE(average coverage error)5.AIS(average interval score)6.MPICD(mean PI centre deviation)二、区间预测方法综述1.Mean Variance Estimation(MVE)2.
  • 针对Math老师提到的《MATLAB时间序列神经网络训练好以后怎么预测》 ...首先引用一下math老师对于时间序列神经网络预测方法,分为两种:循环预测和一次性预测。其实这两种方法本质上是一样的。 循环预测的原理即是利
  • 时间序列预测方法之 Transformer

    万次阅读 多人点赞 2020-03-18 19:45:52
    最近打算分享一些基于机器学习的时间序列预测方法。这是第三篇。 前面介绍的 DeepAR 和 DeepState 都是基于 RNN 的模型。RNN 是序列建模的经典方法,它通过递归来获得序列的全局信息,代价是无法并行。CNN 也可以...
  • 9月26日上午,大会邀请到北京交通大学计算机与信息技术学院万怀宇副教授做了名为《时空交通数据预测方法及应用》的主题演讲。 对于时空交通数据的应用AI Time在KDD 2020顶会论文分享中分享了《基于时空孪生神经网络...
  • 数学建模预测方法之 微分方程模型

    千次阅读 2020-08-05 11:54:10
    微分方程模型 适用于基于相关原理的因果预测模型,大多是物理或几何方面的...传染病的预测模型、经济增长(或人口)的预测模型、Lanchester战争预测模型、药物在体内的分布与排除预测模型、烟雾的扩散与消失模型 ...
  • 中文“预测”的含义在“英语”情境下则有两种含义:evaluate,“估算”,前文归因的方法中,是从因变量Y发现自变量X,也就是Y-->X,“估算”则是“归因”的逆操...
  • 蛋白质结构与功能的预测方法总结和资料汇总

    万次阅读 多人点赞 2018-09-29 22:37:29
    蛋白质结构与功能的预测方法总结和资料汇总 “折叠(fold)”的概念 “折叠(fold)”是近年来蛋白质研究中应用较广的一个概念,它是介与二级和三级结构之间的蛋白质结构层次,它描述的是二级结构元素的混合组合方式...
  • 信道预测方法初识

    千次阅读 2019-03-15 15:44:32
    信道预测方法学习总结 在通信系统中,获取完美的CSI,对于通信系统有着至关重要的作用。如果所发送的CSI由于信道的波动而变得可能过时,则信道预测变得重要,即,需要将CSI的预测发送到发射机以改善MIMO系统的性能...
  • 常用的三种机器学习预测方法

    万次阅读 2020-07-13 04:30:13
    线性回归、BP网络、SVM(R)预测的matlab代码
  • 【数据分析】基于时间序列的预测方法

    千次阅读 多人点赞 2021-01-13 14:59:40
    时间序列预测 1.时间序列介绍 时间序列(Time Series,TS)是数据科学中比较有意思的一个领域。顾名思义,TS是按固定时间间隔收集的数据点的集合。对这些数据进行分析以确定长期趋势,以便预测未来或执行其他形式的...
  • 数学建模常用模型23:马尔可夫预测方法

    万次阅读 多人点赞 2018-08-21 14:53:06
    马尔可夫预测的性质及运用 对事件的全面预测,不仅要能够指出事件发生的各种可能结果,而且还必须给出每一种结果出现的概率,说明被预测的事件在预测期内出现...马尔可夫预测法是地理预测研究中重要的预测方法之一...
  • 经济预测方法MATLAB实现课程论文

    千次阅读 2021-01-15 16:50:59
    时间序列分析是从一段时间上的一组属性之数据中发现模式并预测未来之的过程。ARMA模型是目前最常用的用于拟合平稳序列的模型。利用ARMA模型描述的时间序列预报在金融股票等领域具有重要的理论意义。本文将利用ARMA...
  • 预测方法,该方法将历史负荷数据作为输入,搭建由一维卷 积层和池化层等组成的 CNN 架构,提取反映负荷复杂动态变 化的高维特征;将所提特征向量构造为时间序列形式作为 GRU 网络的输入,建模学习特征内部动态...
  • 8.轨迹预测,乱七八糟的预测方法

    万次阅读 2017-11-29 09:46:19
    先总结下学术上有多少预测方法及使用相应方法的一些文献一、传统数学统计学方法1.马尔可夫模型预测2.朴素贝叶斯预测3.高斯过程预测4.灰色模型二、机器学习方法、启发式算法5.机器学习预测:SVM,BP,神经网络6.仿生...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 593,035
精华内容 237,214
关键字:

预测方法

友情链接: bi_vec.zip