时序预测算法初探:基于机器学习的时序预测算法(2)

举报
技术火炬手 发表于 2020/11/05 14:19:26 2020/11/05
【摘要】 上期简要介绍了一种基于STL分解的带季节性的时序数据的预测算法。STL分解将时序信号分为了季节性、趋势性和残差的加和,同时在预测趋势性分量的时候,可以使用ARIMA算法。ARIMA算法作为一种简单有效的时序预测的算法,通过建立自回归差分移动平均模型,可以对时间序列进行预测。由于STL分解无法处理节假日等特殊事件,以及ARIMA算法需要通过手动将不稳定时间序列通过差分法转化为稳定序列,在实际使用时存

上期回顾

上期简要介绍了一种基于STL分解的带季节性的时序数据的预测算法。STL分解将时序信号分为了季节性、趋势性和残差的加和,同时在预测趋势性分量的时候,可以使用ARIMA算法。ARIMA算法作为一种简单有效的时序预测的算法,通过建立自回归差分移动平均模型,可以对时间序列进行预测。由于STL分解无法处理节假日等特殊事件,以及ARIMA算法需要通过手动将不稳定时间序列通过差分法转化为稳定序列,在实际使用时存在较多的限制。由此,我们引入了另外一种算法,Prophet算法。
Prophet算法除了将时间序列分解为季节性、趋势性和残差以外,还加入了一个节日分量,允许将节日作为一个参数传入模型。这期我们将着重介绍Prophet算法。原paper链接可参考上一期博客

Prophet的趋势模型

Prophet的趋势模型是该算法的另一个亮点。作者首先认为,除了线性增长外,现实中的大多数增长趋势都遵从Sigmoid曲线

所以,在对趋势建模的时候,可以对sigmoid曲线进行拟合:

g_t = \frac{C}{1+\exp(-k(t-m))}image.png其中

C

其中C为增长上限,k为增长率,m为offset。

在实际场景中,增长上限往往会受时间影响,所以上限往往又是一个关于时间的函数C(t)。

在算法中,除了可以手动选取变点,也支持自动对变点进行选择。自动选择变点的原理也很简单,算法使用前80%的数据等间距取T=25个点,每个变点的先验概率密度函数都服从拉普拉斯分布:image.png,其中τ作为参数支持用户手动设定。在训练时,更新这个参数τ直接采用了最大似然估计,如果其中某个点不是变点(前后的斜率变化不超过一个阈值),则τ=0,此时拉普拉斯分布的概率密度函数恒为0,自然也就不存在变点。

在预测模型时,变点的预测算法直接使用了训练得到的拉普拉斯概率密度函数作为后验概率进行预测。在paper中,作者指出了τ这个参数还有另外一个功能:当τ越大,模型越趋向于overfit。(笔者对此的理解是,τ越大,说明模型的方差越大。方差越大过拟合的趋势自然就越明显)

在使用python调用prophet算法的时候,对于上述趋势模型,我们可以调整拟合模式(线性/sigmoid),以及先验分布参数τ,以及变点设置。具体可以参考博客FACEBOOK 时间序列预测算法 PROPHET 的研究

Prophet的季节模型

Prophet的季节模型较为简单,使用了傅里叶级数模拟时间序列的周期性,一般在调整级数的时候,N=10和N=3可以分别较好的拟合年度和每周的季节性分量。当然在选取N的时候,也可使用赤池信息准则AIC或AICc判定。

Prophet的节假日模型

Prophet算法支持根据需要设置节假日。假设一共有L个节假日:

h(t)=Z(t)K=\sum_{i=1}^{L}K_i\times1_{\{t\in D_i\}}image.png


Prophet的实际使用

Prophet的参数可以通过forecaster.py的__init__函数看到:

image.png

在对现网进行容量评估时,经常会涉及到对未来用户数的预测,我们可以将Prophet算法用于预测未来用户数。这是实际的预测效果:

我们也可以观察提取到的趋势和周期性分量:

作者:老王


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。