當前位置:成語大全網 - 新華字典 - Greykite模型的優化調參

Greykite模型的優化調參

這是創建和調整預測模型的基礎教程。旨在為0基礎的用戶提供壹些基本sense。

妳可以使用 PROPHET 或 SILVERKITE 模型,本文註重介紹 SILVERKITE 模型。

SILVERKITE 將時間序列分解為多個組件,並創建基於時間的特征、自回歸特征以及用戶提供的特征,如宏觀經濟特征及其相互作用,然後執行機器學習回歸模型,以了解時間序列與這些特征之間的關系。預測基於已學習的關系和這些特征的未來值。因此,包含正確的特征是成功的關鍵。

常見特征包括:

包含從datetime衍生出來的特征,比如 day of year , hour of day , weekday , is_weekend 等等。這些特征在捕獲特殊模式的時候時有用的。比如,對於大多數的商業相關數據,周末與否具有不同的模式。

首先定義了基本特征“ct1”,它以年為單位計算從訓練數據的第壹天起經過的時間(可以是分數)。比如,如果訓練數據從"2018-01-01"開始,那麽"2018-01-01"就有 ct1=0.0 ,"2018-01-02" 就是 ct1=1/365 ,"2019-01-01" 就是 ct1=1.0 。 ct1 的顆粒度可以根據需求定義。可以對 ct1 應用壹個獨立的生長函數,比如,可以定義 ct2 為 ct1 的平方,用來給指數生長建模。

Trend趨勢描述時間序列的平均趨勢。它是通過具有可能變化點的增長項定義的。在每個變化點,增長率都可能發生變化(更快或更慢)。例如,如果“ct1”(線性增長)與變更點壹起使用,則趨勢將建模為分段線性。

Seasonality周期性描述了時間序列的周期性模式。它包含多個層次,包括每日周期性、每周周期性、每月周期性、季度周期性和年度周期性。周期性通過不同階次的傅立葉級數定義。階次越大,模型可以學習的周期模式就越詳細。但是,階次過大可能會導致過擬合。

Events包括假期和其他可能暫時影響時間序列的短期事件,例如感恩節長周末。通常情況下,事件是有規律的,並在將來的已知時間重復。這些特征由涵蓋活動日及其相鄰日期的指標組成

自回歸特征包括過去的時間序列觀測及其聚合。例如,可以使用過去壹天的觀察、過去壹周的同壹工作日或過去7天的平均值等。請註意,自回歸功能在短期預測中非常有用,但在長期預測中應避免使用。原因是長期預測更註重趨勢、季節性和事件的正確性。根據預測值計算長期預測中的滯後項和自回歸項。我們對未來的預測越深入,創建自回歸項所需的預測值就越多,使預測越不穩定

與時間序列相關的額外特征,如預期會影響時間序列的宏觀經濟特征。請註意,這些功能需要在訓練和預測期間手動提供。

上述特征之間的任何耦合

現在讓我們用壹個例子來過壹下整個的創建和調整過程吧。用到的數據是Peyton Manning維基百科頁面的瀏覽數據。

數據集範圍是從2007-12-10 到 2016-01-20。

將df數據加載到UnivariateTimeSeries中,創建壹個UnivariateTimeSeries對象。這個ts對象就可以方便地進行探索性數據分析和繪圖。

繪制原始數據的時序圖。

基於數據集可以創建壹個簡單的預測模型,註意如果妳不提供任何額外的參數,所有的模型參數都是默認的。

默認參數都是取的比較保守的,所以可以將這個作為壹個baseline模型來評估預測難度,必要時進行進壹步改進。

簡單預測模型的詳細過程可以參考: /p/2c40becc7ae2

繪制出預測曲線

我們可以看到預測模型對於已有的數據吻合較好,但是我們沒有證據說他對未來預測得很好。

訓練集-測試集拆分

壹般來說,評價模型的性能是將訓練集保留壹部分,然後用這部分來評價模型的性能。

因為我們總是預測未來的數據,所以我們將訓練數據集從後往前保留壹部分出來,用來作為測試集。

默認的, run_forecast_config 返回的結果就會創建壹個訓練-測試的拆分,並且把測試結果放在 result.backtest 。

測試集的範圍跟我們要預測的時間範圍默認是壹致的。我們可以拿到評價結果:

評價指標

從這裏,我們就可以看到模型對於測試集的預測性能。妳可以關註其中的壹個或幾個指標。通常包括:

MSE:

均方誤差。可能受到極值的影響。

RMSE:

均方根誤差,MSE的平方根

MAE:

平均絕對誤差,絕對誤差的平均值。可能受到極值的影響。

MedAE:

中位數絕對誤差,絕對誤差的中位數。受極值影響較小。

MAPE:

平均絕對百分比誤差,測量與真實值相對應的誤差百分比。當您想考慮相對誤差而不是絕對誤差時,這很有用。例如,對於真實觀測值10,誤差1被視為10%,但對於真實觀測值100,誤差1被視為1%。 這是我們喜歡的默認指標

MedAPE:

中值絕對百分比誤差,MAPE的中值版本,受極值影響較小。

讓我們在本例中使用MAPE作為度量標準。看這些結果可以大概知道模型對於未知數據的預測效果。平均而言,基線模型的預測值與真實值相差11.3%。

時間序列交叉驗證

預測質量在很大程度上取決於評估時間窗口。上面選擇的評估窗口可能恰好是壹個相對容易/難以預測的時期。因此,在數據集大小允許的情況下,在較長的時間窗口內進行評估更為穩健。讓我們考慮壹種更通用的評估預測模型的方法:時間序列交叉驗證。

時間序列交叉驗證是基於時間序列滾動拆分。比如說,我們想通過三重交叉驗證進行評估,整個訓練數據以3種不同的方式進行分割。由於我們的預測期限為365天,我們會:

第壹折:訓練 2007-12-10 to 2013-01-20,預測2013-01-21 to 2014-01-20,並對比預測值和實際值

第壹折:訓練 2007-12-10 to 2014-01-20,預測2014-01-21 to 2015-01-20,並對比預測值和實際值

第壹折:訓練 2007-12-10 to 2015-01-20,預測2015-01-21 to 2016-01-20,並對比預測值和實際值

拆分方式是可以靈活調整的,可以看幫助,在此不詳述。

預測模型的性能就是三次評估的平均值。

默認的, run_forecast_config 返回的結果也已經在內部跑過交叉驗證了。

妳可以自己配置交叉驗證的參數,這裏要註意 test_horizon 數據從後面開始保留的數據,不用作交叉驗證。

當我們調參時,就是要選擇交叉驗證性能最好的那壹組參數。

現在妳已經知道了如何評價模型的性能,讓我們看看能否通過調參來提升模型性能吧。

異常

異常是指預計未來不會再次發生的指標偏差。異常點將導致模型將異常作為時間序列的固有屬性進行擬合,從而導致預測不準確。可以通過疊加圖overlays識別這些異常。

從上面的的重疊圖,我們可以看到有兩個比較大的異常數據:2012年3月和2010年6月。其他小的異常數據也能被檢測到,但是他們的影響比較小。 SILVERKITE 模板現在支持通過提供 anomaly_info 字典來屏蔽異常點。妳可以調整這些數值,或者直接賦空值(在這種情況下,異常點就不會被用來擬合)。

詳細的介紹可以看 /pages/stepbystep/0300_input 。

這裏,我們定義壹個 anomaly_df DataFrame,用來把異常點屏蔽為空值,並且將它打包到 anomaly_info 字典裏面。

添加相關特征

Growth and trend

生長和趨勢

首先我們看生長growth和趨勢trend。growth的細節配置可以看 /pages/model_components/0200_growth 。

在這兩個特征裏面,我們更關註長期的趨勢。從原始數據的圖可以看到,沒有明顯的增長模式,所以我們可以使用線性增長來擬合模型。

另壹方面,可能會有潛在的趨勢變化點,在這些趨勢變化點上,線性增長模型會改變斜率。

changepoint變化點的細節可以看 /pages/model_components/0500_changepoints 。

這些變化點可以通過 ChangepointDetector 類檢測到。可以看 Changepoint detection <../quickstart/0200_changepoint_detection.html> 。

這裏我們探索壹下 自動變化點檢測

這個自動變化點檢測的參數,是為本數據集做的定制。

從圖中我們可以看到自動檢測的趨勢變化點。結果顯示,在2012年之前整體趨勢都是上漲的,然後整體就是下降的。

如果我們把趨勢變化點的參數餵給模型,這些趨勢變化特征就會自動加入到模型裏面。

Seasonality

周期性特征

接下來我們看看周期性特征。配置詳情可以看 /pages/model_components/0300_seasonality 。快速案例可以看 Seasonality Detection <../quickstart/0300_seasonality.html>

本例周期特征項的總結如下:

因此,為了凈化季節性特征項,我們包括了weekly 和 yearly,季節性的階次是可以調整的。這裏我們把周的階次調整為5,年的階次調整為10.

調整信息可以參考 /pages/model_components/0300_seasonality

我們後面還會把周的特征跟足球賽季特征的耦合交互也加到模型裏來。

SILVERKITE 模型也支持周期性的變化點,在該時間點之後,周期性效應表現出不同的行為。對於 SILVERKITE 模型,這意味著允許更改傅裏葉級數系數。如果交叉驗證性能較差,並且在探索性分析中檢測到季節性變化點,我們可以決定添加此功能。

有關詳細信息,請參閱:doc: /gallery/quickstart/0200\u changepoint\u detection 。

Holidays and events

假日和事件

然後我們看看假日和事件。細節的假日和事件配置可以看 /pages/model_components/0400_events 。

問問妳自己,哪些假日有可能會影響時序值。我們覺得,美國主要假期會影響到維基百科頁面的瀏覽,因為大部分的足球球迷在美國。(這個數據集是球星的百科頁面瀏覽量,所以這麽說。)

壹些事件,比如超級碗,也可能提高頁面的瀏覽量。因此,我們把美國假期和超級碗的日期添加進來,作為自定義事件。

通過年度周期圖 Seasonality <../quickstart/0300_seasonality.html> ,其他影響時序值的重要事件也可以被發現。

其中holiday_lookup_countries可以選擇的國家中,有"China"可以選擇。自帶了中國的公***假期。

Autoregression

自回歸

自回歸特征在短期預測中非常有用,但是在長期預測中可能會有風險。詳情見 /pages/model_components/0800_autoregression

Custom

自定義

現在我們來考慮壹些跟頁面瀏覽可能相關的自定義特征。這裏可以看到額外回歸器的文檔 /pages/model_components/0700_regressors 。

我們觀察到足球賽季嚴重影響頁面瀏覽量,因此我們需要使用回歸函數來識別足球賽季。

有多種方法可以包含此功能:添加整個季節的指標;添加截至季節開始(結束)的天數和自季節開始(結束)的天數。

前者對所有季內日期都有壹致的影響,而後者量化了賽季開始和結束的不同影響。

如果您不確定要包含哪個效果,那麽可以同時包含這兩個效果。

SILVERKITE 可以選用嶺回歸(Ridge regression)來作為擬合算法,以避免過擬合太多的特征。

註意很多的時間特征也可以被加到模型裏面, SILVERKITE calculates some of these features, which can be added to

extra_pred_cols as an arbitrary patsy expression.(這句話沒看懂)這些特征的完整列表可以看 ~greykite.common.features.timeseries_features.build_time_features_df

如果特征沒有被 SILVERKITE 自動創建,我們需要事先創建它並將其附加到數據df中。

這裏我們創建了"is_football_season"的特征。

請註意,我們也需要為預測期間提供自定義列。

具體方法,是首先創建壹個df,覆蓋預測期間的timestamps,這個可以通過 UnivariateTimeSeries 類中的 .make_future_dataframe 函數實現,

然後,我們為這個df創建自定義回歸器的新列。

Interactions

交互耦合

最後,讓我們考慮壹下預測問題的交互耦合。通常說,如果壹個特征會受到另壹個特征的影響,那麽這兩個特征就有現在的耦合關系。

就像 Seasonality <../quickstart/0300_seasonality.html> 中提到的,weekly的周期性受到了是否足球賽季的影響。

因此,乘法項 is_football_season x weekly_seasonality 可以捕捉到這個模式。

seasonality周期性特征和其他特征的耦合,可以使用 cols_interact 函數創建。

另外,乘法項 month x weekly_seasonality 和 dow_woy 特征也會對weekly的周期性產生影響,也可以加上這些特征,但這裏我們不管。

妳可以再次使用 cols_interact 來創建 month x weekly_seasonality ,就跟前面的 is_football_season x weekly_seasonality 類似。

dow_woy 是 SILVERKITE 自動計算的,妳可以簡單地把名字append到 extra_pred_cols 上。

Putting things together

把東西放到壹起

現在,讓我們把這些東西都放在壹起,創建新的預測模型。詳情可以看 /pages/stepbystep/0400_configuration 。

我們首先配置 MetadataParam 類,這個類包括了時間序列本身的基本屬性。

接下來,我們定義 ModelComponentsParam 類,這個類包含了跟模型本身相關的屬性。

現在,讓我們用新的配置來跑模型。評估模型的參數使用跟前面壹致的,這樣調參對比起來更公平。

現在,我們可以看到,在分析了問題並且增加了合適特征之後,交叉驗證的測試MAPE是5.4%,比baseline的7.3%更好了。

三折的MAPE分別是3.9%, 8.7% and 3.8%。第壹折提高最顯著。研究壹下可以發現第二折沒有提高,這是因為在測試周期剛開始的時候,剛好有壹個趨勢變化點。除非我們看到,否則很難預知這樣的情況。

在交叉驗證的步驟中,避免這個情況的方式,是設置不同的評價時段。但是不管這個時間段也是可以的,因為未來還有可能再次發生。

在預測時段,我們可以監控預測和實際值,並且根據最新的數據模式重新訓練模型。在changepoints變化點的字典中,相應的調整 regularization_strength 和 no_changepoint_distance_from_end ,或將手動指定的變更點添加到自動檢測的變更點。詳情見 /pages/model_components/0500_changepoints 。

我們也可以繪制預測圖。

為了進壹步研究模型機制,看壹看模型的summary也是有幫助的。

ModelSummary 模塊提供了模型的估計值、顯著性、p值、置信區間等。這些可以幫助用戶理解模型如何工作以及如何做進壹步提升。

模型summary是壹種類方法,可按如下方式使用。

模型摘要顯示了模型信息、系數及其重要性以及壹些摘要統計信息。例如,我們可以看到變化點以及增長率在每個變化點的變化程度。

我們可以看到壹些假期在模型中有顯著的影響,如聖誕節、勞動節、感恩節等。我們可以看到足球賽季和每周季節性之間相互作用的重要性等。有關模型摘要的更詳細指南,請參閱:doc: /gallery/quickstart/0400\u model\u summary

在這個示例之後,您可能對如何選擇參數和優化模型有壹些了解。

這裏我們列出了壹些可能有助於選擇最佳模型的步驟和技巧。

您可以做什麽:

( ~greykite.framework.input.univariate_time_series.UnivariateTimeSeries.plot_quantiles_and_overlays ).

把這些點賦值NA,除非妳對修正異常值很有信心。

如果沒有壹個典型的增長形狀符合時間序列,則可以考慮具有趨勢變化點的線性增長。嘗試不同的變更點檢測配置。您還可以繪制檢測到的變更點,並查看其對您是否有意義。該模板還支持自定義變更點。如果自動變更點檢測結果對您沒有意義,您可以提供自己的變更點

階次越高,學習的細節越多,但是階次太高會導致過擬合。這些也可以通過疊加圖overlay plots來發現。沒有壹種統壹的方法來選擇周期性,因此探索不同的周期性階次並比較結果。

是否需要增加自定義的事件?如果要增加自定義事件,記得也要加上預測時段。

請註意,您還需要提供預測期內回歸系數的值。妳可以使用另壹個時間序列作為回歸器,只要妳有壹個覆蓋妳預測期的基本事實/良好預測。

如果兩個特征之間具有相關性,那麽這兩個特征就是耦合的。比如“是否足球賽季”與“week的周期性”是耦合的。也可以試試使用疊加圖overlay plot plot_quantiles_and_overlays 。默認的,我們有壹些預先定義好的耦合項,參看 feature_set_enabled <../../pages/model_components/0600_custom.html#interactions>

這是給特征和事件序列之間建模的算法,可選算法的完整列表可以看 fit_algorithm <../../pages/model_components/0600_custom.html#fit-algorithm>

如果妳不知道他們的區別,可以試壹試比較結果,如果妳不想試,就用"ridge",嶺回歸算法,這是壹個安全的選擇。

值得註意的是,該模板支持使用不同的參數集進行自動網格搜索。對於每個參數,如果在列表中提供配置,它將自動運行每個組合並選擇交叉驗證性能最好的壹個。這將節省大量時間。有關詳細信息,請參閱 grid search <../quickstart/0500_grid_search.html> 。

遵循妳的洞察力和直覺,並利用這些參數,妳會得到很好的預測結果!