本文为销量预测第6篇:简单预测模型
第1篇:PySpark与DataFrame简介
第2篇:PySpark时间序列数据统计描述,分布特性与内部特性
第3篇:缺失值填充与异常值处理
第4篇:时间序列特征工程
第5篇:特征选择
第7篇:线性回归与广义线性模型
第8篇:机器学习调参方法
第9篇:销量预测建模中常用的损失函数与模型评估指标
实际业务中经常使用的规则模型,也是最见到的时序预测法,所以称之为朴素或者天真预测。最早由统计学家塞尔(S.R. Searle)提出,即,下一期的预测等于本期的需求数量。
y ^ T + h ∣ T = y T \hat{y}_{T+h \mid T}=y_{T} y^T+h∣T=yT
如,周三发生的实际需求(销量)为25个,若h为1,意味着未来一天的预测值,周四为25。
这是一种最单纯、操作最简单、成本最低廉的预测方法。从实际企业补货的逻辑来讲就是卖多少个补多少个,针对某些序列较短,不满足建模需求时,往往强大有效。
天真预测没有考虑到序列的季节周期性,所以针对满足一个销售周期的数据,序列依然非常短的情况,可使用上一个同周期的已知观测值,直接作为下一期的预测值,比如使用上周四的销售量作为本周四的预测值,这就是季节性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+h∣T=yT+h−mm:周期长度
该规则同样适用于月份、季度和其他周期长度的数据。
参考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
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:]
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=a⋅yt+(1−a)St−1St:时间t的平滑值yt:时间t的实际值St−1:t−1的预测值a:平滑常数,范围为[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