選自Facebook
機(jī)器之心編譯
參與:吳攀、黃小天、李亞洲
今天,F(xiàn)acebook 宣布開源了一個(gè)可以通過 Python 和 R 語言使用的預(yù)測工具 Prophet。以下是 Facebook 研究博客對(duì)該工具的介紹,后面還附有機(jī)器之心對(duì)該開源項(xiàng)目 README.md 文件和相關(guān)論文摘要的編譯介紹。相關(guān)論文也可點(diǎn)擊文末「閱讀原文」查看。
Prophet 項(xiàng)目地址:https://github.com/facebookincubator/prophet
預(yù)測(forecasting)是一個(gè)數(shù)據(jù)科學(xué)問題,也是很多組織機(jī)構(gòu)內(nèi)許多活動(dòng)的核心。比如說,像 Facebook 這樣的大型組織必須進(jìn)行能力規(guī)劃(capacity planning)以有效地分配稀缺資源和目標(biāo)配置,以便能基于基準(zhǔn)對(duì)業(yè)績表現(xiàn)進(jìn)行測量。不管是對(duì)于機(jī)器還是對(duì)于分析師而言,得出高質(zhì)量的預(yù)測都并非易事。我們已經(jīng)在創(chuàng)建各種各樣的業(yè)務(wù)預(yù)測(business forecasts)的實(shí)踐中觀察到了兩大主要主題:
完全自動(dòng)化的預(yù)測技術(shù)可能會(huì)很脆弱,而且往往非常不靈活,不能整合有用的假設(shè)或啟發(fā)。
能夠產(chǎn)生高質(zhì)量預(yù)測的分析師相當(dāng)少,因?yàn)轭A(yù)測是一種需要大量經(jīng)驗(yàn)的數(shù)據(jù)科學(xué)領(lǐng)域的專業(yè)技能。
這兩個(gè)主題會(huì)導(dǎo)致一個(gè)結(jié)果:對(duì)高質(zhì)量預(yù)測的需求往往超出分析師能夠得出的預(yù)測速度。這個(gè)情況是我們創(chuàng)造 Prophet 的動(dòng)力:我們想要讓專家和非專家都能輕松地做出高質(zhì)量的預(yù)測來滿足自身的需求。
對(duì)于「規(guī)模(scale)」的通??紤]涉及到計(jì)算和存儲(chǔ),但這些都不是預(yù)測的核心問題。我們發(fā)現(xiàn)預(yù)測大量時(shí)間序列(time series)的計(jì)算和基礎(chǔ)設(shè)施問題是相對(duì)簡單的——通常這些擬合過程可以很容易地并行化,而預(yù)測本身也能容易地被存儲(chǔ)在 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 是為我們?cè)?Facebook 所遇到的業(yè)務(wù)預(yù)測任務(wù)而優(yōu)化的,這些任務(wù)通常具有以下特點(diǎn):
對(duì)于歷史在至少幾個(gè)月(最好是一年)的每小時(shí)、每天或每周的觀察
強(qiáng)大的多次的「人類規(guī)模級(jí)」的季節(jié)性:每周的一些天和每年的一些時(shí)候
事先知道的以不定期的間隔發(fā)生的重要節(jié)假日(如,超級(jí)碗)
合理數(shù)量的缺失的觀察或大量異常
歷史趨勢(shì)改變,比如因?yàn)楫a(chǎn)品發(fā)布或記錄變化
非線性增長曲線的趨勢(shì),其中有的趨勢(shì)達(dá)到了自然極限或飽和
我們發(fā)現(xiàn)默認(rèn)設(shè)置的 Prophet 能產(chǎn)生往往和經(jīng)驗(yàn)豐富的預(yù)測師得到的一樣準(zhǔn)確的預(yù)測,而所花費(fèi)的工作卻更少。使用 Prophet,如果該預(yù)測不令人滿意,你也不用局限于一個(gè)完全自動(dòng)化的程序——即使一個(gè)沒有接受過任何時(shí)間序列方法訓(xùn)練的分析師也能夠使用各種各樣的可輕松解讀的參數(shù)來改進(jìn)或調(diào)整預(yù)測。我們已經(jīng)發(fā)現(xiàn):通過在特定案例上將自動(dòng)化預(yù)測和分析師參與的預(yù)測(analyst-in-the-loop forecasts)結(jié)合到一起,它有可能可適用于非常大范圍的業(yè)務(wù)用例。下圖給出了我們發(fā)現(xiàn)的可以大規(guī)模使用的預(yù)測過程:
對(duì)于該預(yù)測過程的建模階段,目前僅有有限數(shù)量的工具可用。Rob Hyndman 的出色的預(yù)測 R 語言的預(yù)測軟件包(http://robjhyndman.com/software/forecast/)可能是目前最受歡迎的選擇,而且谷歌和 Twitter 也都分別發(fā)布了帶有更加特定的時(shí)間序列功能的軟件包——CausalImpact(https://google.github.io/CausalImpact/)和 AnomalyDetection(https://github.com/twitter/AnomalyDetection)。就我們所知,在使用 Python 的預(yù)測上,還少有開源的軟件包可用。
我們常常在許多設(shè)置中使用 Prophet 作為預(yù)測(forecast)軟件包的替代,因?yàn)槠溆腥缦聝蓚€(gè)主要優(yōu)點(diǎn):
1.Prophet 讓我們可以更加簡單直接地創(chuàng)建合理且準(zhǔn)確的預(yù)測。該預(yù)測包包含了許多不同的預(yù)測技術(shù)(比如 ARIMA、指數(shù)平滑等),其中每一個(gè)都有它們自己的長處、短處和調(diào)整參數(shù)。我們發(fā)現(xiàn)錯(cuò)誤的模型或參數(shù)選擇往往會(huì)導(dǎo)致糟糕的結(jié)果,而在這樣的選擇陣列下,即使是經(jīng)驗(yàn)豐富的分析師也不太可能能夠有效地選擇出正確的模型和參數(shù)。
2.Prophet 預(yù)測可以通過對(duì)非專家而言很直觀的方式進(jìn)行自定義。有關(guān)于季節(jié)性的平滑參數(shù)讓你能調(diào)整與歷史周期之間的接近程度,以及關(guān)于趨勢(shì)的平滑參數(shù)讓你能調(diào)整跟隨歷史趨勢(shì)變化的激進(jìn)程度。對(duì)于增長曲線而言,你可以手動(dòng)設(shè)定「capacity」或增長曲線的上限,這能讓你注入關(guān)于你預(yù)測的增長或下降情況的先驗(yàn)信息。最后,你還可以為模型指定沒有規(guī)律的節(jié)假日,比如超級(jí)碗、感恩節(jié)和黑色星期五的日期。
Prophet 如何工作
本質(zhì)上講,Prophet 程序是一個(gè)可加性回歸模型(additive regression model),它包含 4 個(gè)主要組件:
分段線性或者 logistic 增長曲線趨勢(shì)。通過從數(shù)據(jù)中選擇變化點(diǎn),Prophet 自動(dòng)探測趨勢(shì)變化。
使用傅立葉級(jí)數(shù)建模每年的季節(jié)分量。
使用虛變量(dummy variables)的每周的季節(jié)分量。
用戶提供的重要節(jié)假日列表。
例如,下面是一個(gè)特征預(yù)測:使用 wikipediatrend 包(https://cran.r-project.org/web/packages/wikipediatrend/index.html)下載的 Peyton Manning 的維基百科頁面的查看數(shù)量的日志。由于 Peyton Manning 是一名美式橄欖球運(yùn)動(dòng)員,你可以看到他每年季節(jié)性的重要程度變化,同時(shí)每周的周期性也明顯存在。最后你看到特定事件(比如他參加的季后賽)也可能被建模了。
Prophet 將提供一個(gè)組分圖,用圖形描述它所擬合的模型:
這個(gè)組分圖更加清晰地展示了與瀏覽 Peyton Manning 的網(wǎng)頁(橄欖球常規(guī)賽與季后賽)相關(guān)的每年的季節(jié)性,以及每周的季節(jié)性:(星期日和星期一)比賽當(dāng)天和比賽之后有更多的訪問。你也可以注意到趨勢(shì)組件自他最近退休以來的下行調(diào)整。
Prophet 的重要思想是:通過更好地靈活擬合趨勢(shì)組分,我們可以更精確地建模季節(jié)性,并且有更準(zhǔn)確的預(yù)測結(jié)果。對(duì)于這個(gè)任務(wù)我們更喜歡使用非常靈活的回歸模型(有一點(diǎn)像曲線擬合)而不是傳統(tǒng)的時(shí)序模型,因?yàn)榍罢呖梢允刮覀兘8`活,更容易擬合模型,更優(yōu)雅地處理丟失數(shù)據(jù)或離群值。
通過模擬時(shí)間序的未來趨勢(shì)變化,Prophet 默認(rèn)地會(huì)為趨勢(shì)組分提供不確定的間隔。如果你希望對(duì)未來季節(jié)性或假期影響的不確定性進(jìn)行建模,你可以運(yùn)行數(shù)百個(gè) HMC 迭代(花費(fèi)幾分鐘),你的預(yù)測就將會(huì)包括季節(jié)性不確定評(píng)估。
我們使用 Stan(http://mc-stan.org/)調(diào)整 Prophet 模型,并在 Stan 的概率編程語言中實(shí)現(xiàn)了 Prophet 流程的核心部分。Stan 對(duì)參數(shù)的 MAP 優(yōu)化有著極快的速度(<1 秒),讓我們可以選擇使用="" hamiltonian="" monte="" carlo="" 算法評(píng)估不確定的參數(shù),也使得我們能夠在多種接口語言上重復(fù)使用該擬合程序。目前,我們提供了="" python="" 和="" r="" 語言的="" prophet="">1>
如何使用 Prophet
使用 Prophet 的最簡單方法是從 PyPI(Python)或 CRAN(R)里安裝這個(gè)軟件包。你可以閱讀我們的快速入門指南,以及閱讀綜合文檔以進(jìn)行深入的了解。如果你正在尋找一個(gè)有趣的時(shí)序數(shù)據(jù)資源,我們建議你嘗試一下 wikipediatrend 軟件包,它可以從維基百科頁面上下載歷史頁面點(diǎn)擊數(shù)據(jù)。
以下是機(jī)器之心對(duì) Prophet 項(xiàng)目上 README.md 文件的編譯介紹:
Prophet 是一個(gè)預(yù)測時(shí)序數(shù)據(jù)的程序。它基于加法模型(additive model),其中非線性趨勢(shì)可與按年和按周的季節(jié)性、以及節(jié)假日進(jìn)行擬合。借助至少一年的歷史數(shù)據(jù),它在每日預(yù)測數(shù)據(jù)上表現(xiàn)最好。在數(shù)據(jù)丟失、趨勢(shì)變換以及大離群值方面,Prophet 表現(xiàn)也很穩(wěn)健。
Prophet 是由 Facebook 的 Core Data Science 團(tuán)隊(duì)發(fā)布的一個(gè)開源軟件,可從 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 是一個(gè) CRAN 軟件包,因此你可以使用 install.packages:
# R
> install.packages('prophet')
完成安裝,你就可以開始了!
Windows
在 Windows 中,R 需要一個(gè)編譯器,你可以遵循 rstan 提供的指導(dǎo):https://github.com/stan-dev/rstan/wiki/Installing-RStan-on-Windows。關(guān)鍵一步是在試圖安裝軟件包之前安裝 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 需要一個(gè)編譯器,因此你將遵循這個(gè)指導(dǎo):http://pystan.readthedocs.io/en/latest/windows.html。關(guān)鍵一步是安裝一個(gè)最新的 C++編譯器:http://landinghub.visualstudio.com/visual-cpp-build-tools
論文:Forecasting at Scale
摘要:要在各種時(shí)間序列(time series)上產(chǎn)生大量預(yù)測,我們面臨著各種各樣的挑戰(zhàn)。我們實(shí)現(xiàn)大規(guī)模預(yù)測(forecasting at scale)的方法是將可配置的模型和全面的分析師參與的(analyst-in-the-loop)性能分析結(jié)合到一起。我們提出了一種基于一種可分解模型(decomposable model)的預(yù)測方法,這種模型帶有可解釋的參數(shù),這些參數(shù)可被分析師直觀地進(jìn)行調(diào)整。我們描述了我們可以用來比較和評(píng)估預(yù)測程序的表現(xiàn)分析,并且自動(dòng)標(biāo)記了需要人工審查和調(diào)整的預(yù)測。這些能幫助分析師最有效地使用他們的專業(yè)知識(shí)工具實(shí)現(xiàn)了對(duì)許多類型業(yè)務(wù)時(shí)間序列的可靠預(yù)測。
聯(lián)系客服