在 R 中使用 Prophet
本使用說明教程主要翻譯整理自 Prophet 的官方說明文檔
教程中使用的數據集可在 Prophet 的 github 主頁 中的 examples 文件夾 內下載得到。
Prophet 是 Facebook 推出的開源大規模預測工具,可以在 R 和 Python 中使用以預測時間序列數據。
下面將簡單介紹 Prophet 在 R 中的使用。
一、基礎介紹
下面實例中使用的是 佩頓 · 曼寧的維基百科主頁 每日訪問量的時間序列數據(2007/12/10 - 2016/01/20)。我們使用 R 中的 Wikipediatrend 包獲取該數據集。這個數據集具有多季節周期性、不斷變化的增長率和可以擬合特定日期(例如佩頓 · 曼寧的決賽和超級碗)的情況等 Prophet 適用的性質,因此可以作為一個不錯的例子。(註:佩頓 · 曼寧為前美式橄欖球四分衛)
在 R 中,Prophet 提供了一個 prophet 函數去擬合模型並且返回一個模型對象,可以對這個模型對象執行「預測」( predict )和「繪圖」( plot )操作。
使用 prophet_plot_components 函數去展示預測中的趨勢、周效應和年度效應。
註: Windows 系統語言設置為中文的話,會導致 R 輸出成分分析圖時,周效應無法正常顯示,可在 R 中使用 Sys.setlocale("LC_ALL","English") 代碼將環境改為英文。
二、預測增長
默認情況下, Prophet 使用線性模型進行預測。當預測增長情況時,通常會存在可到達的最大極限值,例如:總市場規模、總人口數等等。這被稱做承載能力,那麼預測時就應當在接近該值時趨於飽和。
Prophet 可使用 logistic 增長 趨勢模型進行預測,同時指定承載能力。下面使用 R 語言的維基百科主頁訪問量(取對數)的實例來進行說明。
三、趨勢突變點
默認情況下, Prophet 將自動監測到突變點,並對趨勢做適當地調整。
下面將會介紹幾種使用的方法可以對趨勢的調整過程做更好地控制。
1. 調整趨勢的靈活性
如果趨勢的變化被過度擬合(即過於靈活)或者擬合不足(即靈活性不夠),可以利用輸入參數 changepoint.prior.scale 來調整稀疏先驗的程度。默認下,這個參數被指定為 0.05 。
增加這個值,會導致趨勢擬合得更加靈活。如下代碼和圖所示:
減少這個值,會導致趨勢擬合得靈活性降低。如下代碼和圖所示:
2. 指定突變點的位置
如果你希望手動指定潛在突變點的位置而不是利用自動的突變點監測,可以使用 changepoints 參數。
代碼和圖如下所示:
四、節假日效應
1. 對節假日建模
如果需要專門對節假日進行建模,你就必須得為此創建一個新的數據框,其中包含兩列(節假日 holiday 和日期戳 ds ),每行分別記錄了每個出現的節假日。
你可以在這個數據框基礎上再新建兩列 lower_window 和 upper_window ,從而將節假日的時間擴展成一個區間 [ lower_window , upper_window ] 。舉例來說,如果想將平安夜也加入到 「聖誕節」 里,就設置 lower_window = -1 , upper_window = 0 ;如果想將黑色星期五加入到 「感恩節」 里,就設置 lower_window = 0 , upper_window = 1 。
下面我們創建一個數據框,其中包含了所有佩頓 · 曼寧參加過的決賽日期:
上述代碼中,我們將超級碗的日期既記錄在了決賽的日期數據框中,也記錄在了超級碗的日期數據框中。這就會造成超級碗日期的效應會在決賽日期的作用下疊加兩次。
一旦這個數據框創建好了,就可以通過傳入 holidays 參數使得在預測時考慮上節假日效應。
可通過 forecast 數據框,來展示節假日效應:
在成分分析的圖中,如下所示,也可以看到節假日效應。我們可以發現,在決賽日期附近有一個穿透,而在超級碗日期時穿透則更為明顯。
2. 對節假日和季節性設定先驗規模
如果發現節假日效應被過度擬合了,通過設置參數 holidays.prior.scale 可以調整它們的先驗規模來使之平滑,默認下該值取 10 。
和之前相比,節假日效應的規模被減弱了,特別是對觀測值較少的超級碗而言。類似的,還有一個 seasonality.prior.scale 參數可以用來調整模型對於季節性的擬合程度。
五、預測區間
在預測時,不確定性主要來源於三個部分:趨勢中的不確定性、季節效應估計中的不確定性和觀測值的雜訊影響。
1. 趨勢中的不確定性
預測中,不確定性最大的來源就在於未來趨勢改變的不確定性。Prophet 假定 「未來將會和歷史具有相似的趨勢」 。尤其重要的是,我們假定未來趨勢的平均變動頻率和幅度和我們觀測到的歷史值是一樣的,從而預測趨勢的變化並通過計算,最終得到預測區間。
這種衡量不確定性的方法具有以下性質:變化速率靈活性更大時(通過增大參數 changepoint.prior.scale 的值),預測的不確定性也會隨之增大。原因在於如果將歷史數據中更多的變化速率加入了模型,也就代表我們認為未來也會變化得更多,就會使得預測區間成為反映過擬合的標誌。
預測區間的寬度(默認下,是 80% )可以通過設置 interval.width 參數來控制:
2. 季節效應中的不確定性
默認情況下, Prophet 只會返回趨勢中的不確定性和觀測值雜訊的影響。你必須使用貝葉斯取樣的方法來得到季節效應的不確定性,可通過設置 mcmc.samples 參數(默認下取 0 )來實現。
上述代碼將最大後驗估計( MAP )取代為馬爾科夫蒙特卡洛取樣 ( MCMC ),並且將計算時間從 10 秒延長到 10 分鐘。如果做了全取樣,就能通過繪圖看到季節效應的不確定性了:
六、異常值
下面我們使用之前使用過的 R 語言維基百科主頁對數訪問量的數據來建模預測,只不過使用存在時間間隔並不完整的數據:
如上 R 輸出圖所示,趨勢預測看似合理,預測區間的估計卻過於廣泛。處理異常值最好的方法是移除它們,而 Prophet 使能夠處理缺失數據的。如果在歷史數據中某行的值為空( NA ),但是在待預測日期數據框 future 中仍保留這個日期,那麼 Prophet 依舊可以給出該行的預測值。
上述這個實例雖然影響了不確定性的估計,卻沒有影響到主要的預測值 yhat 。但是,現實往往並非如此,接下來,在上述數據集基礎上加入新的異常值後再建模預測:
這裡 2015年 6 月存在一些異常值破壞了季節效應的估計,因此未來的預測也會永久地受到這個影響。最好的解決方法就是移除這些異常值:
七、非日數據
Prophet 處理的對象並非必須是日數據,不過要是試圖通過非日數據來預測每日的情況或擬合季節性效應,往往會得到奇奇怪怪的結果。下面使用美國零售業銷售量數據來預測未來 10 年的情況:
預測結果看起來非常雜亂,原因正是在於這個特殊的數據集使用的是月數據。當我們擬合年度效應時,只有每個月第一天的數據,而且對於其他天的周期效應是不可測且過擬合的。當你使用 Prophet 擬合月度數據時,可以通過在 make_future_dataframe 中傳入頻率參數只做月度的預測。本文譯作者:Vector
推薦閱讀:
※Learn R | 機器學習中的人工神經網路(一)
※R 學習筆記:數據類型與存儲
※如何使用管道操作符優雅的書寫R語言代碼
※R語言可視化——多邊形與數據地圖填充
TAG:R编程语言 |