1.Prophet簡(jiǎn)介
Prophet是Facebook開(kāi)源的一個(gè)關(guān)于時(shí)間序列的框架营勤。Prophet功能完善旁舰,既可以做未來(lái)預(yù)測(cè)而线,也可以填補(bǔ)缺失值铭污,并且可以檢測(cè)異常恋日。
Prophet的整體框架,整個(gè)過(guò)程分為四部分:Modeling嘹狞、Forecast Evaluation岂膳、Surface Problems以及Visually Inspect Forecasts
- a.Modeling:建立時(shí)間序列模型。分析師根據(jù)預(yù)測(cè)問(wèn)題的背景選擇一個(gè)合適的模型磅网。
- b.Forecast Evaluation:模型評(píng)估谈截。根據(jù)模型對(duì)歷史數(shù)據(jù)進(jìn)行仿真,在模型的參數(shù)不確定的情況下涧偷,我們可以進(jìn)行多種嘗試簸喂,并根據(jù)對(duì)應(yīng)的仿真效果評(píng)估哪種模型更適合。
- c.Surface Problems:呈現(xiàn)問(wèn)題燎潮。如果嘗試了多種參數(shù)后喻鳄,模型的整體表現(xiàn)依然不理想,這個(gè)時(shí)候可以將誤差較大的潛在原因呈現(xiàn)給分析師确封。
- d.Visually Inspect Forecasts:以可視化的方式反饋整個(gè)預(yù)測(cè)結(jié)果除呵。當(dāng)問(wèn)題反饋給分析師后,分析師考慮是否進(jìn)一步調(diào)整和構(gòu)建模型爪喘。
2.Prophet流程
Prophet 采取類(lèi)似 Sklearn 模式的 API竿奏,先創(chuàng)建一個(gè)Prophet的實(shí)例,然后調(diào)用它的 fit 和 predict 方法腥放。
輸入是一個(gè)DataFrame泛啸,必須包含這兩列:ds 和 y。ds 必須是一個(gè) date 或者 datetime秃症。y 必須是數(shù)字候址,代表我們需要預(yù)測(cè)的序列的值。構(gòu)造效果如下:
index | ds | y |
---|---|---|
0 | 2000-01-01 | 1 |
1 | 2000-01-03 | 2 |
2 | 2000-01-04 | 3 |
... | ... | ... |
然后在代入prophet模型進(jìn)行擬合种柑,最后預(yù)測(cè)岗仑。因?yàn)槟P褪褂梅绞奖容^簡(jiǎn)單,直接附上代碼聚请。
原始data:數(shù)據(jù)如下荠雕,5min粒度
import pandas as pd
import numpy as np
from fbprophet import Prophet
import matplotlib.pyplot as plt
#配置matplotlib
plt.rcParams['figure.figsize'] = (20, 10)
plt.style.use('ggplot')
df = pd.read_csv("../data.csv")
dataf = df[0:len(df)-1*288]#取前面為訓(xùn)練數(shù)據(jù),后288個(gè)為測(cè)試數(shù)據(jù)
#按照prophet格式更改數(shù)據(jù)名稱(chēng)
df = df.rename(columns={"sump":"y", "time":"ds"})
Prophet可以添加特殊的額外因素驶赏,不如國(guó)慶節(jié)等炸卑。
#設(shè)定特殊節(jié)假日
special_days = pd.DataFrame({
'holiday': 'big_date',
'ds': pd.to_datetime(['2018-10-01', '2018-10-02', '2018-10-03',
'2018-10-04', '2018-10-05', '2018-10-06', '2018-10-07']),
'lower_window': 0,
'upper_window': 1,
})
normal_days = pd.DataFrame({
"holiday":"small_date",
"ds":pd.to_datetime(["2018-10-13","2018-10-14", "2018-10-20",
"2018-10-21","2018-10-27","2018-10-28","2018-11-03","2018-11-04" ]),
"lower_window":-1,
"upper_window":0,
})
holidays = special_days
#prophet擬合
model = Prophet(holidays= holidays)
model.fit(dataf)
#預(yù)測(cè)后288個(gè)數(shù)據(jù)
future = model.make_future_dataframe(periods = 288, freq = "5min")
forecast = model.predict(future)
forecast.tail()#顯示預(yù)測(cè)結(jié)果
model.plot(forecast)
model.plot_components(forecast)
Prophet能很好的將數(shù)據(jù)的特性進(jìn)行分解∶喊可以看到整體的trend盖文,數(shù)據(jù)在每周,每天的變化情況蚯姆,以及節(jié)假日的影響等五续。
預(yù)測(cè)結(jié)果如下:ds為時(shí)間洒敏,trend為預(yù)測(cè),yhat_lower,yhat_upper為置信區(qū)間疙驾。
#計(jì)算error
def mean_absolute_percentage_error(y_true, y_pred):
return np.mean(np.abs((y_true - y_pred) / y_true)) * 100
error = mean_absolute_percentage_error(df.y[-288*1:].values,
forecast.yhat[-288*1:].values)
print(error)
預(yù)測(cè)值與真實(shí)值對(duì)比
#預(yù)測(cè)與真實(shí)對(duì)比顯示
plt.figure(figsize = (16,6))
plt.plot(forecast.yhat[-288*1:].reset_index())#預(yù)測(cè)
plt.plot(df.y[-288*1:].reset_index())#真實(shí)
plt.plot(forecast.yhat_lower[-288*1:].reset_index())#預(yù)測(cè)下限
plt.plot(forecast.yhat_upper[-288*1:].reset_index())#預(yù)測(cè)上限
3.學(xué)習(xí)資料
不同時(shí)間序列預(yù)測(cè)問(wèn)題的解決方案也各有不用凶伙。Prophet適用于有如下特征的業(yè)務(wù)問(wèn)題:
a.有至少幾個(gè)月(最好是一年)的每小時(shí)、每天或每周觀察的歷史數(shù)據(jù)它碎;
b.有多種人類(lèi)規(guī)模級(jí)別的較強(qiáng)的季節(jié)性趨勢(shì):每周的一些天和每年的一些時(shí)間镊靴;
c.有事先知道的以不定期的間隔發(fā)生的重要節(jié)假日(比如國(guó)慶節(jié));
d.缺失的歷史數(shù)據(jù)或較大的異常數(shù)據(jù)的數(shù)量在合理范圍內(nèi)链韭;
e.有歷史趨勢(shì)的變化(比如因?yàn)楫a(chǎn)品發(fā)布)偏竟;
f.對(duì)于數(shù)據(jù)中蘊(yùn)含的非線(xiàn)性增長(zhǎng)的趨勢(shì)都有一個(gè)自然極限或飽和狀態(tài)。
上述內(nèi)容敞峭,只是大概敘述了Prophte的使用踊谋,沒(méi)有特別具體的函數(shù)等內(nèi)容。下面提供一些鏈接旋讹,有助于大家深入了解Prophet殖蚕。
Prophet簡(jiǎn)介及示例
Seasonality, Holiday Effects, And Regressors | Prophet
Forecasting Time Series data with Prophet - Jupyter Notebook - Python Data
基于Prophet的時(shí)間序列預(yù)測(cè)