時(shí)間序列(time series)系列2—Prophet

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 采取類似 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ù)名稱
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)行分解??梢钥吹秸w的trend,數(shù)據(jù)在每周,每天的變化情況,以及節(jié)假日的影響等。


在這里插入圖片描述

預(yù)測(cè)結(jié)果如下:ds為時(shí)間,trend為預(yù)測(cè),yhat_lower,yhat_upper為置信區(qū)間。


預(yù)測(cè)結(jié)果
#計(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.有多種人類規(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)含的非線性增長(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è)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容