business-science / modeltime.gluonts

GluonTS Deep Learning with Modeltime
https://business-science.github.io/modeltime.gluonts/
Other
39 stars 9 forks source link

Why does my saved calibration data load as environment variable and not, when I save and reload from rds? #51

Open leonhGeis opened 1 year ago

leonhGeis commented 1 year ago

In order to save my gluonts calibration tbl, I want to be able to reload the saved calibration table from an rds temp file.

As I know, there are convenience functions to save gluonts models, but I rather want to save the calibrated data. This is mainly because, when I refit the model, gluonts is changing the forecast values, as they are probabilistic, every time. To get a model history, I want to save calibration data and the refit table from the ex ante.

I tried to do this, but every time, I want to reload the saved calibration from rds, the forecasting function fails with an error.

I supplied a reprex to illustrate the issue:

library(tidymodels)
library(tidyverse)
library(timetk)
library(reticulate
)
Sys.setenv(GLUONTS_PYTHON = "/YOUR_PATH.../r-miniconda/envs/r-reticulate/bin/python3.8"
)
library(modeltime.gluonts
)
HORIZON <- 24*7
data <- m4_hourly %>%
    select(id, date, value
        ) %>%
    group_by(id
        )%>%
    mutate(value = standardize_vec(value)
        ) %>%
    ungroup()
new_data <- data %>%
    group_by(id
        ) %>%
    future_frame(.length_out = HORIZON
        ) %>%
    ungroup()
model_fit_nbeats_ensemble <- nbeats(
    id                    = "id",
    freq                  = "H",
    prediction_length     = HORIZON,
    lookback_length       = c(HORIZON, 4*HORIZON),
    epochs                = 5,
    num_batches_per_epoch = 15,
    batch_size            = 1 
    ) %>%
    set_engine("gluonts_nbeats_ensemble"
        ) %>%
    fit(value ~ date + id, data)
set.seed(223
)
calibration_tbl <- 
    modeltime_table(
        model_fit_nbeats_ensemble
        ) %>%
    modeltime_calibrate(
        new_data = data, id = "id"
        ) 
# save calibrated model
artifacts <- list(
    calibration = calibration_tbl   # ---> USING THIS AS FC-INPUT WORKS
)
artifacts %>%
    write_rds("artifacts_list.rds"
    )
artifacts <- read_rds("artifacts_list.rds" # ---> GET SAVED MODEL FAILS
)
# forecast test
set.seed(273
)
forecast <- artifacts$calibration  %>% 
    modeltime_forecast(
        new_data      = new_data,
        actual_data   = data,
        keep_data     = TRUE
    )