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)


