Facebook Prophet 學(xué)習(xí)筆記

大趨勢 Trend

FBP識別趨勢和sparse prior息息相關(guān)(但是沒有查到相關(guān)資料)驻襟,sparse prior的強(qiáng)度changepoint_prior_scale決定了趨勢的靈活性,默認(rèn)值為0.05遮斥,增加這個值可以另模型趨勢更加擬合歷史數(shù)據(jù)层亿,通常在0.001~0.5之間

m = Prophet(changepoint_prior_scale=0.001)

FBP在識別突變點changepoint時,默認(rèn)情況下,會先指定25個可能點均勻地放在時間序列的前80%绊谭,然后只選取少數(shù)速率變化大的作為突變點,這個設(shè)置在大多數(shù)情況下都適用汪拥。如果需要达传,可以調(diào)節(jié)可能點的個數(shù)n_changepoints和范圍changepoint_range,或者手動添加突變點

m = Prophet(n_changepoints=30, changepoint_range=0.9)?

m = Prophet(changepoints=['2014-01-01'])

當(dāng)數(shù)據(jù)的周期性規(guī)律比大趨勢更突出時迫筑,可以強(qiáng)制設(shè)置趨勢平緩:

m = Prophet(growth='flat')



周期性?Seasonalities?

FBP使用傅里葉級數(shù)估算模型的季節(jié)性規(guī)律宪赶,傅里葉級數(shù)決定了季節(jié)性變化有多快。年度季節(jié)性的級數(shù)yearly_seasonality默認(rèn)值是10脯燃,適用于大部分情況搂妻,當(dāng)趨勢的季節(jié)波動頻率更高時可以調(diào)高這個值,但過高可能會導(dǎo)致過擬合

m = Prophet(yearly_seasonality=20).fit(df)

周期性的影響規(guī)模prior_scale辕棚,可以在定義時或添加自定義時調(diào)節(jié)欲主,通常在0.1~10之間:

m = Prophet()

m.add_seasonality(name='weekly', period=7, fourier_order=3, prior_scale=0.1)

周期的模式有加性和乘性可以選擇邓厕,加性周期的波動是固定的,乘性周期的波動會隨著時間增長而放大扁瓢,可以在定義時或添加自定義時調(diào)節(jié):

m = Prophet(seasonality_mode='multiplicative')

m.add_seasonality('quarterly', period=91.25, fourier_order=8, mode='additive')

m.add_regressor('regressor', mode='additive')

Specifying Custom Seasonalities 定制周期

FBP能自動為模型計算每日详恼、周度和年度的季節(jié)性規(guī)律(當(dāng)識別到模型需要時),如果需要計算每小時引几、月度和季度的季節(jié)性規(guī)律昧互,需要通過函數(shù)add_seasonality()添加

m = Prophet(weekly_seasonality=False)?

m.add_seasonality(name='monthly', period=30.5, fourier_order=5)?

forecast = m.fit(df).predict(future)

Conditional Seasonalities 條件周期

當(dāng)季節(jié)性規(guī)律需要滿足一定的觸發(fā)條件時,F(xiàn)BP提供了解決辦法伟桅。比如敞掘,某數(shù)據(jù)只有1~2月和8~12月內(nèi)具有周度季節(jié)性波動。先設(shè)置在季節(jié)內(nèi)和非季節(jié)內(nèi)的條件:

def is_nfl_season(ds):? ??

????date = pd.to_datetime(ds)? ??

????return (date.month > 8 or date.month < 2)

df['on_season'] = df['ds'].apply(is_nfl_season)

df['off_season'] = ~df['ds'].apply(is_nfl_season)

然后關(guān)閉內(nèi)置的周度季節(jié)性贿讹,隨后分別添加渐逃、預(yù)測條件內(nèi)外的周度季節(jié)性

m = Prophet(weekly_seasonality=False)

m.add_seasonality(name='weekly_on_season', period=7, fourier_order=3, condition_name='on_season')

m.add_seasonality(name='weekly_off_season', period=7, fourier_order=3, condition_name='off_season')

future['on_season'] = future['ds'].apply(is_nfl_season)

future['off_season'] = ~future['ds'].apply(is_nfl_season)

forecast = m.fit(df).predict(future)



節(jié)日 Holidays

FBP可以為模型添加節(jié)日節(jié)點,包含節(jié)日名稱holiday和日期ds民褂,還可以設(shè)定影響天數(shù)的范圍lower_window和upper_window

playoffs = pd.DataFrame({ 'holiday': 'playoff', 'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16', '2010-01-24', '2010-02-07', '2011-01-08', '2013-01-12', '2014-01-12', '2014-01-19', '2014-02-02', '2015-01-11', '2016-01-17', '2016-01-24', '2016-02-07']), 'lower_window': 0, 'upper_window': 1, })?

superbowls = pd.DataFrame({ 'holiday': 'superbowl', 'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']), 'lower_window': 0, 'upper_window': 1, })?

holidays = pd.concat((playoffs, superbowls))?

查看節(jié)日的影響:

forecast[(forecast['playoff']+forecast['superbowl']).abs()>0[['ds','playoff','superbowl']]

當(dāng)節(jié)日過擬合時茄菊,可以調(diào)節(jié)節(jié)日的影響規(guī)模holidays_prior_scale,或者在節(jié)日數(shù)據(jù)框里設(shè)置prior_scale赊堪,其默認(rèn)值為10面殖,通常在0.01~10之間:

m = Prophet(holidays=holidays, holidays_prior_scale=0.05).fit(df)



其他回歸器Additional regressors

FBP還支持為時間序列添加其他的特征,可以將其他特征合并到數(shù)據(jù)集中哭廉,然后添加函數(shù)add_regressor()實現(xiàn)脊僚,其預(yù)測趨勢圖也可以如其他規(guī)律一般被查看

m=Prophet(mcmc_samples=300,holidays=holidays_df,holidays_prior_scale=0.25,changepoint_prior_scale=0.01,seasonality_mode='multiplicative',\yearly_seasonality=10,\weekly_seasonality=True,\daily_seasonality=False)

m.add_regressor('temp',prior_scale=0.5,mode='multiplicative')

m.add_regressor('rain',prior_scale=0.5,mode='multiplicative')

m.add_regressor('sun',prior_scale=0.5,mode='multiplicative')

m.add_regressor('wind',prior_scale=0.5,mode='multiplicative')

data with regressors

注意!添加的回歸器必須是一個過去到未來都知曉/已預(yù)測出來的數(shù)據(jù)遵绰,因此辽幌,回歸器也可以是另一條時間序列,前提是這一條時間序列更加容易預(yù)測



限制增長趨勢Forecasting Growth

FBP支持對預(yù)測上下限的界定椿访。默認(rèn)情況下乌企,F(xiàn)BP使用線性增長模型,當(dāng)使用邏輯增長模型時成玫,可以設(shè)定上限cap和下限floor加酵,設(shè)定下限時必須同時設(shè)定上限

m = Prophet(growth = 'logistic')

m.fit(df)

future = m.make_future_dataframe(periods = 1826)

future['cap'] = 8.5

fcst = m.predict(future)

fig = m.plot(fcst)

上限為8.5的預(yù)測結(jié)果



評估結(jié)果 Diagnostics

FBP提供滑窗交叉驗證方法評估效果,輸入?yún)?shù)需要起始預(yù)測點initial哭当,意為從時間序列的第initial個時間起開始預(yù)測猪腕、測試效果;間隔階段period钦勘,意為每+period時間后進(jìn)行一次預(yù)測陋葡;和預(yù)測范圍horizon,意為每次預(yù)測時長為horizon長度

from fbprophet.diagnostics importcross_validation

df_cv=cross_validation(m,initial='730 days',period='180 days',horizon='365 days')

結(jié)果表查看和可視化:

df_p=performance_metrics(df_cv)

plot_cross_validation_metric(df.cv, metric='mape')



調(diào)參心得

最重要的四個參數(shù):

changepoint_prior_scale:突變點影響規(guī)模彻采,影響趨勢的靈活性脖岛。默認(rèn)值為0.05朵栖,一般建議[0.001, 0.5]。該值越大柴梆,突變點帶來的波動越大,越容易導(dǎo)致過擬合终惑;

seasonality_prior_scale:周期性影響規(guī)模绍在,決定周期的靈活性。默認(rèn)值為10雹有,一般建議?[0.01, 10]偿渡。該值越大,周期性波動越大

holidays_prior_scale:假日影響規(guī)模霸奕。默認(rèn)值為10溜宽,一般建議?[0.01, 10]。該值越大质帅,假日帶來的波動越大

seasonality_mode:周期性模式适揉。['additive','multiplicative']煤惩,默認(rèn)加性嫉嘀。當(dāng)數(shù)據(jù)取log時加性即原數(shù)據(jù)的乘性

其他:

傅里葉級數(shù):決定函數(shù)的周期性,該值越大則周期越長(存疑)

changepoint_range:突變點范圍魄揉,默認(rèn)為0.8剪侮,代表在前80%的數(shù)據(jù)里選取突變點

n_changepoints:突變點個數(shù),默認(rèn)為25洛退,代表均勻地選取25個突變點



參考自:

Trend changepoints.ipynb

Seasonality, holiday effects and regressors.ipynb

Multiplicative seasonality.ipynb

Auckland cycling and weather.ipynb

Saturating forecasts.ipynb

Diagnostics.ipynb

張戎:Facebook 時間序列預(yù)測算法 Prophet 的研究

陽望:python-fbprophet總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓣俯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兵怯,更是在濱河造成了極大的恐慌彩匕,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摇零,死亡現(xiàn)場離奇詭異推掸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)驻仅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門谅畅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人噪服,你說我怎么就攤上這事毡泻。” “怎么了粘优?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵仇味,是天一觀的道長呻顽。 經(jīng)常有香客問我,道長丹墨,這世上最難降的妖魔是什么廊遍? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮贩挣,結(jié)果婚禮上喉前,老公的妹妹穿的比我還像新娘。我一直安慰自己王财,他們只是感情好卵迂,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绒净,像睡著了一般见咒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挂疆,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天改览,我揣著相機(jī)與錄音,去河邊找鬼囱嫩。 笑死恃疯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墨闲。 我是一名探鬼主播今妄,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸳碧!你這毒婦竟也來了盾鳞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞻离,失蹤者是張志新(化名)和其女友劉穎腾仅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體套利,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡推励,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肉迫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片验辞。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖喊衫,靈堂內(nèi)的尸體忽然破棺而出跌造,到底是詐尸還是另有隱情,我是刑警寧澤族购,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布壳贪,位于F島的核電站陵珍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏违施。R本人自食惡果不足惜互纯,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醉拓。 院中可真熱鬧伟姐,春花似錦、人聲如沸亿卤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽排吴。三九已至,卻和暖如春懦鼠,著一層夾襖步出監(jiān)牢的瞬間钻哩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工肛冶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留街氢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓睦袖,卻偏偏與公主長得像珊肃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子馅笙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355