非死book開源大規模預測工具Prophet:支持Python和R

PhiEichmann 7年前發布 | 61K 次閱讀 Python 開源

今天,非死book 宣布開源了一個可以通過 Python 和 R 語言使用的預測工具 Prophet。以下是 非死book 研究博客對該工具的介紹,后面還附有機器之心對該開源項目 README.md 文件和相關論文摘要的編譯介紹。

Prophet 項目地址:https://github.com/非死bookincubator/prophet

預測(forecasting)是一個數據科學問題,也是很多組織機構內許多活動的核心。比如說,像 非死book 這樣的大型組織必須進行能力規劃(capacity planning)以有效地分配稀缺資源和目標配置,以便能基于基準對業績表現進行測量。不管是對于機器還是對于分析師而言,得出高質量的預測都并非易事。我們已經在創建各種各樣的業務預測(business forecasts)的實踐中觀察到了兩大主要主題:

  • 完全自動化的預測技術可能會很脆弱,而且往往非常不靈活,不能整合有用的假設或啟發。

  • 能夠產生高質量預測的分析師相當少,因為預測是一種需要大量經驗的數據科學領域的專業技能。

這兩個主題會導致一個結果:對高質量預測的需求往往超出分析師能夠得出的預測速度。這個情況是我們創造 Prophet 的動力:我們想要讓專家和非專家都能輕松地做出高質量的預測來滿足自身的需求。

對于「規模(scale)」的通常考慮涉及到計算和存儲,但這些都不是預測的核心問題。我們發現預測大量時間序列(time series)的計算和基礎設施問題是相對簡單的——通常這些擬合過程可以很容易地并行化,而預測本身也能容易地被存儲在 MySQL 這樣的關系數據庫或 Hive 這樣的數據倉庫中。據我們觀察,「規模」在實踐中面臨的問題涉及的是由多種預測問題所引入的復雜性(complexity)和在得出預測后如何在大量預測結果中構建信任(trust)。Prophet 已經成為了 非死book 創建大量可信預測的能力的關鍵組成部分,這些預測可被用于決策制定甚至用在產品功能中。

Prophet 有什么用?

并非所有的預測問題都可以通過同一種程序(procedure)解決。Prophet 是為我們在 非死book 所遇到的業務預測任務而優化的,這些任務通常具有以下特點:

  • 對于歷史在至少幾個月(最好是一年)的每小時、每天或每周的觀察

  • 強大的多次的「人類規模級」的季節性:每周的一些天和每年的一些時候

  • 事先知道的以不定期的間隔發生的重要節假日(如,超級碗)

  • 合理數量的缺失的觀察或大量異常

  • 歷史趨勢改變,比如因為產品發布或記錄變化

  • 非線性增長曲線的趨勢,其中有的趨勢達到了自然極限或飽和

我們發現默認設置的 Prophet 能產生往往和經驗豐富的預測師得到的一樣準確的預測,而所花費的工作卻更少。使用 Prophet,如果該預測不令人滿意,你也不用局限于一個完全自動化的程序——即使一個沒有接受過任何時間序列方法訓練的分析師也能夠使用各種各樣的可輕松解讀的參數來改進或調整預測。我們已經發現:通過在特定案例上將自動化預測和分析師參與的預測(analyst-in-the-loop forecasts)結合到一起,它有可能可適用于非常大范圍的業務用例。下圖給出了我們發現的可以大規模使用的預測過程:

對于該預測過程的建模階段,目前僅有有限數量的工具可用。Rob Hyndman 的出色的預測 R 語言的預測軟件包(http://robjhyndman.com/software/forecast/)可能是目前最受歡迎的選擇,而且谷歌和 推ter 也都分別發布了帶有更加特定的時間序列功能的軟件包——CausalImpact(https://google.github.io/CausalImpact/)和 AnomalyDetection(https://github.com/推ter/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 是一名美式橄欖球運動員,你可以看到他每年季節性的重要程度變化,同時每周的周期性也明顯存在。最后你看到特定事件(比如他參加的季后賽)也可能被建模了。

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

這個組分圖更加清晰地展示了與瀏覽 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 是由 非死book 的 Core Data Science 團隊發布的一個開源軟件,可從 CRAN 和 PyPI 上下載。

重要鏈接

  • 主頁:https://非死bookincubator.github.io/prophet/

  • HTML 文檔:https://非死bookincubator.github.io/prophet/docs/quick_start.html

  • 問題跟蹤:https://github.com/非死bookincubator/prophet/issues

  • 源代碼庫:https://github.com/非死bookincubator/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

論文:Forecasting at Scale

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

 

來自:http://www.jiqizhixin.com/article/2351

 

 本文由用戶 PhiEichmann 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!