精华内容
下载资源
问答
  • 销量预测

    2019-09-24 08:19:26
    公司分派了一个活,预测景区未来的一段时间销量,目的... 一听说做预测,很兴奋,当时真的没有太考虑目的!老大也很高兴,说让我做一个景区未来每天的销量数据,供其他项目无限使用! 第一步、站在巨人的肩膀上 ...

    公司分派了一个活,预测景区未来的一段时间销量,目的...

    一听说做预测,很兴奋,当时真的没有太考虑目的!老大也很高兴,说让我做一个景区未来每天的销量数据,供其他项目无限使用!

    第一步、站在巨人的肩膀上

    对自己说:“第一次做预测,先向外看看成熟的经验,不要瞎琢磨”

    推荐下面的技术参考:

    美团的技术博客:http://tech.meituan.com/mt-mlinaction-how-to-ml.html

    机器学习:http://my.oschina.net/airship/blog/387006?fromerr=3CBkR8Jd

    第二步、准备开工

    各种准备之后,觉得景区预测需要使用:线性回归和时间序列。

    最近7天、最近30天、去年同期销售额、各种预测数据与真实数据的差距(方差),最终产出了第一版结果,准确率30%

    第三步、纠正错误

    经历打击之后,发现自己有些偏离轨道,回到初始需求,按照产品给的模型一步一步开发。下面是模型图:

    看不清也没有关系,预测的结果很不理想,因为很复杂&计算成本高,唯一佩服自己的是竟然开发出来了,准确率:50%

    第四步、返璞归真

    经历了上面的轮番打击,自己日夜加班三周竟然没有出结果,很沮丧,准确率如果不到50%预测就没有意义了!不如不预测,为什么预测的还不如不预测的感知的准确?

    于是盯着屏幕,看趋势,发现每周的数据很相近,总结规律:周+节假日,时间平移即可。于是总结中国的节假日,近期平移上周的数据,远期平移去年的数据,结果平均准确率:80% 泪奔了!

    总结:没必要上来就时间序列、线性回归、搞机器学习啥的,不如看看趋势图,虽然看起来很low,可简单&实用!

    唯一值得分享的是节假日的数据表,很费时间,不过特定场合很实用:

    转载于:https://www.cnblogs.com/liqiu/p/5178519.html

    展开全文
  • 商品销量预测

    2021-09-02 16:30:20
    商品销量预测
  • 主要为大家详细介绍了Tensorflow酸奶销量预测分析,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 电子商务是伴随互联网技术快速兴起的一种规模大、潜力大的新型商业模式, 对产品进行短期销量预测能够帮助电商企业对市场变化采取更加迅速的反应和措施. 本文通过电商销量历史数据和门户商品链接点击量建立了一种应用...
  • ctrip 携程出行产品销量预测比赛(第十名) 技术解决方案及代码
  • 学年论文组合预测在汽车销量预测中的应用.doc
  • 交运设备行业:重卡销量点评-5月销量大幅增长,上调全年销量预测.pdf
  • SAP销量预测和利润预算.ppt
  • 销量预测简单模型

    2021-04-20 20:54:40
    销量预测常用简单模型总结,基于python和Spark.SQL

    本文为销量预测第6篇:简单预测模型
    1篇:PySpark与DataFrame简介
    2篇:PySpark时间序列数据统计描述,分布特性与内部特性
    3篇:缺失值填充与异常值处理
    4篇:时间序列特征工程
    5篇:特征选择
    7篇:线性回归与广义线性模型
    8篇:机器学习调参方法
    9篇:销量预测建模中常用的损失函数与模型评估指标

     

    1.天真预测(naive)

     
    实际业务中经常使用的规则模型,也是最见到的时序预测法,所以称之为朴素或者天真预测。最早由统计学家塞尔(S.R. Searle)提出,即,下一期的预测等于本期的需求数量。
    y ^ T + h ∣ T = y T \hat{y}_{T+h \mid T}=y_{T} y^T+hT=yT
    如,周三发生的实际需求(销量)为25个,若h为1,意味着未来一天的预测值,周四为25。
    这是一种最单纯、操作最简单、成本最低廉的预测方法。从实际企业补货的逻辑来讲就是卖多少个补多少个,针对某些序列较短,不满足建模需求时,往往强大有效。
     

    2.季节性天真预测(Seasonal naïve)

     
    天真预测没有考虑到序列的季节周期性,所以针对满足一个销售周期的数据,序列依然非常短的情况,可使用上一个同周期的已知观测值,直接作为下一期的预测值,比如使用上周四的销售量作为本周四的预测值,这就是季节性Naive(Seasonal naïve method),适用于存在季节性变化的序列数据。
    y ^ T + h ∣ T = y T + h − m m : 周 期 长 度 \hat{y}_{T+h \mid T}=y_{T+h-m} \\m:周期长度 y^T+hT=yT+hmm:

    该规则同样适用于月份、季度和其他周期长度的数据。

    参考Spark.SQL代码如下:

    select
    shop_number,
    sku_number,
    sale_qty,
    dt,
    lag(sale_qty,7,0) over(partition by shop_number,sku_number order by dt) as naive_predict
    from app.forecast_dataset
    

     

    3.简单移动平均(Simple Moving average SMA)

     
    S M A = p 1 + p 2 + ⋯ + p n n S M A=\frac{p_{1}+p_{2}+\cdots+p_{n}}{n} SMA=np1+p2++pn
    通过对序列的最后k个观测值计算平均作为预测值。

    借助numpy的代码示例为:
     

    import numpy as np
    def moving_average(data, window_size,n_step):
        cumsum_vec = np.cumsum(np.insert(data, 0, 0))
        ma_vec = (cumsum_vec[window_size:] - cumsum_vec[:-window_size]) / window_size
        return ma_vec[-n_step:]
    

     

    4.指数平滑法(Exponential Smoothing,ES)

     
    S t = a ⋅ y t + ( 1 − a ) S t − 1 S t : 时 间 t 的 平 滑 值 y t : 时 间 t 的 实 际 值 S t − 1 : t − 1 的 预 测 值 a : 平 滑 常 数 , 范 围 为 [ 0 , 1 ] S_{t}=a \cdot y_{t}+(1-a) S_{t-1}\\ St:时间t的平滑值\\ yt:时间t的实际值\\ St−1:t-1的预测值\\ a:平滑常数,范围为[0,1] St=ayt+(1a)St1St:tyt:tSt1:t1a:,[0,1]
     
    指数平滑是时序预测中常用的算法之一,适用于中短期预测,相比较简单移动平均不考虑较远的数据,指数平滑则是给与近期数据更大的权重,随着时间向前推移,历史观察值的权重呈指数型下降,因此称之为指数平滑。 α接近于0,那么更远的过去观测值会被赋予更多的权重。如果α接近1,则最近的观测值赋予更多的权重。当然,指数平滑分为一次,二次,三次,以上公式只是一次指数平滑,更多的材料请参照其他的读物。
     

    #Simple Exponential Smoothing
    def es_model(series,alpha=0.3):
        """
        smooth series data
        ----------
        :param X:input series of pd.DataFrame one columns data
        :param alpha: smooth
        :return Simple Exponential Smoothing
        """
        X=series.values
        s = [X[0]]
        for i in range(1, len(X)):
            temp =alpha * X[i] + (1 - alpha) * s[-1]
            s.append(temp)
        return s
    

    为方便理解,简单指数平滑方法可参考以上代码,更复杂的方式可参考或者调用python统计学statsmodels包。

    from statsmodels.tsa.holtwinters import ExponentialSmoothing, SimpleExpSmoothing, Holt
    

     

    展开全文
  • 为了提高供应链中销量预测的准确性,提出一种改进森林优化算法(Improved forest optimization algorithm,IFOA)来优化销量预测.首先,引入量子系统中的delta势阱模型,使得算法能在充分利用局部最优的同时避免陷入局部...
  • 我国新能源汽车市场销量预测.pdf
  • 基于商品聚类的电商销量预测.pdf
  • 基于数据挖掘的超市商品销量预测.pdf
  • 基于Matlab的达能饼干销量预测分析.pdf
  • 基于机器学习对销量预测的研究
  • 利用SARIMAX进行销量预测

    千次阅读 多人点赞 2019-09-14 10:22:04
    本文从传统的时间序列SARIMAX算法讲解销量预测模型。 主要涉及到python的pandas、statsmodels、joblib等模块,通过对多个模型进行并行网格搜索寻找评价指标MAPE最小的模型参数,虽然供应链销量预测可供使用的模型...

    本文从传统的时间序列SARIMAX算法讲解销量预测模型。
    主要涉及到python的pandas、statsmodels、joblib等模块,通过对多个模型进行并行网格搜索寻找评价指标MAPE最小的模型参数,虽然供应链销量预测可供使用的模型非常多,但是作为计量经济学主要内容之一,时间序列因为其强大成熟完备的理论基础,应作为我们处理带有时序效应数据时首要尝试的模型类型,且往往效果不错。本文只是从代码的角度讲解其中statsmodels中SARIMAX的用法。剖析代码细节,以便于照例上手实际操作。

    1. 参数解释

    SARIMAX是在差分移动自回归模型(ARIMA)的基础上加上季节(S,Seasonal)和外部因素(X,eXogenous)。也就是说以ARIMA基础加上周期性和季节性,适用于时间序列中带有明显周期性和季节性特征的数据。由于参数众多,所以下面简单整理出其含义,以免误用或遗漏。

    参数含义是否必须
    endog观察(自)变量 y
    exog外部变量
    order自回归,差分,滑动平均项 (p,d,q)
    seasonal_order季节因素的自回归,差分,移动平均,周期 (P,D,Q,s)
    trend趋势,c表示常数,t:线性,ct:常数+线性
    measurement_error自变量的测量误差
    time_varying_regression外部变量是否存在不同的系数
    mle_regression是否选择最大似然极大参数估计方法
    simple_differencing简单差分,是否使用部分条件极大似然
    enforce_stationarity是否在模型种使用强制平稳
    enforce_invertibility是否使用移动平均转换
    hamilton_representation是否使用汉密尔顿表示
    concentrate_scale是否允许标准误偏大
    trend_offset是否存在趋势
    use_exact_diffuse是否使用非平稳的初始化
    **kwargs接受不定数量的参数,如空间状态矩阵和卡尔曼滤波

    以上我们列出了该函数中所有可能用到的参数,很多参数不是必须,比如甚至只是需要给定endog(观察变量),程序就可以运行起来,也正是这样,SARIMAX具有极大的灵活性。

    1. 如果不指定seasonal_order或者季节性参数都设定为0,那么就是普通的ARIMA模型,exog外部因子没有也可以不用指定;
    2. 其他的参数如无必要,则不需要修改,因为函数默认的参数在大多数时候是最优的;
    3. 上表多次提到初始化,我们知道模型拟合所用迭代算法,是需要提供一个初始值的,在初始值的基础上不断迭代,一般情况下是随机指定一个值,或者给出一套包含某种分布的值,如正态分布。在大多数梯度下降算法陷入局部最优的时候,可以尝试更改初始值,和上条一样如无特殊需求,勿动;
    4. 关于拟合算法,我们一般都是假定给定的数据满足正态分布,所有使用极大似然算法求解最优参数;
    5. 关于是否强制平稳和移动平均转换,一般设置为False,保持灵活性。

    总的来说,SARIMA 模型通过(p,d,q) (P,D,Q,m)不同的组合,囊括了ARIMA, ARMA, AR, MA模型,使用指定的模型评估准则,选择最优模型,目前用python的statsmodels进行时间序列分析时,用SARIMAX就好。

    1. 模型选择标准

    模型选择标准,提供以下三种方案:
    2.1使用AIC信息准则

    通过Akaike information criteria (AIC)进行模型选择,用极大似然函数拟合模型,虽然我们的目标最大化似然函数,但同时需要考虑模型复杂度,所以常常使用AIC和BIC作为模型优劣的衡量标准,该标准只能说在这么多备选模型中,最小AIC的模型刻画的真实数据表达的信息损失最小,是相对指标。

    AIC=-2 ln(L) + 2 k

    BIC=-2 ln(L) + ln(n)*k

    AIC在样本容量很大时,拟合所得数值会因为样本容量而放大(通常超过1000的样本称之为大样本容量)。AIC和BIC作为模型选择的准则,可以有效弥补根据自相关图和偏自相关图定阶的主观性。

    2.2使用 Box-Jenkins检验准则

    Box-Jenkins 建模流程如下,建立在反复验证是否满足假设前提,并对参数调整。
    在这里插入图片描述
    2.3.使用准确率作为模型评估准则

    比如,MAPE(平均绝对误差百分比),从总体上评估模型预测准确率:
    在这里插入图片描述
    MAPE也是反映误差大小的相对值,不同模型对同一数据的模型进行评估才有比较的意义。

    以上列举了三种建模评估标准,最好综合考虑,AIC从信息论的角度度量信息损失大小, Box-Jenkins是传统的层层假设之下的时间序列统计建模准则,在应对单一序列模型,通过眼观图形和检验参数的显著性来判定,效果佳。而如果我们关注的是模型准确率,那么最好的当然是MAPE等关注预测准确性的指标,此时不能无脑的用函数原始的定义或者AIC,这点尤其值得关注,包括XGBoost模型中,目标损失函数不建议直接使用RMSE。

    1. 代码实现

    3.1导入模块

    
    import time
    from itertools  import product
    import numpy as np
    import pandas as pd
    from joblib import Parallel,delayed
    import warnings
    warnings.filterwarnings('ignore')
    from warnings import catch_warnings,filterwarnings
    from statsmodels.tsa.statespace.sarimax import SARIMAX
    

    3.2 定义模型

    该部分的关键参数已经在上文全部罗列,因为重要所以从原文档中全部总结翻译过来。

    #传入数据和参数,输出模型预测
    def model_forecast(history,config):
        order, sorder, trend = config
        model = SARIMAX(history, order=order,      seasonal_order=sorder,trend=trend,enforce_stationarity=False, enforce_invertibility=False)
        model_fit = model.fit(disp=False)
        yhat = model_fit.predict(len(history), len(history))
        return yhat[0]
    

    3.3模型评估函数和数据划分

    #模型评估指标,mape
    def mape(y_true, y_pred):
        y_true, y_pred = np.array(y_true), np.array(y_pred)
        return np.mean(np.abs((y_true - y_pred) / y_true)) * 100    
    
    #划分训练集和测试集
    def train_test_split(data, n_test):
        return data[:-n_test], data[-n_test:]
    

    3.4 定义滚动预测

    使用one-step滚动向前预测法,每次预测值再加入数据中,接着预测下一个值,而不是一次预测多个值。依据经验,我们可以知道多数情况下,其实滚动逐步预测比多步预测效果更佳,所以应该尝试滚动预测。

    #one-step滚动向前预测
    def forward_valid(data, n_test, cfg):
        predictions = list()
        train, test = train_test_split(data, n_test)
        history = [x for x in train]
        for i in range(len(test)):
            yhat = model_forecast(history, cfg)
            predictions.append(yhat)
            history.append(test[i])
        error = mape(test, predictions)
        return error
    

    当模型的移动平均或者自回归阶数较高,模型计算极大似然的时候可能会抛出很多警告,比如常见的自由度为0,模型非正定,还如AIC有时会得到NaN值,所以这里需要设置忽视警告,我们需要用到python中的try-except异常处理控制流,把可能报错的语句放置在try中,以免程序报错中断。如果需要查看警告或者调试,则debug这里可以设置为True,但是大概率程序会报错退出。对数据进行标准化等处理,其实在一定程度上是可以避免一些计算方面的问题,同时也会提高计算求解效率。

    3.5 模型评估

    #模型评估
    def score_model(data,n_test,cfg,debug=False):
        result = None
        key = str(cfg)
        if debug:
            result = forward_valid(data, n_test, cfg)
        else:
            try:
                with catch_warnings():
                    filterwarnings("ignore")
                    result = forward_valid(data, n_test, cfg)
            except:
                error = None
                
        return (key, result)
    

    3.6 网格搜索

    网格搜索非常耗时,时间复杂度非常高,为指数型。在条件允许的情况下,尤其是PC和服务器计算力大大的得到提高的当下,通常的做法都是用空间换时间,压榨计算资源,使用多线程并行,以便可以在短时间内得到计算结果。

    所以,我们使用Joblib模块中的Parallel和delayed函数并行多个模型,Joblib模块也是常常在机器学习任务grid search和Cross validation中为了提高计算速度需要必备的模块。

    #网格搜索
    def grid_search(data, cfg_list, n_test, parallel=True):
        scores = None
        if parallel:
            #使用计算机全部的cpu核数多进程并行
            executor = Parallel(n_jobs=-1, backend='multiprocessing')
            tasks = (delayed(score_model)(data, n_test, cfg) for cfg in cfg_list)
            scores = executor(tasks)
            
        else:
            scores = [score_model(data, n_test, cfg) for cfg in cfg_list]
        scores = [r for r in scores if r[1] != None]
        scores.sort(key=lambda x: x[1])
        return scores
    
    #生成参数列表
    def sarima_configs(seasonal=[0]):   
        p = d = q = [0,1,2]
        pdq = list(product(p, d, q))
        s = 0
        seasonal_pdq = [(x[0], x[1], x[2], s) for x in list(product(p, d, q))]
        t=['n','c','t','ct']
        return list(product(pdq,seasonal_pdq,t))
    

    还要唠叨的是,本文引进的itertools模块中的product是对迭代对象创建笛卡尔积的函数,穷尽迭代对象的所有组合,返回迭代对象组合的元组。解释一下 ,上面sarima_configs函数中的,p、 d、 q都是0、1、2,因为更高阶的并不多见,且高阶会导致模型非常复杂,往往0,1,2也就够了,关于季节性设置了一个默认的0,是因为本文使用的是周这样的汇总时间点,通过前期数据探索作图看出设置为4,或者12都没有意义,所以为了节省计算资源,指定为0。以上函数自己可以写嵌套循环,但是python内置的模块和成熟的模块在计算性能和规范上会比自己手写的优很多,这也是不要重复造轮子的理念,除非自己造的轮子更好,能解决一个新需求。既然讲到计算性能,本文涉及到了很多循环迭代,那么如果可以的话,建议使用Profile 这个内置的模块分析每个函数花费的时间。

    以下为模型训练函数,n_test=3表示预测3个值,因为我个人使用的场景比较固定,所以就直接写在函数内部作为局部变量了,为了保持函数的灵活性,作为全局参数或者函数的形参当然是更好,另,下面这种列表元素append追加似乎不太优雅。(过早优化是万恶之源,emmm,就这样子了,逃)

    
    #模型训练
    def train_model(sale_df):
        
        n_test = 3
        p_b,d_b,q_b=[],[],[]
        P_b,D_b,Q_b=[],[],[]
        m_b,t_b=[],[]
        model_id,error=[],[]
        for i in sale_df['store_code'].unique():
            data=sale_df[sale_df['store_code']==i]['y']
            data=[i for i in data]
            cfg_list = sarima_configs()
            scores = grid_search(data,cfg_list,n_test,parallel=True)
            p_b.append(int(scores[0][0][2]))
            d_b.append(int(scores[0][0][5]))
            q_b.append(int(scores[0][0][8]))
            P_b.append(int(scores[0][0][13]))
            D_b.append(int(scores[0][0][16]))
            Q_b.append(int(scores[0][0][19]))
            m_b.append(int(scores[0][0][22]))
            t_b.append(str(scores[0][0][27]))
            model_id.append(i)
            error.append(scores[1][-1])
            params_df=pd.DataFrame({'store_code': model_id, 'map': error,'p':p_b,'d':d_b,'q':q_b,'P':P_b,'D':D_b,'Q':Q_b,'m':m_b,'t':t_b})
        return params_df
    

    3.7 获得最优参数,滚动预测未来值

    通过模型训练得到的最优参数,滚动预测四个时间点。

    #定义预测函数,传入数据和参数,返回预测值
    def one_step_forecast(data,order,seasonal_order,t,h_fore):
        predictions=list()
        data=[i for i in data]
        for i in range(h_fore):
            model = SARIMAX(data, order=order, seasonal_order=seasonal_order,trend=t,enforce_stationarity=False, enforce_invertibility=False)
            model_fit = model.fit(disp=False)
            yhat = model_fit.predict(len(data), len(data))
            data.append(yhat[0])
            predictions.append(yhat[0])
        return predictions
    
    
    #用for循环,多个序列预测
    def forecast_model(sale_df,params_df):
        h_fore=4
        fore_list=[]
        model_id=[]
        for i in sale_df['store_code'].unique():
            #params_list=params_df[params_df['store_code']==i]
            data=sale_df[sale_df['store_code']==i]['y']
            p=params_df[params_df['store_code']==i].iloc[:,2].values[0]
            d=params_df[params_df['store_code']==i].iloc[:,3].values[0]
            q=params_df[params_df['store_code']==i].iloc[:,4].values[0]
            P=params_df[params_df['store_code']==i].iloc[:,5].values[0]
            D=params_df[params_df['store_code']==i].iloc[:,6].values[0]
            Q=params_df[params_df['store_code']==i].iloc[:,7].values[0]
            m=params_df[params_df['store_code']==i].iloc[:,8].values[0]
            t=params_df[params_df['store_code']==i].iloc[:,9].values[0]
            order=(p, d, q)
            seasonal_order=(P,D,Q,m)
            all_fore=one_step_forecast(data,order,seasonal_order,t,h_fore)
            fore_list.append(all_fore)
            
            #以下为,多步预测,如果不使用滚动预测,则不调one_step_forecast函数
            #model=SARIMAX(data, order=order,seasonal_order=seasonal_order,trend=t,enforce_stationarity=False,
            #                                                enforce_invertibility=False)
            #forecast_=model.fit(disp=-1).forecast(steps=h_fore)
            #fore_list_flatten = [x for x in forecast_]
            #fore_list.append(fore_list_flatten)
            model_id.append(i)
        df_forecast = pd.DataFrame({'store_code': model_id, 'fore': fore_list})
        return df_forecast
    

    main函数

    
    if __name__ == '__main__':
        start_time=time.time()
        sale_df=pd.read_excel('/home/test01/store_forecast/sale_df.xlsx')
        params_df=train_model(sale_df)
        forecast_out=forecast_model(sale_df,params_df)
        end_time=time.time()
        use_time=(end_time-start_time)//60
        print('finish the process use',use_time,'mins')
    

    3.8 模型结果

    以下为本次模型所得结果,每个门店一个序列模型。

    store_codemapepdqPDQmt
    1F6.3053781022010c
    621.8891920220020t
    CS1.4255151220000c
    2H2.1446740121020c
    325.2897450220000t

    五个模型总体MAPE为3.4%,效果还不错,本文还没有用到SARIMAX中的X,也就是eXogenous外部因素,模型得到的MAPE已经降到3.4%,也即准确率到了96.6%,限于时间的关系,暂时没有加入如天气/客流等外部因素。

    4.总结

    本文考虑多种参数组合的时间序列模型,通过并行网格搜索,回测得到MAPE最小的模型参数,并把最优参数作为模型预测未来值的参数滚动预测未来4个时间点。以上就是结合自己经验和体会以及查阅的资料针对几个关键点进行阐述而写就。如有误,欢迎指正留言。完整的程序和数据放在Github

    展开全文
  • 新能源电动车销量预测模型的应用.pdf
  • 基于ARIMA模型的新能源汽车销量预测.pdf
  • 一种基于分步策略的销量预测方法与装置一种基于分步策略的销量预测方法与装置
  • 电商销量预测方法综述

    千次阅读 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

    展开全文
  • xgboost进行销量预测

    千次阅读 2019-04-01 14:47:14
    使用xgboost进行销量预测的方法如下: import psycopg2 import numpy as np from pandas import Series,DataFrame import pandas as pd from datetime import datetime import os as os import gc as gc import ...
  • 基于BP-AdaBoost的电商短期销量预测模型.pdf
  • 2020年中国智能小家电细分市场销量预测.xls
  • kaggle 实战 lecture07 推荐与销量预测相关问题.zip
  • 商品销量预测是什么?

    千次阅读 2019-01-14 11:28:18
    商品销量预测 在充分考虑未来各种影响因素的基础上,根据历史销量以及市场上对产品需求的变化情况情况,对未来一定时期内产品的销量变化所进行的科学预计和推测。 产品销量预测有三个特点 连贯性 第一,预测具有一定...
  • 销量预测是个非常经典的时序预测问题,通过一段时间内销售数据,预测未来商品的销量,对商品进行合理的分配和调度,解决供货上的不足或者堆积等问题。 二、赛事任务 给定商店销量历史相关数据和时间等信息,预测...
  • 线性回归:天猫双十一销量预测

    千次阅读 2020-07-09 19:04:42
    自己构建数学方程获取截距和斜率构建数学方程数据整理绘制从2012年到2020年的年复合增长率预测2020年销量方法二:使用算法预测销量预测数据衍生与2020年销量预测 导包 import numpy as np import matplotlib.pyplot ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,460
精华内容 6,584
关键字:

销量预测