销量预测简单模型

销量预测简单模型

  • 1.天真预测(naive)
  • 2.季节性天真预测(Seasonal naïve)
  • 3.简单移动平均(Simple Moving average SMA)
  • 4.指数平滑法(Exponential Smoothing,ES)

本文为销量预测第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

 

你可能感兴趣的:(机器学习,PySpark销量预测实战,大数据,机器学习,数据挖掘,spark)