【時間序列預測】使用 Facebook Prophet 開源套件構建單變量時間序列預測模型
Time Series Prediction 時間序列預測套件介紹:Prophet 安裝與應用 101
認識 Prophet
Prophet 是一個由 Facebook Core Data Science Team 發表的開源代碼庫,用於時間序列預測,基於 Python 和 R 語言。相較於自行訓練時間序列預測模型,Prophet 的一些優點如下:
- 改善模型選擇和調參的時間成本:時間序列有許多經典算法如 AR, VAR, ARMA, ARIMA, 指數平滑法等,選擇模型和調參的過程可被自動化。
- 提供讓分析師、領域專家能根據經驗法則設定的參數:例如歷史週期、特殊節日的日期等,不會因為寫成制式套件就失去自己手刻的好處。
其實英文版有不少 use cases,不過在安裝套件上只有官方文件的說明,如果對 conda
虛擬環境、套件管理不太熟悉可能會踩不少雷,因此這邊我把安裝重點步驟寫下來。
安裝步驟
(0) 首先建議要用 conda
創建虛擬環境,避免不同套件版本產生不必要的衝突
(base) $ conda create -n env_name python=3.7(base) $ conda activate env_name(env_name) $
Mac OS
(1) 依照官方文件,由於 Prophet
程式庫中用到一個進行 Bayesian inference 的套件名為 pystan
,本身需要使用 C++ compiler 來運行,支援的有 gcc
及 clang
。
關於編譯器的比較:GCC, LLVM & CLANG,請參見相關文章
Mac OS 預設的編譯器是 clang
,檢查一下版本基本上就沒問題。
(env_name) $ clang --versionApple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Windows
而 Windows 的預設編譯器是 MSVC
,pystan
並不支援,因此需要額外安裝 Windows 版本的 gcc:mingw-w64 compiler
關於 mingw-w64 compiler 具體安裝了哪些東西,請看官方文件說明,這裡就不贅述
(env_name) $ conda install libpython m2w64-toolchain -c msys2
(2) 確認都有安裝好支援的 c++ compiler 後,記得先安裝 pystan
。以下都建議使用 conda install,不要用 pip install,虛擬環境下的 jupyter notebook 可能會 import 不到。
(env_name) $ conda install -c pystan conda-forge
(3) 接著安裝 prophet
(注意:v1.0 後的版本套件名稱為 prophet,不再是 fbprophet,網路上很多教學文章還以舊稱,記得在 import 時調整即可)
(env_name) $ conda install -c prophet conda-forge
(4) 完成後確認版本號
import prophet
print(prophet.__version__)> 1.0
單變量時間序列預測
本篇先以單變量時間序列預測為範例,相同資料集也在 Machine Learning Mastery 上也有教學。下一篇會實作一個多變量時間序列的案例來介紹 Prophet 的功能。
簡單版範例的完整代碼
預測結果
yhat
是預測值,yhat_upper
及 yhat_lower
是預測值的上下界。除此之外還有代表趨勢變化、週期性及其他泛化線性模型的參數。Prophet 其實是將多個時間序列預測的線性與非線性模型整合成一個泛化線性模型(Generalized Additive Model, GAM),以至於他能夠涵蓋了trend, seasonality, holidays & idiosyncratic changes 等時間序列的重要特徵在模型中。
預測分佈圖
黑點是資料集中的實際值,藍線是模型的預測值,藍底範圍則是模型估計的 95% 信賴區間,也就是模型有信心 95% 的實際值會落在此範圍。
參考資料:
- 支援 Python 與 R 語言!Facebook 開源大規模預測工具「Prophet」(Prophet 其實 2017 年就發表了,但中文教程較少)
- PyStan Documentation
- Prophet Github
- The Math of Prophet