如何評價facebook開源的prophet時間序列預測工具?

官網:Prophet


在今年三月prophet剛發布的時候就簡單用過,但最近才想起去讀paper……


首先,prophet是一個工業級應用,而不是說在時間序列預測的模型上有非常大的創新。

記得今年在參加一次貓眼電影票房預測的內部分享時,旁邊坐了一個外賣的PM。結束時對方問我,有什麼方法可以預測外賣的訂單量。我當時想了想,諸如Holt-Winters指數平滑、ARIMA、或者deep learning的LSTM,似乎都不是那麼容易解釋。

時間序列預測對大部分公司而言都存在必要的需求,比如電商預測GMV,外賣O2O預測成交量波動以便於運力分配,酒店預測間夜量來調整定價與銷售,等等。但通常而言,時間序列預測對不少公司來說是一個難題。主要原因除了時間序列預測本身就是玄學(大霧)之外,還要求分析師同時具備深厚的專業領域知識(domain knowledge)和時間序列建模的統計學知識。此外,時間序列模型的調參也是一個比較複雜而繁瑣的工作。

prophet就是在這樣的背景下的產物,將一些時間序列建模常見的流程與參數default化,來使不太懂統計的業務分析師也能夠針對需求快速建立一個相對可用的模型。

很多商業行為是存在一定的時間相依的模式的。作者以Facebook上用戶創造「事件」(events)來舉例:

可以看到用戶創造事件的數量有很明顯的時間序列特徵:多種周期性、趨勢性、節假日效應,以及部分異常值。

然後作者用R的forecast包里的幾種常見的時間序列預測技術(ARIMA, 指數平滑等等)來建模,效果慘不忍睹:

圖1是ARIMA,圖2是指數平滑,圖3是snaive,圖4是tbats。

模型結構

Prophet的本質是一個可加模型,基本形式如下:

y(t) = g(t) + s(t) + h(t) + varepsilon_{t}

其中 g(t) 是趨勢項,s(t) 是周期項, h(t) 是節假日項, varepsilon_{t} 是誤差項並且服從正態分布。

趨勢模型

prophet里使用了兩種趨勢模型:飽和增長模型(saturating growth model)和分段線性模型(piecewise linear model)。兩種模型都包含了不同程度的假設和一些調節光滑度的參數,並通過選擇變化點(changepoints)來預測趨勢變化。具體推導就不寫了,只寫下最終形式:

saturating growth model:

g(t) = frac{C(t)}{1 + exp(-(k + a(t)^{T}delta)(t - (m + a(t)^Tgamma)))}

piecewise linear model:

g(t) = (k + a(t)^Tdelta)t + (m + a(t)^Tgamma)

周期模型

prophet用傅里葉級數(Fourier series)來建立周期模型:

s(t) = sum_{n=1}^{N}({a_ncos(frac{2pi nt}{P}) + b_nsin(frac{2pi nt}{P}}))

對N的調節起到了低通濾波(low-pass filter)的作用。作者說對於年周期與星期周期,N分別選取為10和3的效果比較好。

節假日與突發事件模型

節假日需要用戶事先指定,每一個節假日都包含其前後的若干天。模型形式如下(感覺就是一個虛擬變數):

Z(t) = [1(tin D_1), ...,1(tin D_L)]

h(t) = Z(t)kappa

kappa sim Normal(0, 
u^2)

模型性能

還是使用上面Facebook的例子,作者給出了Prophet的模型擬合與預測能力:

看起來比前面用R的forecast做的效果好了很多,並且不需要使用者具有很強的統計背景就能夠輕鬆進行建模。

同時prophet支持將模型分解為單獨的各項組成部分,並且實現起來很容易,只需要調用一行代碼prophet_plot_components:

適用範圍

很明顯,Prophet只適用於具有明顯的內在規律(或者說,模式)的商業行為數據。

雖然官方案例里通常使用日數據的序列,但對於更短時間頻段,比如小時數據,也是支持的。

但對於不具有明顯趨勢性、周期性的時間序列,使用Prophet進行預測就不適合了。比如前面有同學用Prophet來預測滬深300……先不說有效市場假說(EMH)否定了歷史數據對未來價格擬合的可能性,就算市場存在模式,也不是能夠被一個通用模型簡單的線性分解成趨勢和周期的。

我自己最早是基於內部歷史數據,嘗試公司風控的潛在損失做一個簡單預測,但很明顯,沒有任何證據能說明過去的序列特徵(比如風險集中趨勢,外部環境影響,公司層面的合併等等)會在2017年重演。所以充其量就是拿來寫寫周報,以及為2017年風控預算做一點微小的貢獻……

總結

Prophet是一個比較好用的預測工具,特別是對我這種拿著forecast的ets和auto.arima也懶到自動定階和模型選擇的人來說(逃……

對業務分析師很友好,因為原理很簡單,有R和python的基礎上手也很容易。

通常能夠給出一個還不錯的預測結果。比如我就對某些業務線的交易數據跑了下預測,發現大部分都能work,諸如「春節效應」這種中國特色也能抓得比較准。


今天剛發現的神器,火速試用了一下,以下是今天的總結:

優點:

1.簡單:安裝簡單(pip一鍵安裝),建模簡單(沒有任何參數直接model一下),預測簡單(直接predict就可以)。代碼量簡單到令人髮指。

2.速度稍快。

缺點:

1.Windows安裝坑爹!!!我是win10+python 3.5,根本裝不上!

2.Ubuntu也坑爹!16.04裝不上的。對我就是裝不上,雖然你們都裝的上。。。我最後在我伺服器14.04裝的,然而沒法調試(在伺服器上怎麼調。。。)

3.文檔太少!!!API根本查不到!建議官方快速完善!

最後的建議:

趕緊出第三方的.whl文件吧!!!

趕緊把文檔豐富一下吧。。。


主頁見:https://research.fb.com/prophet-forecasting-at-scale/

提供的功能還蠻不錯的,支持python和R,看了下增長預測的例子:

能把握裡面的周期性特徵。


簡單看了一眼paper,我覺得paper的title和前言里已經說的很清楚了,這個工具的主要目的是降低預測的門檻,讓沒有任何時間序列知識的人也能得到相對可以接受的預測結果。


這周在centos上折騰了下,嘗試用來預測在線數據,不過效果一般,還在研究調整中。

官方例子很多都是以天或月作為數據,懷疑對短期數據預測不怎麼好


昨天用了,感想嘛…不調參不一定就好,而且似乎更適合長時間預測,規律較強的模型。總而言之…預測效果不好,擬合最後一段時間的趨勢明顯,經常出現負數…


試了一下用來預測滬深300的收盤價,錯得離譜,看起來不適合做金融時間序列的預測(紅色為樣本內,橙色為樣本外):


很方便。但是效果一般般。


當前的所有運維體系都傾向於智能化和採用大數據分析手段來建立SLA。我覺得非常好的一個項目包括facebook開源的facebookincubator/beringeifacebookincubator/beringei.這幾天我會抽空來寫一片智能化運維體系建設的專欄文章。結合基於elk的日誌分析和分散式系統,預警平台和最近的一些嘗試和想法。

已經開始在我的專欄里: 開始寫點什麼 - 知乎專欄


推薦閱讀:

機器學習門下,有哪些在工業界應用較多,前景較好的小方向?
時間序列數據的聚類有什麼好方法?
一個文本里的所有詞不變,順序隨機後,那麼熵改變了多少?如何計算?
同樣是數據分析方法,為什麼時間序列分析沒有數據挖掘或機器學習那麼火?
如何深入理解時間序列分析中的平穩性?

TAG:Python | 數據挖掘 | R編程語言 | 時間序列分析 |