Facebook Prophet 學習筆記

大趨勢 Trend

FBP識別趨勢和sparse prior息息相關(但是沒有查到相關資料),sparse prior的強度changepoint_prior_scale決定了趨勢的靈活性,默認值為0.05,增加這個值可以另模型趨勢更加擬合歷史數據,通常在0.001~0.5之間

m = Prophet(changepoint_prior_scale=0.001)

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

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

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

當數據的周期性規(guī)律比大趨勢更突出時,可以強制設置趨勢平緩:

m = Prophet(growth='flat')



周期性?Seasonalities?

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

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

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

m = Prophet()

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

周期的模式有加性和乘性可以選擇,加性周期的波動是固定的,乘性周期的波動會隨著時間增長而放大,可以在定義時或添加自定義時調節(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ī)律(當識別到模型需要時),如果需要計算每小時、月度和季度的季節(jié)性規(guī)律,需要通過函數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 條件周期

當季節(jié)性規(guī)律需要滿足一定的觸發(fā)條件時,FBP提供了解決辦法。比如,某數據只有1~2月和8~12月內具有周度季節(jié)性波動。先設置在季節(jié)內和非季節(jié)內的條件:

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)

然后關閉內置的周度季節(jié)性,隨后分別添加、預測條件內外的周度季節(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,還可以設定影響天數的范圍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']]

當節(jié)日過擬合時,可以調節(jié)節(jié)日的影響規(guī)模holidays_prior_scale,或者在節(jié)日數據框里設置prior_scale,其默認值為10,通常在0.01~10之間:

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



其他回歸器Additional regressors

FBP還支持為時間序列添加其他的特征,可以將其他特征合并到數據集中,然后添加函數add_regressor()實現,其預測趨勢圖也可以如其他規(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

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



限制增長趨勢Forecasting Growth

FBP支持對預測上下限的界定。默認情況下,FBP使用線性增長模型,當使用邏輯增長模型時,可以設定上限cap和下限floor,設定下限時必須同時設定上限

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的預測結果



評估結果 Diagnostics

FBP提供滑窗交叉驗證方法評估效果,輸入參數需要起始預測點initial,意為從時間序列的第initial個時間起開始預測、測試效果;間隔階段period,意為每+period時間后進行一次預測;和預測范圍horizon,意為每次預測時長為horizon長度

from fbprophet.diagnostics importcross_validation

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

結果表查看和可視化:

df_p=performance_metrics(df_cv)

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



調參心得

最重要的四個參數:

changepoint_prior_scale:突變點影響規(guī)模,影響趨勢的靈活性。默認值為0.05,一般建議[0.001, 0.5]。該值越大,突變點帶來的波動越大,越容易導致過擬合;

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

holidays_prior_scale:假日影響規(guī)模。默認值為10,一般建議?[0.01, 10]。該值越大,假日帶來的波動越大

seasonality_mode:周期性模式。['additive','multiplicative'],默認加性。當數據取log時加性即原數據的乘性

其他:

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

changepoint_range:突變點范圍,默認為0.8,代表在前80%的數據里選取突變點

n_changepoints:突變點個數,默認為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 時間序列預測算法 Prophet 的研究

陽望:python-fbprophet總結

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容