1. 程式人生 > >prophet:時間序列預測模型原理

prophet:時間序列預測模型原理

prophet:時間序列預測原理

介紹

prophet是Facebook 開源一款基於 Python 和 R 語言的資料預測工具即“先知”。Facebook 表示,Prophet 相比現有預測工具更加人性化,並且難得地提供 Python 和R的支援。它生成的預測結果足以和專業資料分析師媲美。

時間序列模型

基本模型

y(t)=g(t)+s(s)+h(t)+ϵt
這裡,模型將時間序列分成3個部分的疊加,其中g(t)表示增長函式,用來擬合非週期性變化的。s(t)用來表示週期性變化,比如說每週,每年,季節等,h(t)表示假期,節日等特殊原因等造成的變化,最後ϵt為噪聲項,用他來表示隨機無法預測的波動,我們假設ϵ
t
是高斯的。事實上,這是generalized additive model(GAM)模型的特例,但我們這裡只用到了時間作為擬合的引數。

這裡寫圖片描述
prophet的工作流如上圖所述,通過整合了建模-評估兩大模組,實現了時間序列模型的快速迭代優化。

對於GAM的擬合,可以使用backfitting或L-BFGS來進行(我們偏向於選擇L-BFGS)。

因此,對於時間序列的預測問題,這裡是把該當做了曲線擬合的問題來完成,因此與傳統時間序列的方法有所不同。傳統時間序列更多的是考慮時間在結構上的依賴關係,比如ARIMA模型,通過放棄這一點有4個好處:

1.更靈活

2.ARIMA建模需要有連續的時間資料,而我們這個方法並不需要,因此我們可以不考慮缺失值的填充問題。

3.擬合非常快,使得互動式探索成為可能。

4.預測模型的引數非常容易解釋,因此分析人員可以根據經驗來設定一些引數。

增長項

非線性增長

我們將增長項g(t)定義為了一個邏輯函式:

g(t)=C1+exp(k(tb))
這一個函式實際上就是類似於人口增長函式,其中C是人口容量,k是增長率,b是偏移量。顯然隨著t的增加,g(t)越趨於C,k越大,增長速度就越快。

但是如果僅使用這個模型是無法滿足要求的,因為增長率是可能隨著時間變化的。於是我們可以設一個change point用來表示增長率k變化的時間節點,當tsj的時候就是一個轉折點

這裡寫圖片描述
由於出現change point,為了使函式是連續的,需要做些處理:

這裡寫圖片描述
我們設C也是隨時間變化的

C(t)=KC(t)=Mt+K
於是最後我們可以得到

這裡寫圖片描述
另外,我們也可以使用線性的增長函式:

這裡寫圖片描述
k是增長率,δ是適應率,b是偏移量引數,γ設為sjδj是為了讓這個函式連續

季節性

這裡使用傅立葉級數來近似

這裡寫圖片描述
因此,模型需要擬合這些cn係數,N越大,越能擬合複雜的季節性

若取N=10,可以寫成
這裡寫圖片描述

節假日

處理節日的方法很簡單,就是將過去,將來的相同節假日設定一個虛擬變數

這裡寫圖片描述
Di表示第i個虛擬變數,如果屬於這個就1,不屬於就0.

模型擬合

最後模型的擬合用到了stan語言進行擬合,非常方便:

這裡寫圖片描述
以上就是模型在stan上的定義。想了解更多stan,可以參考我另外一篇部落格:R語言stan概率程式設計

參考資料

作為分享主義者(sharism),本人所有網際網路釋出的圖文均遵從CC版權,轉載請保留作者資訊並註明作者a358463121專欄:http://blog.csdn.net/a358463121,如果涉及原始碼請註明GitHub地址:https://github.com/358463121/。商業使用請聯絡作者。