天天看點

Facebook 開源大規模預測工具 Prophet:支援 Python 和 R Facebook 開源大規模預測工具 Prophet:支援 Python 和 R

http://top.jobbole.com/36347/?utm_source=blog.jobbole.com&utm_medium=sidebar-top-news

http://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650723632&idx=2&sn=686c0a40ee081c18dda15ef82dbacd45&scene=0#wechat_redirect

  • Facebook 開源大規模預測工具 Prophet:支援 Python 和 R

原文出處: 機器之心

近日,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)結合到一起,它有可能可适用于非常大範圍的業務用例。

下圖給出了我們發現的可以大規模使用的預測過程:

Facebook 開源大規模預測工具 Prophet:支援 Python 和 R Facebook 開源大規模預測工具 Prophet:支援 Python 和 R

對于該預測過程的模組化階段,目前僅有有限數量的工具可用。Rob Hyndman 的出色的預測 R 語言的預測軟體包(http://robjhyndman.com/software/forecast/)可能是目前最受歡迎的選擇,而且谷歌和 Twitter 也都分别釋出了帶有更加特定的時間序列功能的軟體包——CausalImpact(https://google.github.io/CausalImpact/)和 AnomalyDetection(https://github.com/twitter/AnomalyDetection)。就我們所知,在使用 Python 的預測上,還少有開源的軟體包可用。

我們常常在許多設定中使用 Prophet 作為預測(forecast)軟體包的替代,因為其有如下兩個主要優點:

  1. Prophet 讓我們可以更加簡單直接地建立合理且準确的預測。該預測包包含了許多不同的預測技術(比如 ARIMA、指數平滑等),其中每一個都有它們自己的長處、短處和調整參數。我們發現錯誤的模型或參數選擇往往會導緻糟糕的結果,而在這樣的選擇陣列下,即使是經驗豐富的分析師也不太可能能夠有效地選擇出正确的模型和參數。
  2. Prophet 預測可以通過對非專家而言很直覺的方式進行自定義。有關于季節性的平滑參數讓你能調整與曆史周期之間的接近程度,以及關于趨勢的平滑參數讓你能調整跟随曆史趨勢變化的激程序度。對于增長曲線而言,你可以手動設定「capacity」或增長曲線的上限,這能讓你注入關于你預測的增長或下降情況的先驗資訊。最後,你還可以為模型指定沒有規律的節假日,比如超級碗、感恩節和黑色星期五的日期。

Prophet 如何工作

本質上講,Prophet 程式是一個可加性回歸模型(additive regression model),它包含 4 個主要元件:

  • 分段線性或者 logistic 增長曲線趨勢。通過從資料中選擇變化點,Prophet 自動探測趨勢變化。
  • 使用傅立葉級數模組化每年的季節分量。
  • 使用虛變量(dummy variables)的每周的季節分量。
  • 使用者提供的重要節假日清單。

例如,下面是一個特征預測:使用 wikipediatrend 包(https://cran.r-project.org/web/packages/wikipediatrend/index.html)下載下傳的 Peyton Manning 的維基百科頁面的檢視數量的日志。由于 Peyton Manning 是一名美式橄榄球運動員,你可以看到他每年季節性的重要程度變化,同時每周的周期性也明顯存在。最後你看到特定事件(比如他參加的季後賽)也可能被模組化了。

Facebook 開源大規模預測工具 Prophet:支援 Python 和 R Facebook 開源大規模預測工具 Prophet:支援 Python 和 R

Prophet 将提供一個組分圖,用圖形描述它所拟合的模型:

Facebook 開源大規模預測工具 Prophet:支援 Python 和 R Facebook 開源大規模預測工具 Prophet:支援 Python 和 R

這個組分圖更加清晰地展示了與浏覽 Peyton Manning 的網頁(橄榄球正常賽與季後賽)相關的每年的季節性,以及每周的季節性:(星期日和星期一)比賽當天和比賽之後有更多的通路。你也可以注意到趨勢元件自他最近退休以來的下行調整。

Prophet 的重要思想是:通過更好地靈活拟合趨勢組分,我們可以更精确地模組化季節性,并且有更準确的預測結果。對于這個任務我們更喜歡使用非常靈活的回歸模型(有一點像曲線拟合)而不是傳統的時序模型,因為前者可以使我們模組化更靈活,更容易拟合模型,更優雅地處理丢失資料或離群值。

通過模拟時間序的未來趨勢變化,Prophet 預設地會為趨勢組分提供不确定的間隔。如果你希望對未來季節性或假期影響的不确定性進行模組化,你可以運作數百個 HMC 疊代(花費幾分鐘),你的預測就将會包括季節性不确定評估。

我們使用 Stan(http://mc-stan.org/)調整 Prophet 模型,并在 Stan 的機率程式設計語言中實作了 Prophet 流程的核心部分。Stan 對參數的 MAP 優化有着極快的速度( 1 秒),讓我們可以選擇使用 Hamiltonian Monte Carlo 算法評估不确定的參數,也使得我們能夠在多種接口語言上重複使用該拟合程式。目前,我們提供了 Python 和 R 語言的 Prophet 實作。它們有着幾乎相同的特征,而且通過提供這兩種實作,我們希望該預測方法能夠在資料科學社群有更廣泛的用途。

如何使用 Prophet

使用 Prophet 的最簡單方法是從 PyPI(Python)或 CRAN(R)裡安裝這個軟體包。你可以閱讀我們的快速入門指南,以及閱讀綜合文檔以進行深入的了解。如果你正在尋找一個有趣的時序資料資源,我們建議你嘗試一下 wikipediatrend 軟體包,它可以從維基百科頁面上下載下傳曆史頁面點選資料。

以下是機器之心對 Prophet 項目上 README.md 檔案的編譯介紹:

Prophet 是一個預測時序資料的程式。它基于加法模型(additive model),其中非線性趨勢可與按年和按周的季節性、以及節假日進行拟合。借助至少一年的曆史資料,它在每日預測資料上表現最好。在資料丢失、趨勢變換以及大離群值方面,Prophet 表現也很穩健。

Prophet 是由 Facebook 的 Core Data Science 團隊釋出的一個開源軟體,可從 CRAN 和 PyPI 上下載下傳。

重要連結

  • 首頁:https://facebookincubator.github.io/prophet/
  • HTML 文檔:https://facebookincubator.github.io/prophet/docs/quick_start.html
  • 問題跟蹤:https://github.com/facebookincubator/prophet/issues
  • 源代碼庫:https://github.com/facebookincubator/prophet
  • Prophet R 軟體包: https://cran.r-project.org/package=prophet
  • Prophet Python 軟體包:https://pypi.python.org/pypi/fbprophet/

在 R 中安裝

Prophet 是一個 CRAN 軟體包,是以你可以使用 install.packages:

# R

> install.packages('prophet')

完成安裝,你就可以開始了!

Windows 

在 Windows 中,R 需要一個編譯器,你可以遵循 rstan 提供的指導:https://github.com/stan-dev/rstan/wiki/Installing-RStan-on-Windows。關鍵一步是在試圖安裝軟體包之前安裝 Rtools:http://cran.r-project.org/bin/windows/Rtools/

在 Python 中安裝

Prophet 在 PyPI 上,是以你可以用 pip 安裝它:

# bash

$ pip install fbprophet

Prophet 的主要依賴包是 pystan。PyStan 有自己的安裝說明:http://pystan.readthedocs.io/en/latest/installation_beginner.html

完成安裝,你就可以開始了!

Windows

在 Windows 中,PyStan 需要一個編譯器,是以你将遵循這個指導:http://pystan.readthedocs.io/en/latest/windows.html。關鍵一步是安裝一個最新的 C++編譯器:http://landinghub.visualstudio.com/visual-cpp-build-tools

英文論文:https://facebookincubator.github.io/prophet/static/prophet_paper_20170113.pdf

論文:Forecasting at Scale

Facebook 開源大規模預測工具 Prophet:支援 Python 和 R Facebook 開源大規模預測工具 Prophet:支援 Python 和 R

摘要:要在各種時間序列(time series)上産生大量預測,我們面臨着各種各樣的挑戰。我們實作大規模預測(forecasting at scale)的方法是将可配置的模型和全面的分析師參與的(analyst-in-the-loop)性能分析結合到一起。我們提出了一種基于一種可分解模型(decomposable model)的預測方法,這種模型帶有可解釋的參數,這些參數可被分析師直覺地進行調整。我們描述了我們可以用來比較和評估預測程式的表現分析,并且自動标記了需要人工審查和調整的預測。這些能幫助分析師最有效地使用他們的專業知識工具實作了對許多類型業務時間序列的可靠預測。