prophet Seasonality, Holiday Effects, And Regressors季节性,假日效应和回归
例子代碼
https://github.com/lilihongjava/prophet_demo/tree/master/seasonality_holiday_effects__regressors
一、假期和特殊事件建模
如果有假期或其他想要建模的重復(fù)事件,則必須為它們創(chuàng)建dataframe。對于dataframe,每個假期一行有兩列(holiday節(jié)假日和ds日期戳)。它必須包括所有出現(xiàn)的假期,包括過去(歷史數(shù)據(jù)),以及將來(待預(yù)測的時間)。如果假期沒出現(xiàn)在待預(yù)測的時間里,那么Prophet 不會其包含在預(yù)測中。
dataframe還可以包括lower_window和upper_window兩列,它們將假日擴展到該日期的前后[Lower_Window,Upper_Window]天。例如,如果你想在圣誕節(jié)之外加上平安夜,那么就lower_window=-1,upper_window=0這樣設(shè)置。如果你想在感恩節(jié)之外加上黑色星期五,那么就lower_window=0,upper_window=1這樣設(shè)置。還可以包含一個prior_scale?列,以便為每個假日分別設(shè)置先前的比例,如下所述。
在這里,我們創(chuàng)建一個dataframe,其中包括Peyton Manning所有季后賽出場的日期:
# Python 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))上面我們將超級碗日包括在季后賽和超級碗賽中。這意味著超級碗效應(yīng)將在季后賽效應(yīng)之外的額外疊加。
創(chuàng)建dataframe后,通過使用holidays參數(shù)傳遞假日效應(yīng),將其包含在預(yù)測中。在這里,我們使用快速入門案例中的Peyton Manning數(shù)據(jù):
# Python m = Prophet(holidays=holidays) forecast = m.fit(df).predict(future)假日效應(yīng)可以在forecast dataframe中看到:
# Python forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][['ds', 'playoff', 'superbowl']][-10:] ds playoff superbowl 2190 2014-02-02 1.224102 1.197251 2191 2014-02-03 1.912033 1.459945 2532 2015-01-11 1.224102 0.000000 2533 2015-01-12 1.912033 0.000000 2901 2016-01-17 1.224102 0.000000 2902 2016-01-18 1.912033 0.000000 2908 2016-01-24 1.224102 0.000000 2909 2016-01-25 1.912033 0.000000 2922 2016-02-07 1.224102 1.197251 2923 2016-02-08 1.912033 1.459945假期效應(yīng)也將出現(xiàn)在組件圖中,我們可以看到季后賽的幾天里有一個高峰,超級碗有一個特別大的峰值:
# Python fig = m.plot_components(forecast)假期可以使用plot_forecast_component函數(shù)(import fbprophet.plot包)繪制,就像plot_forecast_component(m, forecast, 'superbowl') 繪制超級碗假期組件一樣。
二、內(nèi)置國家假期
可以使用add_country_holidays方法設(shè)置內(nèi)置的國家/地區(qū)特定假日集合。通過country_name指定國家/地區(qū)的名稱,然后在上述holidays?參數(shù)指定的假日外,將包含該國家主要假日:
# Python m = Prophet(holidays=holidays) m.add_country_holidays(country_name='US') m.fit(df)可以通過查看模型的train_holiday_names(Python)屬性來查看包含哪些假期:
# Python m.train_holiday_names 0 playoff 1 superbowl 2 New Year's Day 3 Martin Luther King, Jr. Day 4 Washington's Birthday 5 Memorial Day 6 Independence Day 7 Labor Day 8 Columbus Day 9 Veterans Day 10 Thanksgiving 11 Christmas Day 12 Christmas Day (Observed) 13 Veterans Day (Observed) 14 Independence Day (Observed) 15 New Year's Day (Observed)每個國家的假期都由holidays包提供。可用國家/地區(qū)列表以及要使用的國家/地區(qū)名稱可在此鏈接上找到:?https://github.com/dr-prodigy/python-holidays。除了這些國家,Prophet還包括這些國家的假期:巴西(BR),印度尼西亞(ID),印度(IN),馬來西亞(MY),越南(VN),泰國(TH),菲律賓(PH),土耳其( TU),巴基斯坦(PK),孟加拉國(BD),埃及(EG),中國(CN)和俄羅斯(RU)。
在Python中,大多數(shù)假期都是確定性計算的,因此可用于任何日期范圍;?如果日期超出該國家支持的范圍,將會發(fā)出警告。在R語言中,假日日期是從1995年到2044年計算的,并存儲在 data-raw/generated_holidays.csv中。如果需要更寬的日期范圍,可以使用此腳本將該文件替換為不同的日期范圍:https://github.com/facebook/prophet/blob/master/python/scripts/generate_holidays_file.py。
如上所述,國家級假期將顯示在組件圖中:
# Python forecast = m.predict(future) fig = m.plot_components(forecast)三、季節(jié)性的傅立葉級數(shù)
使用傅里葉級數(shù)的部分和來估計季節(jié)性。有關(guān)完整的詳細(xì)信息,請參閱本文,以及維基百科上的此圖,以了解傅里葉級數(shù)的部分和如何逼近非周期信號。部分和(級數(shù))的項是一個參數(shù),用于確定季節(jié)性變化的速度。為了說明這一點,繼續(xù)使用快速入門例子中的Peyton Manning數(shù)據(jù)。每年季節(jié)性的默認(rèn)傅里葉級數(shù)為10,產(chǎn)生了這種擬合:
# Python from fbprophet.plot import plot_yearly m = Prophet().fit(df) a = plot_yearly(m)默認(rèn)值通常是合適的,但是當(dāng)季節(jié)性需要擬合更高頻率的變化時,值是可以增加,并且通常不太平滑。在實例化模型時,可以為每個內(nèi)置季節(jié)性指定傅立葉級數(shù),此處值增加到20:
# Python from fbprophet.plot import plot_yearly m = Prophet(yearly_seasonality=20).fit(df) a = plot_yearly(m)增加傅里葉項的數(shù)量可以使季節(jié)性擬合更快的變化周期,但也可能導(dǎo)致過度擬合:N個傅里葉項對應(yīng)于用于建模周期的2N變量
四、指定自定義季節(jié)性
如果時間序列長度超過兩個周期,Prophet將默認(rèn)擬合每周和每年的季節(jié)性。對于每日一次的時間序列,將擬合每日季節(jié)性??梢允褂胊dd_seasonality方法添加其他季節(jié)性(每月,每季度,每小時)。
此函數(shù)的輸入是名稱,季節(jié)性的周期,以及季節(jié)性的傅里葉級數(shù)。作為參考,默認(rèn)情況下,Prophet對于每周季節(jié)性的傅立葉級數(shù)為3,每年季節(jié)性使用10次??蛇x輸入add_seasonality為季節(jié)性組件的先驗scale - 這將在下面討論。
作為一個例子,這里我們擬合來自快速入門例子的Peyton Manning數(shù)據(jù),但用每月季節(jié)性取代每周季節(jié)性。月度季節(jié)性將出現(xiàn)在組件圖中:
# Python m = Prophet(weekly_seasonality=False) m.add_seasonality(name='monthly', period=30.5, fourier_order=5) forecast = m.fit(df).predict(future) fig = m.plot_components(forecast)五、季節(jié)性其他因素
在某些情況下,季節(jié)性可能取決于其他因素,例如每周季節(jié)性模式,在夏季是不同于一年中其余時間,或者每日季節(jié)性模式,在周末是不同于工作日。這些類型的季節(jié)性可以使用條件季節(jié)性來建模。
使用快速入門中的Peyton Manning的數(shù)據(jù)。默認(rèn)的每周季節(jié)性假設(shè)每周季節(jié)性的模式在全年都是相同的,但我們希望每個季節(jié)性的模式在賽季(每個星期天有比賽時)和休賽期間是不同的。我們可以使用有條件的季節(jié)性來構(gòu)建單獨的賽季和休賽季的每周季節(jié)性。
首先,我們在dataframe中添加一個布爾列,指定每個日期是在賽季還是休賽季:
# Python 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)然后我們禁用內(nèi)置的每周季節(jié)性,并將其替換為將這些列指定為條件的兩個每周季節(jié)性。這意味著季節(jié)性僅適用于condition_name列為True的日期。還必須將這個列添加到我們正在進(jìn)行預(yù)測的future dataframe中。
# Python 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) fig = m.plot_components(forecast)現(xiàn)在,兩個季節(jié)都出現(xiàn)在上面的組成圖中。我們可以看到,在每個星期天進(jìn)行比賽的賽季期間,周日和周一有大幅增加,而在休賽期完全沒有。
六、節(jié)假日和季節(jié)性的先驗scale
如果發(fā)現(xiàn)假期過度擬合,可以使用holidays_prior_scale參數(shù)調(diào)整先驗scale以使之平滑。默認(rèn)情況下,此參數(shù)為10,這提供了很少的正則化。減少此參數(shù)會抑制假日效應(yīng):
# Python m = Prophet(holidays=holidays, holidays_prior_scale=0.05).fit(df) forecast = m.predict(future) forecast[(forecast['playoff'] + forecast['superbowl']).abs() > 0][['ds', 'playoff', 'superbowl']][-10:] ds playoff superbowl 2190 2014-02-02 1.205038 0.969811 2191 2014-02-03 1.854391 0.986626 2532 2015-01-11 1.205038 0.000000 2533 2015-01-12 1.854391 0.000000 2901 2016-01-17 1.205038 0.000000 2902 2016-01-18 1.854391 0.000000 2908 2016-01-24 1.205038 0.000000 2909 2016-01-25 1.854391 0.000000 2922 2016-02-07 1.205038 0.969811 2923 2016-02-08 1.854391 0.986626和以前相比,假日效應(yīng)的幅度減小了,特別是對于觀察量最少的超級碗。有一個參數(shù)seasonality_prior_scale可以類似地調(diào)整季節(jié)性模型擬合數(shù)據(jù)的程度。
可以在假期的dataframe中包含一列prior_scale來設(shè)置先驗scales。季節(jié)性的先驗scales可以作為參數(shù)傳遞給add_seasonality。例如,可以使用以下方式設(shè)置每周季節(jié)性的先驗scales:
# Python m = Prophet() m.add_seasonality(name='weekly', period=7, fourier_order=3, prior_scale=0.1)七、額外回歸量
可以使用add_regressor方法或函數(shù)將額外回歸量添加到模型的線性部分。具有回歸量值的列都需要存在于擬合和預(yù)測dataframe中。例如,我們可以在NFL賽季期間為周日增加額外的影響。在組件圖上,此效果將顯示在“extra_regressors”圖中:
# Python def nfl_sunday(ds):date = pd.to_datetime(ds)if date.weekday() == 6 and (date.month > 8 or date.month < 2):return 1else:return 0 df['nfl_sunday'] = df['ds'].apply(nfl_sunday)m = Prophet() m.add_regressor('nfl_sunday') m.fit(df)future['nfl_sunday'] = future['ds'].apply(nfl_sunday)forecast = m.predict(future) fig = m.plot_components(forecast)通過創(chuàng)建過去和未來nfl_sunday的list,也可以使用上述“holidays”來處理nfl_sunday。add_regressor函數(shù)提供了更通用的接口,用于定義額外的線性回歸量,特別是不要求回歸量是二進(jìn)制指示符。另一個時間序列可以用作回歸量,盡管它的未來值必須是已知的。
此jupyter代碼展示了一個使用天氣因素作為預(yù)測自行車使用的額外回歸量的示例,并提供了如何將其他時間序列作為額外回歸量包含在內(nèi)的很好的說明。
add_regressor函數(shù)有指定先驗scale的可選參數(shù)(默認(rèn)情況下使用假日先驗scale)以及參數(shù)回歸量是否標(biāo)準(zhǔn)化 - 請參閱help(Prophet.add_regressor)查看相關(guān)參數(shù) 。請注意,必須在擬合模型之前添加回歸量。
額外的回歸量必須知道歷史和未來的日期。因此,它必須是具有已知未來值(例如nfl_sunday),或者在其他地方單獨預(yù)測過的結(jié)果。如果回歸量在整個歷史數(shù)據(jù)中保持不變,Prophet也會引起錯誤,因為沒有任何東西可以擬合它。
額外的回歸量被置于模型的線性分量中,因此底層模型是時間序列依賴于額外回歸量作為加法或乘法因子(參見下一節(jié)的乘法季節(jié)性?)。
?
參考資料:
https://facebook.github.io/prophet/docs/seasonality,_holiday_effects,_and_regressors.html
總結(jié)
以上是生活随笔為你收集整理的prophet Seasonality, Holiday Effects, And Regressors季节性,假日效应和回归的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【实战】如何有效的进行测试用例评审(测试
- 下一篇: 推荐两款可以将图片无损放大的在线工具