Creates an Ensemble Model using Weighted Averaging in the Modeltime Nested Forecasting Workflow.
Usage
ensemble_nested_weighted(
object,
loadings,
scale_loadings = TRUE,
metric = "rmse",
keep_submodels = TRUE,
model_ids = NULL,
control = control_nested_fit()
)
Arguments
- object
A nested modeltime object (inherits class
nested_mdl_time
)- loadings
A vector of weights corresponding to the loadings
- scale_loadings
If TRUE, divides by the sum of the loadings to proportionally weight the submodels.
- metric
The accuracy metric to rank models by the test accuracy table. Loadings are then applied in the order from best to worst models. Default:
"rmse"
.- keep_submodels
Whether or not to keep the submodels in the nested modeltime table results
- model_ids
A vector of id's (
.model_id
) identifying which submodels to use in the ensemble.- control
Controls various aspects of the ensembling process. See
modeltime::control_nested_fit()
.
Details
If we start with a nested modeltime table, we can add ensembles.
nested_modeltime_tbl
# Nested Modeltime Table
Trained on: .splits | Model Errors: [0]
# A tibble: 2 x 5
id .actual_data .future_data .splits .modeltime_tables
<fct> <list> <list> <list> <list>
1 1_1 <tibble [104 x 2]> <tibble [52 x 2]> <split [52|52]> <mdl_time_tbl [2 x 5]>
2 1_3 <tibble [104 x 2]> <tibble [52 x 2]> <split [52|52]> <mdl_time_tbl [2 x 5]>
An ensemble can be added to a Nested modeltime table.
ensem <- nested_modeltime_tbl %>%
ensemble_nested_weighted(
loadings = c(2,1),
control = control_nested_fit(allow_par = FALSE, verbose = TRUE)
)
We can then verify the model has been added.
ensem %>% extract_nested_modeltime_table()
This produces an ensemble .model_id 3, which is an ensemble of the first two models.
# A tibble: 4 x 6
id .model_id .model .model_desc .type .calibration_data
<fct> <dbl> <list> <chr> <chr> <list>
1 1_3 1 <workflow> PROPHET Test <tibble [52 x 4]>
2 1_3 2 <workflow> XGBOOST Test <tibble [52 x 4]>
3 1_3 3 <ensemble [2]> ENSEMBLE (WEIGHTED): 2 MODELS Test <tibble [52 x 4]>
We can verify the loadings have been applied correctly. Note that the loadings will be applied based on the model with the lowest RMSE.
ensem %>%
extract_nested_modeltime_table(1) %>%
slice(3) %>%
pluck(".model", 1)
Note that the xgboost model gets the 66% loading and prophet gets 33% loading. This is because xgboost has the lower RMSE in this case.
-- Modeltime Ensemble -------------------------------------------
Ensemble of 2 Models (WEIGHTED)
# Modeltime Table
# A tibble: 2 x 6
.model_id .model .model_desc .type .calibration_data .loadings
<int> <list> <chr> <chr> <list> <dbl>
1 1 <workflow> PROPHET Test <tibble [52 x 4]> 0.333
2 2 <workflow> XGBOOST Test <tibble [52 x 4]> 0.667