Facebook開源大規(guī)模預(yù)測工具Prophet:支持Python和R
近日,F(xiàn)acebook 宣布開源了一個可以通過 Python 和 R 語言使用的預(yù)測工具 Prophet。以下是 Facebook 研究博客對該工具的介紹。
預(yù)測(forecasting)是一個數(shù)據(jù)科學(xué)問題,也是很多組織機(jī)構(gòu)內(nèi)許多活動的核心。比如說,像 Facebook 這樣的大型組織必須進(jìn)行能力規(guī)劃(capacity planning)以有效地分配稀缺資源和目標(biāo)配置,以便能基于基準(zhǔn)對業(yè)績表現(xiàn)進(jìn)行測量。不管是對于機(jī)器還是對于分析師而言,得出高質(zhì)量的預(yù)測都并非易事。我們已經(jīng)在創(chuàng)建各種各樣的業(yè)務(wù)預(yù)測(business forecasts)的實(shí)踐中觀察到了兩大主要主題:
- 完全自動化的預(yù)測技術(shù)可能會很脆弱,而且往往非常不靈活,不能整合有用的假設(shè)或啟發(fā)。
- 能夠產(chǎn)生高質(zhì)量預(yù)測的分析師相當(dāng)少,因?yàn)轭A(yù)測是一種需要大量經(jīng)驗(yàn)的數(shù)據(jù)科學(xué)領(lǐng)域的專業(yè)技能。
這兩個主題會導(dǎo)致一個結(jié)果:對高質(zhì)量預(yù)測的需求往往超出分析師能夠得出的預(yù)測速度。這個情況是我們創(chuàng)造 Prophet 的動力:我們想要讓專家和非專家都能輕松地做出高質(zhì)量的預(yù)測來滿足自身的需求。
對于「規(guī)模(scale)」的通常考慮涉及到計算和存儲,但這些都不是預(yù)測的核心問題。我們發(fā)現(xiàn)預(yù)測大量時間序列(time series)的計算和基礎(chǔ)設(shè)施問題是相對簡單的——通常這些擬合過程可以很容易地并行化,而預(yù)測本身也能容易地被存儲在 MySQL 這樣的關(guān)系數(shù)據(jù)庫或 Hive 這樣的數(shù)據(jù)倉庫中。據(jù)我們觀察,「規(guī)模」在實(shí)踐中面臨的問題涉及的是由多種預(yù)測問題所引入的復(fù)雜性(complexity)和在得出預(yù)測后如何在大量預(yù)測結(jié)果中構(gòu)建信任(trust)。Prophet 已經(jīng)成為了 Facebook 創(chuàng)建大量可信預(yù)測的能力的關(guān)鍵組成部分,這些預(yù)測可被用于決策制定甚至用在產(chǎn)品功能中。
Prophet 有什么用?
并非所有的預(yù)測問題都可以通過同一種程序(procedure)解決。Prophet 是為我們在 Facebook 所遇到的業(yè)務(wù)預(yù)測任務(wù)而優(yōu)化的,這些任務(wù)通常具有以下特點(diǎn):
- 對于歷史在至少幾個月(***是一年)的每小時、每天或每周的觀察
- 強(qiáng)大的多次的「人類規(guī)模級」的季節(jié)性:每周的一些天和每年的一些時候
- 事先知道的以不定期的間隔發(fā)生的重要節(jié)假日(如,超級碗)
- 合理數(shù)量的缺失的觀察或大量異常
- 歷史趨勢改變,比如因?yàn)楫a(chǎn)品發(fā)布或記錄變化
- 非線性增長曲線的趨勢,其中有的趨勢達(dá)到了自然極限或飽和
我們發(fā)現(xiàn)默認(rèn)設(shè)置的 Prophet 能產(chǎn)生往往和經(jīng)驗(yàn)豐富的預(yù)測師得到的一樣準(zhǔn)確的預(yù)測,而所花費(fèi)的工作卻更少。使用 Prophet,如果該預(yù)測不令人滿意,你也不用局限于一個完全自動化的程序——即使一個沒有接受過任何時間序列方法訓(xùn)練的分析師也能夠使用各種各樣的可輕松解讀的參數(shù)來改進(jìn)或調(diào)整預(yù)測。我們已經(jīng)發(fā)現(xiàn):通過在特定案例上將自動化預(yù)測和分析師參與的預(yù)測(analyst-in-the-loop forecasts)結(jié)合到一起,它有可能可適用于非常大范圍的業(yè)務(wù)用例。下圖給出了我們發(fā)現(xiàn)的可以大規(guī)模使用的預(yù)測過程:
對于該預(yù)測過程的建模階段,目前僅有有限數(shù)量的工具可用。Rob Hyndman 的出色的預(yù)測 R 語言的預(yù)測軟件包(http://robjhyndman.com/software/forecast/)可能是目前***的選擇,而且谷歌和 Twitter 也都分別發(fā)布了帶有更加特定的時間序列功能的軟件包——CausalImpact(https://google.github.io/CausalImpact/)和 AnomalyDetection(https://github.com/twitter/AnomalyDetection)。就我們所知,在使用 Python 的預(yù)測上,還少有開源的軟件包可用。
我們常常在許多設(shè)置中使用 Prophet 作為預(yù)測(forecast)軟件包的替代,因?yàn)槠溆腥缦聝蓚€主要優(yōu)點(diǎn):
Prophet 讓我們可以更加簡單直接地創(chuàng)建合理且準(zhǔn)確的預(yù)測。該預(yù)測包包含了許多不同的預(yù)測技術(shù)(比如 ARIMA、指數(shù)平滑等),其中每一個都有它們自己的長處、短處和調(diào)整參數(shù)。我們發(fā)現(xiàn)錯誤的模型或參數(shù)選擇往往會導(dǎo)致糟糕的結(jié)果,而在這樣的選擇陣列下,即使是經(jīng)驗(yàn)豐富的分析師也不太可能能夠有效地選擇出正確的模型和參數(shù)。
Prophet 預(yù)測可以通過對非專家而言很直觀的方式進(jìn)行自定義。有關(guān)于季節(jié)性的平滑參數(shù)讓你能調(diào)整與歷史周期之間的接近程度,以及關(guān)于趨勢的平滑參數(shù)讓你能調(diào)整跟隨歷史趨勢變化的激進(jìn)程度。對于增長曲線而言,你可以手動設(shè)定「capacity」或增長曲線的上限,這能讓你注入關(guān)于你預(yù)測的增長或下降情況的先驗(yàn)信息。***,你還可以為模型指定沒有規(guī)律的節(jié)假日,比如超級碗、感恩節(jié)和黑色星期五的日期。
Prophet 如何工作
本質(zhì)上講,Prophet 程序是一個可加性回歸模型(additive regression model),它包含 4 個主要組件:
- 分段線性或者 logistic 增長曲線趨勢。通過從數(shù)據(jù)中選擇變化點(diǎn),Prophet 自動探測趨勢變化。
- 使用傅立葉級數(shù)建模每年的季節(jié)分量。
- 使用虛變量(dummy variables)的每周的季節(jié)分量。
- 用戶提供的重要節(jié)假日列表。
例如,下面是一個特征預(yù)測:使用 wikipediatrend 包(https://cran.r-project.org/web/packages/wikipediatrend/index.html)下載的 Peyton Manning 的維基百科頁面的查看數(shù)量的日志。由于 Peyton Manning 是一名美式橄欖球運(yùn)動員,你可以看到他每年季節(jié)性的重要程度變化,同時每周的周期性也明顯存在。***你看到特定事件(比如他參加的季后賽)也可能被建模了。
Prophet 將提供一個組分圖,用圖形描述它所擬合的模型:
這個組分圖更加清晰地展示了與瀏覽 Peyton Manning 的網(wǎng)頁(橄欖球常規(guī)賽與季后賽)相關(guān)的每年的季節(jié)性,以及每周的季節(jié)性:(星期日和星期一)比賽當(dāng)天和比賽之后有更多的訪問。你也可以注意到趨勢組件自他最近退休以來的下行調(diào)整。
Prophet 的重要思想是:通過更好地靈活擬合趨勢組分,我們可以更精確地建模季節(jié)性,并且有更準(zhǔn)確的預(yù)測結(jié)果。對于這個任務(wù)我們更喜歡使用非常靈活的回歸模型(有一點(diǎn)像曲線擬合)而不是傳統(tǒng)的時序模型,因?yàn)榍罢呖梢允刮覀兘8`活,更容易擬合模型,更優(yōu)雅地處理丟失數(shù)據(jù)或離群值。
通過模擬時間序的未來趨勢變化,Prophet 默認(rèn)地會為趨勢組分提供不確定的間隔。如果你希望對未來季節(jié)性或假期影響的不確定性進(jìn)行建模,你可以運(yùn)行數(shù)百個 HMC 迭代(花費(fèi)幾分鐘),你的預(yù)測就將會包括季節(jié)性不確定評估。
我們使用 Stan(http://mc-stan.org/)調(diào)整 Prophet 模型,并在 Stan 的概率編程語言中實(shí)現(xiàn)了 Prophet 流程的核心部分。Stan 對參數(shù)的 MAP 優(yōu)化有著極快的速度( 1 秒),讓我們可以選擇使用 Hamiltonian Monte Carlo 算法評估不確定的參數(shù),也使得我們能夠在多種接口語言上重復(fù)使用該擬合程序。目前,我們提供了 Python 和 R 語言的 Prophet 實(shí)現(xiàn)。它們有著幾乎相同的特征,而且通過提供這兩種實(shí)現(xiàn),我們希望該預(yù)測方法能夠在數(shù)據(jù)科學(xué)社區(qū)有更廣泛的用途。