Facebook 開源 Python 預(yù)測工具,用起來太方便了
點擊“凹凸域”,馬上關(guān)注
更多內(nèi)容、請星標(biāo)

文 | 標(biāo)點符??出處 | biaodianfu.com
Prophet是Facebook開源的預(yù)測工具,相比ARIMA模型,Prophet真的是非常的簡單。只要讀入兩列數(shù)據(jù)即可完成預(yù)測。且在某些環(huán)境下預(yù)測的準(zhǔn)確性不輸ARIMA。Prophet提供了R語言版本和Python版本,這里主要講解的是Python版本。更多信息可產(chǎn)看官方鏈接。
Prophet的安裝
fbprophet為Prophet在Python環(huán)境下的包,想要使用fbprohhet并沒有想象中的那么簡單,特別是在Windows系統(tǒng)上可能發(fā)生錯誤。主要原因是fbprophet基于pystan,pystan基于cython。問題會卡在pystan的安裝上。
即正確的安裝流程為:
pip install cython
pip install pystan
pip install fbprophet
在安裝pystan時會報如下錯誤:WARNING:pystan:MSVC compiler is not supported 。具體原因可在官方說明中找到:
PyStan is partially supported under Windows with the following caveats:
Python 2.7: Doesn’t support parallel sampling. When drawing samples n_jobs=1 must be used)
Python 3.5 or higher: Parallel sampling is supported
MSVC compiler is not supported.
PyStan requires a working C++ compiler. Configuring such a compiler is typically the most challenging step in getting PyStan running.
PyStan is tested against the MingW-w64 compiler which works on both Python versions (2.7, 3.x) and supports x86 and x64.
Due to problems with MSVC template deduction, functions with Eigen library are failing. Until this and other bugs are fixed no support is provided for Windows + MSVC. Currently, no fix is known for this problem, other than to change the compiler to GCC or clang-cl.
解決方案為:將Python編譯環(huán)境更改為MingW-w64。
下載MingW-w64,并進(jìn)行安裝,下載地址:https://osdn.net/projects/mingw/releases/
將mingw的路徑添加到環(huán)境變量的PATH中,示例路徑:C:\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin
驗證編譯環(huán)境是否OK,驗證方式為在cmd中執(zhí)行如下命名 gcc –dumpversion、ld –v、dllwrap –version
修改Python內(nèi)部編譯設(shè)置,方法為在Python安裝目錄下(示例:C:\Python36\Lib\distutils),新建distutils.cfg文件,文件內(nèi)容為
[build]
?compiler = mingw32
完后后再執(zhí)行安裝即可。如果是Anaconda環(huán)境,除了上述步驟外,還需執(zhí)行:
conda update conda
conda install libpython m2w64-toolchain -c msys2
Prophet的使用
數(shù)據(jù)集:https://pan.baidu.com/s/1Pw8ZSQgD8vLJjiQUhIJv_A 提取碼: taav
import pandas as pd
from fbprophet importProphet
import matplotlib.pyplot as plt
data = pd.read_csv('AirPassengers.csv', parse_dates=['Month'])
print(data.head())
MonthAirPassengers
01949-01-01112
11949-02-01118
21949-03-01132
31949-04-01129
41949-05-01121
Prophet 的輸入量必須包含兩列的數(shù)據(jù)框:ds 和 y 。ds 列為時間格式。y 列必須是數(shù)值變量,表示我們希望去預(yù)測的量。屬于拿到數(shù)據(jù)后需要修改列名:
data = data.rename(columns={'Month': 'ds', 'AirPassengers': 'y'})
print(data.head())
ds y
01949-01-01112
11949-02-01118
21949-03-01132
31949-04-01129
41949-05-01121
觀察數(shù)據(jù):
ax = data.set_index('ds').plot(figsize=(12, 6))
ax.set_ylabel('Monthly Number of Airline Passengers')
ax.set_xlabel('Date')
plt.show()

Prophet 遵循 sklearn 庫建模的應(yīng)用程序接口。我們創(chuàng)建了一個 Prophet 類的實例,其中使用了“擬合模型” fit 和“預(yù)測” predict 方法。默認(rèn)情況下, Prophet 的返回結(jié)果中會包括預(yù)測值 yhat 的預(yù)測區(qū)間。當(dāng)然,預(yù)測區(qū)間的估計需建立在一些重要的假設(shè)前提下。在預(yù)測時,不確定性主要來源于三個部分:趨勢中的不確定性、季節(jié)效應(yīng)估計中的不確定性和觀測值的噪聲影響。
趨勢中的不確定性
預(yù)測中,不確定性最大的來源就在于未來趨勢改變的不確定性。在之前教程中的時間序列實例中,我們可以發(fā)現(xiàn)歷史數(shù)據(jù)具有明顯的趨勢性。Prophet 能夠監(jiān)測并去擬合它,但是我們期望得到的趨勢改變究竟會如何走向呢?或許這是無解的,因此我們盡可能地做出最合理的推斷,假定 “未來將會和歷史具有相似的趨勢” 。
尤其重要的是,我們假定未來趨勢的平均變動頻率和幅度和我們觀測到的歷史值是一樣的,從而預(yù)測趨勢的變化并通過計算,最終得到預(yù)測區(qū)間。這種衡量不確定性的方法具有以下性質(zhì):變化速率靈活性更大時,預(yù)測的不確定性也會隨之增大。原因在于如果將歷史數(shù)據(jù)中更多的變化速率加入了模型,也就代表我們認(rèn)為未來也會變化得更多,就會使得預(yù)測區(qū)間成為反映過擬合的標(biāo)志。預(yù)測區(qū)間的寬度(默認(rèn)下,是 80% )可以通過設(shè)置 interval_width 參數(shù)來控制:
my_model = Prophet(interval_width=0.95) #設(shè)置置信空間為95%(如果不設(shè)置的話默認(rèn)80%)
my_model.fit(data)
由于預(yù)測區(qū)間估計時假定未來將會和過去保持一樣的變化頻率和幅度,而這個假定可能并不正確,所以預(yù)測區(qū)間的估計不可能完全準(zhǔn)確。
季節(jié)效應(yīng)估計中的不確定性
默認(rèn)情況下, Prophet 只會返回趨勢中的不確定性和觀測值噪聲的影響。你必須使用貝葉斯取樣的方法來得到季節(jié)效應(yīng)的不確定性,可通過設(shè)置 mcmc.samples 參數(shù)(默認(rèn)下取 0 )來實現(xiàn)。
my_model = Prophet(interval_width=0.95, mcmc_samples=500) #設(shè)置置信空間為95%(如果不設(shè)置的話默認(rèn)80%)
my_model.fit(data)
上述代碼將最大后驗估計(MAP)取代為馬爾科夫蒙特卡洛取樣(MCMC)。執(zhí)行后可通過繪圖的方式直觀的觀測到季節(jié)效應(yīng)的不確定性。
觀測值的噪聲影響
處理異常值最好的方法是移除它們,而 Prophet 使能夠處理缺失數(shù)據(jù)的。如果在歷史數(shù)據(jù)中某行的值為空(NA),但是在待預(yù)測日期數(shù)據(jù)框 future 中仍保留這個日期,那么 Prophet 依舊可以給出該行的預(yù)測值。
預(yù)測將會建立在一列包含日期 ds 的數(shù)據(jù)框基礎(chǔ)上來預(yù)測指定日期的數(shù)據(jù)。make_future_dataframe 函數(shù)使用模型對象和一段待預(yù)測的時期去構(gòu)建一個相應(yīng)的包含待預(yù)測日期的數(shù)據(jù)框。默認(rèn)情況下,該函數(shù)將會自動包含歷史數(shù)據(jù)的日期,因此可用來分析訓(xùn)練集的擬合效果。
future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
print(future_dates.head())
ds
01949-01-01
11949-02-01
21949-03-01
31949-04-01
41949-05-01
在Prophet中使用通用的 predict 函數(shù)來預(yù)測數(shù)據(jù)。預(yù)測結(jié)果 forecast 對象是包含了預(yù)測值 yhat 的數(shù)據(jù)框,此外,還有其余的列用來儲存估計的置信區(qū)間和季節(jié)因子。
forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
ds yhat yhat_lower yhat_upper
1751963-08-01659.473243592.176200726.973325
1761963-09-01613.132606542.378855677.590035
1771963-10-01576.340290505.417141642.690391
1781963-11-01545.832790478.427462610.037598
1791963-12-01575.599488501.734482649.450637
查看預(yù)測效果:my_model.plot(forecast, uncertainty\=True)

查看分解效果:my_model.plot_components(forecast)

更多參考:https://facebook.github.io/prophet/
原文:https://www.biaodianfu.com/fbprophet.htm
—?END?—
想要了解更多資訊
點這里??關(guān)注我,記得標(biāo)星呀~
想要了解更多資訊,請掃描上方二維碼,關(guān)注機(jī)器學(xué)習(xí)研究
