Acum câteva săptămâni, am introdus o procedură de creștere a gradientului independentă de model (XGBoost, LightGBM, CatBoost-like) pentru regresie și clasificare supravegheată, care poate utiliza orice cursant de bază (disponibil în pachetele R și Python mlsauce
). Postările anterioare le găsiți aici:
LightGBM este utilizat pe scară largă în contextul prognozării seriilor temporale (vezi de exemplu pentru competiția de prognoză M5 și competiția VN1) și se bazează pe arbori de decizie. Cu toate acestea, este posibil să folosiți mulți alți cursanți de bază, cum ar fi regresia ridge, regresia kernel ridge etc. În această postare, voi arăta cum să utilizați mlsauce
versiunea 0.24.0 pentru prognoza serii temporale, cu orice cursant de bază.
Aici, Generic Gradient Boosting este comparat cu modele populare, cum ar fi VAR și VECM (fără reglarea hiperparametrului), pe setul de date de macrodate din statsmodels
pachet. Setul de date este împărțit într-un set de antrenament (90% din date) și un set de testare (10% din date), iar performanța modelului este evaluată folosind Root Mean Squared Error (RMSE) și scorul Winkler (cuantificarea incertitudinii). Cuantificarea incertitudinii folosește predicția conformă și simularea numerică, așa cum este descris în lucrarea mea și mai multe detalii pot fi găsite în aceste diapozitive.
import mlsauce as ms import numpy as np import pandas as pd import statsmodels.api as sm try: from statsmodels.tsa.base.datetools import dates_from_str except ImportError: ModuleNotFoundError # some example data mdata = sm.datasets.macrodata.load_pandas().data # prepare the dates index dates = mdata(('year', 'quarter')).astype(int).astype(str) quarterly = dates("year") + "Q" + dates("quarter") quarterly = dates_from_str(quarterly) mdata = mdata(('realgovt', 'tbilrate', 'cpi')) mdata.index = pd.DatetimeIndex(quarterly) data = np.log(mdata).diff().dropna() n = data.shape(0) max_idx_train = np.floor(n*0.9) training_index = np.arange(0, max_idx_train) testing_index = np.arange(max_idx_train, n) df_train = data.iloc(training_index,:) df_test = data.iloc(testing_index,:) regr_mts = ms.LazyBoostingMTS(verbose=0, ignore_warnings=True, lags = 20, n_hidden_features=7, n_clusters=2, type_pi="scp2-block-bootstrap", #kernel="gaussian", replications=250, show_progress=False, preprocess=False, sort_by="WINKLERSCORE",) models = regr_mts.fit(df_train, df_test) print(models(("RMSE", "WINKLERSCORE", "Time Taken")).iloc(0:25,:)) 0%| | 0/30 (00:00, ?it/s)100%|██████████| 30/30 (00:13<00:00, 2.20it/s) RMSE WINKLERSCORE Model MTS(GenericBooster(RidgeCV)) 0.32 1.71 MTS(GenericBooster(PassiveAggressiveRegressor)) 0.34 1.78 MTS(GenericBooster(SGDRegressor)) 0.32 1.87 MTS(GenericBooster(Ridge)) 0.35 1.93 MTS(GenericBooster(HuberRegressor)) 0.37 1.95 MTS(GenericBooster(ElasticNet)) 0.33 1.96 MTS(GenericBooster(Lasso)) 0.33 1.96 MTS(GenericBooster(DummyRegressor)) 0.33 1.96 MTS(GenericBooster(LassoLars)) 0.33 1.96 MTS(GenericBooster(DecisionTreeRegressor)) 0.33 1.97 MTS(GenericBooster(QuantileRegressor)) 0.33 1.98 MTS(GenericBooster(LassoLarsIC)) 0.33 1.99 MTS(GenericBooster(TweedieRegressor)) 0.33 2.01 MTS(GenericBooster(BayesianRidge)) 0.33 2.01 MTS(GenericBooster(LassoCV)) 0.33 2.02 MTS(GenericBooster(LassoLarsCV)) 0.33 2.02 MTS(GenericBooster(LarsCV)) 0.33 2.02 MTS(GenericBooster(ElasticNetCV)) 0.33 2.02 MTS(GenericBooster(KNeighborsRegressor)) 0.33 2.03 MTS(GenericBooster(SVR)) 0.34 2.07 MTS(GenericBooster(ExtraTreeRegressor)) 0.33 2.19 VAR 0.33 2.21 VECM 0.34 2.39 MTS(GenericBooster(LinearSVR)) 0.45 3.03 MTS(GenericBooster(TransformedTargetRegressor)) 0.49 3.04 Time Taken Model MTS(GenericBooster(RidgeCV)) 0.13 MTS(GenericBooster(PassiveAggressiveRegressor)) 0.29 MTS(GenericBooster(SGDRegressor)) 0.09 MTS(GenericBooster(Ridge)) 0.09 MTS(GenericBooster(HuberRegressor)) 0.18 MTS(GenericBooster(ElasticNet)) 0.09 MTS(GenericBooster(Lasso)) 0.09 MTS(GenericBooster(DummyRegressor)) 0.08 MTS(GenericBooster(LassoLars)) 0.09 MTS(GenericBooster(DecisionTreeRegressor)) 0.11 MTS(GenericBooster(QuantileRegressor)) 0.15 MTS(GenericBooster(LassoLarsIC)) 0.30 MTS(GenericBooster(TweedieRegressor)) 0.09 MTS(GenericBooster(BayesianRidge)) 0.14 MTS(GenericBooster(LassoCV)) 5.01 MTS(GenericBooster(LassoLarsCV)) 0.54 MTS(GenericBooster(LarsCV)) 0.46 MTS(GenericBooster(ElasticNetCV)) 4.74 MTS(GenericBooster(KNeighborsRegressor)) 0.10 MTS(GenericBooster(SVR)) 0.09 MTS(GenericBooster(ExtraTreeRegressor)) 0.10 VAR 0.01 VECM 0.01 MTS(GenericBooster(LinearSVR)) 0.16 MTS(GenericBooster(TransformedTargetRegressor)) 0.13
Aici, voi arăta cum se utilizează mlsauce
pentru prognoza serii temporale, cu regresia Ridge și regresia Kernel Ridge ca cursanți de bază. 250 conform predictiv se efectuează simulări, iar predicția se face pentru următoarele 20 de perioade.
import nnetsauce as ns regr_ridge = ms.GenericBoostingRegressor(ms.RidgeRegressor(reg_lambda=1e3)) regr_krr = ms.GenericBoostingRegressor(ms.KRLSRegressor()) regr_mts = ns.MTS(regr_ridge, lags=20, replications=250, type_pi="scp2-block-bootstrap") regr_mts.fit(df_train) regr_mts.predict(h=20) regr_mts.plot('tbilrate') 100%|██████████| 46/46 (00:00<00:00, 1612.53it/s) 100%|██████████| 46/46 (00:00<00:00, 1678.79it/s) 100%|██████████| 46/46 (00:00<00:00, 1663.07it/s) 100%|██████████| 46/46 (00:00<00:00, 1298.61it/s) 100%|██████████| 46/46 (00:00<00:00, 1410.21it/s) 100%|██████████| 46/46 (00:00<00:00, 1676.63it/s) 100%|██████████| 3/3 (00:00<00:00, 13.82it/s)
regr_mts = ns.MTS(regr_krr, lags=20, replications=250, type_pi="scp2-block-bootstrap") regr_mts.fit(df_train) regr_mts.predict(h=20) regr_mts.plot('tbilrate') 100%|██████████| 34/34 (00:01<00:00, 19.22it/s) 100%|██████████| 34/34 (00:01<00:00, 18.17it/s) 100%|██████████| 34/34 (00:01<00:00, 19.39it/s) 100%|██████████| 34/34 (00:01<00:00, 19.90it/s) 100%|██████████| 34/34 (00:01<00:00, 19.76it/s) 100%|██████████| 34/34 (00:01<00:00, 17.15it/s) 100%|██████████| 3/3 (00:14<00:00, 4.76s/it)