时序预测算法初探:基于机器学习的时序预测算法(2)
上期回顾
上期简要介绍了一种基于STL分解的带季节性的时序数据的预测算法。STL分解将时序信号分为了季节性、趋势性和残差的加和,同时在预测趋势性分量的时候,可以使用ARIMA算法。ARIMA算法作为一种简单有效的时序预测的算法,通过建立自回归差分移动平均模型,可以对时间序列进行预测。由于STL分解无法处理节假日等特殊事件,以及ARIMA算法需要通过手动将不稳定时间序列通过差分法转化为稳定序列,在实际使用时存在较多的限制。由此,我们引入了另外一种算法,Prophet算法。
Prophet算法除了将时间序列分解为季节性、趋势性和残差以外,还加入了一个节日分量,允许将节日作为一个参数传入模型。这期我们将着重介绍Prophet算法。原paper链接可参考上一期博客
Prophet的趋势模型
Prophet的趋势模型是该算法的另一个亮点。作者首先认为,除了线性增长外,现实中的大多数增长趋势都遵从Sigmoid曲线。
所以,在对趋势建模的时候,可以对sigmoid曲线进行拟合:
其中
其中C为增长上限,k为增长率,m为offset。
在实际场景中,增长上限往往会受时间影响,所以上限往往又是一个关于时间的函数C(t)。
在算法中,除了可以手动选取变点,也支持自动对变点进行选择。自动选择变点的原理也很简单,算法使用前80%的数据等间距取T=25个点,每个变点的先验概率密度函数都服从拉普拉斯分布:,其中τ作为参数支持用户手动设定。在训练时,更新这个参数τ直接采用了最大似然估计,如果其中某个点不是变点(前后的斜率变化不超过一个阈值),则τ=0,此时拉普拉斯分布的概率密度函数恒为0,自然也就不存在变点。
在预测模型时,变点的预测算法直接使用了训练得到的拉普拉斯概率密度函数作为后验概率进行预测。在paper中,作者指出了τ这个参数还有另外一个功能:当τ越大,模型越趋向于overfit。(笔者对此的理解是,τ越大,说明模型的方差越大。方差越大过拟合的趋势自然就越明显)
在使用python调用prophet算法的时候,对于上述趋势模型,我们可以调整拟合模式(线性/sigmoid),以及先验分布参数τ,以及变点设置。具体可以参考博客FACEBOOK 时间序列预测算法 PROPHET 的研究
Prophet的季节模型
Prophet的季节模型较为简单,使用了傅里叶级数模拟时间序列的周期性,一般在调整级数的时候,N=10和N=3可以分别较好的拟合年度和每周的季节性分量。当然在选取N的时候,也可使用赤池信息准则AIC或AICc判定。
Prophet的节假日模型
Prophet算法支持根据需要设置节假日。假设一共有L个节假日:
Prophet的实际使用
Prophet的参数可以通过forecaster.py的__init__函数看到:
在对现网进行容量评估时,经常会涉及到对未来用户数的预测,我们可以将Prophet算法用于预测未来用户数。这是实际的预测效果:
我们也可以观察提取到的趋势和周期性分量:
作者:老王
- 点赞
- 收藏
- 关注作者
评论(0)