近日,facebook 宣布開源了一個可以通過 python 和 r 語言使用的預測工具 prophet。以下是 facebook 研究部落格對該工具的介紹。
預測(forecasting)是一個資料科學問題,也是很多組織機構内許多活動的核心。比如說,像 facebook 這樣的大型組織必須進行能力規劃(capacity planning)以有效地配置設定稀缺資源和目标配置,以便能基于基準對業績表現進行測量。不管是對于機器還是對于分析師而言,得出高品質的預測都并非易事。我們已經在建立各種各樣的業務預測(business forecasts)的實踐中觀察到了兩大主要主題:
完全自動化的預測技術可能會很脆弱,而且往往非常不靈活,不能整合有用的假設或啟發。
能夠産生高品質預測的分析師相當少,因為預測是一種需要大量經驗的資料科學領域的專業技能。
這兩個主題會導緻一個結果:對高品質預測的需求往往超出分析師能夠得出的預測速度。這個情況是我們創造 prophet 的動力:我們想要讓專家和非專家都能輕松地做出高品質的預測來滿足自身的需求。
對于「規模(scale)」的通常考慮涉及到計算和存儲,但這些都不是預測的核心問題。我們發現預測大量時間序列(time series)的計算和基礎設施問題是相對簡單的——通常這些拟合過程可以很容易地并行化,而預測本身也能容易地被存儲在 mysql 這樣的關系資料庫或 hive 這樣的資料倉庫中。據我們觀察,「規模」在實踐中面臨的問題涉及的是由多種預測問題所引入的複雜性(complexity)和在得出預測後如何在大量預測結果中建構信任(trust)。prophet 已經成為了 facebook 建立大量可信預測的能力的關鍵組成部分,這些預測可被用于決策制定甚至用在産品功能中。
prophet 有什麼用?
并非所有的預測問題都可以通過同一種程式(procedure)解決。prophet 是為我們在 facebook 所遇到的業務預測任務而優化的,這些任務通常具有以下特點:
對于曆史在至少幾個月(最好是一年)的每小時、每天或每周的觀察
強大的多次的「人類規模級」的季節性:每周的一些天和每年的一些時候
事先知道的以不定期的間隔發生的重要節假日(如,超級碗)
合理數量的缺失的觀察或大量異常
曆史趨勢改變,比如因為産品釋出或記錄變化
非線性增長曲線的趨勢,其中有的趨勢達到了自然極限或飽和
我們發現預設設定的 prophet 能産生往往和經驗豐富的預測師得到的一樣準确的預測,而所花費的工作卻更少。使用 prophet,如果該預測不令人滿意,你也不用局限于一個完全自動化的程式——即使一個沒有接受過任何時間序列方法訓練的分析師也能夠使用各種各樣的可輕松解讀的參數來改進或調整預測。我們已經發現:通過在特定案例上将自動化預測和分析師參與的預測(analyst-in-the-loop forecasts)結合到一起,它有可能可适用于非常大範圍的業務用例。下圖給出了我們發現的可以大規模使用的預測過程:
我們常常在許多設定中使用 prophet 作為預測(forecast)軟體包的替代,因為其有如下兩個主要優點:
prophet 讓我們可以更加簡單直接地建立合理且準确的預測。該預測包包含了許多不同的預測技術(比如 arima、指數平滑等),其中每一個都有它們自己的長處、短處和調整參數。我們發現錯誤的模型或參數選擇往往會導緻糟糕的結果,而在這樣的選擇陣列下,即使是經驗豐富的分析師也不太可能能夠有效地選擇出正确的模型和參數。
prophet 預測可以通過對非專家而言很直覺的方式進行自定義。有關于季節性的平滑參數讓你能調整與曆史周期之間的接近程度,以及關于趨勢的平滑參數讓你能調整跟随曆史趨勢變化的激程序度。對于增長曲線而言,你可以手動設定「capacity」或增長曲線的上限,這能讓你注入關于你預測的增長或下降情況的先驗資訊。最後,你還可以為模型指定沒有規律的節假日,比如超級碗、感恩節和黑色星期五的日期。
prophet 如何工作
本質上講,prophet 程式是一個可加性回歸模型(additive regression model),它包含 4 個主要元件:
分段線性或者 logistic 增長曲線趨勢。通過從資料中選擇變化點,prophet 自動探測趨勢變化。
使用傅立葉級數模組化每年的季節分量。
使用虛變量(dummy variables)的每周的季節分量。
使用者提供的重要節假日清單。

prophet 将提供一個組分圖,用圖形描述它所拟合的模型:
這個組分圖更加清晰地展示了與浏覽 peyton manning 的網頁(橄榄球正常賽與季後賽)相關的每年的季節性,以及每周的季節性:(星期日和星期一)比賽當天和比賽之後有更多的通路。你也可以注意到趨勢元件自他最近退休以來的下行調整。
prophet 的重要思想是:通過更好地靈活拟合趨勢組分,我們可以更精确地模組化季節性,并且有更準确的預測結果。對于這個任務我們更喜歡使用非常靈活的回歸模型(有一點像曲線拟合)而不是傳統的時序模型,因為前者可以使我們模組化更靈活,更容易拟合模型,更優雅地處理丢失資料或離群值。
通過模拟時間序的未來趨勢變化,prophet 預設地會為趨勢組分提供不确定的間隔。如果你希望對未來季節性或假期影響的不确定性進行模組化,你可以運作數百個 hmc 疊代(花費幾分鐘),你的預測就将會包括季節性不确定評估。