預(yù)計閱讀時間:8min
閱讀建議:本文為Prophet代碼實現(xiàn)篇
01
如何安裝Prophet
首先,要安裝包,fbprophet包依賴于pystan。由于包的安裝有很多依賴,因此強(qiáng)烈建議用conda裝。
conda install pystan
pip install fbprophet
02
導(dǎo)入數(shù)據(jù)SIMPLE TITLE
在碼代碼之前,要先引入pandas、numpy、matplotlib等常規(guī)數(shù)據(jù)科學(xué)庫,以及主角fbprophet。由于文件是通過excel存儲的,因此還需先將excel導(dǎo)入,日期變更為date類型,并且將字段命名為“ds”和“y”(Prophet默認(rèn)應(yīng)用這兩個字段)。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet
data = pd.read_excel('./xxx.xlsx')
data['date'] = pd.to_datetime(data['date'], format='%Y%m%d')
data = data.rename(columns = {'date':'ds', 'y':'y'})[['ds','y']]
data.head(5) #查看前五條記錄
data.tail(5) #查看后五條記錄
導(dǎo)入數(shù)據(jù)前后五條記錄
03
繪制原始趨勢圖
在模型搭建之前,需要先對數(shù)據(jù)歷史趨勢有一個宏觀了解,繪制數(shù)據(jù)趨勢圖。
import plotly.express as px
fig = px.line(data, x='date', y='y')
fig.show()
數(shù)據(jù)歷史趨勢圖
04
模型訓(xùn)練
Prophet的模型訓(xùn)練及預(yù)測,類似Sklearn的方法,訓(xùn)練fit()、預(yù)測predict()。這里由于我們了解數(shù)據(jù)的變動會受到季節(jié)、周、天的影響,存在一定的規(guī)律性,因此我們將這三個參數(shù)設(shè)置成True,并且采用中國的假期模式,其余參數(shù)均保持默認(rèn),代碼如下:
model = Prophet(yearly_seasonality=True, weekly_seasonality=True, daily_seasonality=True)
model.add_country_holidays(country_name='CN')
model.fit(data)
Prophet參數(shù)及默認(rèn)值介紹,內(nèi)容理論可參考「原理篇」:
· growth:趨勢函數(shù)設(shè)置,默認(rèn)線性“l(fā)inear”,可選非線性“l(fā)ogistic”。
· changepoints:選擇突變點,默認(rèn)自動選擇“None”。例如:雙十一訂單突增,指定突變點。
· n_changepoints:突變點個數(shù),默認(rèn)“25個”。如果changepoints指定,則這個參數(shù)就廢棄了;如果changepoints沒指定,則會從輸入的歷史數(shù)據(jù)前80%中自動選取25個突變點。
· changepoint_range:突變點數(shù)據(jù)范圍,默認(rèn)“80%”。同樣,如果changepoints指定,則這個參數(shù)就廢棄了。
· changepoint_prior_scale: 調(diào)節(jié)“changepoints”發(fā)現(xiàn)強(qiáng)度,默認(rèn)“0.05”。值越大對歷史數(shù)據(jù)擬合程度越強(qiáng),但會增加過擬合的風(fēng)險。
· yearly_seasonality: 數(shù)據(jù)是否有年季節(jié)性,默認(rèn)“自動檢測”。
· weekly_seasonality: 數(shù)據(jù)是否有周季節(jié)性,默認(rèn)“自動檢測”。
· daily_seasonality: 數(shù)據(jù)是否有天季節(jié)性,默認(rèn)“自動檢測”。
· holidays:指定節(jié)假日,默認(rèn)“None”,支持手動輸入指定節(jié)假日。以DataFrame格式輸入,涵蓋:必須列【holiday(string)、ds(date)】、可選列【lower_window(int)、upper_window(int),指定影響的前后窗口期】。
· seasonality_mode: 季節(jié)性效應(yīng)模式,默認(rèn)加法模式“additive”,可選“multiplicative”乘法模式。
· seasonality_prior_scale: 調(diào)節(jié)季節(jié)性效應(yīng)模式強(qiáng)度,默認(rèn)“10”。值越大,季節(jié)性對模型影響越大。
· holidays_prior_scale: 調(diào)節(jié)節(jié)假日模式強(qiáng)度,默認(rèn)“10”。值越大,節(jié)假日對模型影響越大。
05
模型預(yù)測
模型預(yù)測輸出預(yù)測值、預(yù)測上限、預(yù)測下限等字段。
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
06
繪制分解圖
模型提供預(yù)測輸出的可視化展示,通過fbprophet自帶的可視化組件完成。
from fbprophet.plot import plot_plotly, plot_components_plotly
fig1 = model.plot(forecast)
fig1.savefig('temp1.png')
預(yù)測可視化輸出
同時支持趨勢模型、周期模型、節(jié)假日模型的解耦。
fig2 = model.plot_components(forecast)
fig2.savefig('temp2.png')
預(yù)測解耦可視化輸出
07
模型評估
評估模型的準(zhǔn)確程度,通過RMSE(均方根誤差)來度量y與y_predict的差異程度,值越小,擬合越好。
train_len = len(data['y'])
rmse = np.sqrt(sum((data['y'] - forecast['yhat'].head(train_len)) ** 2) / train_len)
print('RMSE Error in forecasts = {}'.format(round(rmse, 2)))
RMSE值輸出
08
模型存儲
以上流程實現(xiàn)了Prophet模型搭建,但考慮到未來我們還要復(fù)用通過此歷史數(shù)據(jù)訓(xùn)練的模型,因此我們要將模型存儲到本地,并在需要的時候?qū)⑵鋵?dǎo)入。
# 模型保存
with open('prophet_model.json', 'w') as md:
json.dump(model_to_json(model), md)
# 模型讀取
with open('prophet_model.json', 'r') as md:
model = model_from_json(json.load(md))
09
經(jīng)驗建議
Prophet對缺失值友好,但對異常值敏感。異常值可設(shè)置成None,防止影響模型的擬合。
模型默認(rèn)線性趨勢,但如果數(shù)據(jù)按照log方式增長的,可調(diào)節(jié)為growth=”logistic”邏輯回歸模型。
當(dāng)我們預(yù)先知道某天會影響數(shù)據(jù)的整體走勢,可以提前將此天設(shè)置成轉(zhuǎn)折點(changepoint)。
在設(shè)定周期性時,模型默認(rèn)按照年、星期、天設(shè)定,月和小時如需要自行設(shè)定。
針對節(jié)假日,可通過holiday來進(jìn)行調(diào)節(jié),針對不同的假期,可調(diào)整不同的前后窗口期,例如:春節(jié)7日,但是春運影響近30日。
聯(lián)系客服