forecasting Pronóstico de series de tiempo con Fable en R; determinación de la combinación más óptima de modelos para el pronóstico de modelos mixtos.
Estoy realizando análisis de pronóstico de series temporales con los paquetes fable
y fabletools
y me interesa comparar la precisión de modelos individuales y un modelo mixto (consistente en los modelos individuales que estoy utilizando).
Aquí hay un ejemplo de código con un marco de datos simulado:
“`library(fable)
library(fabletools)
library(distributional)
library(tidyverse)
library(imputeTS)
Creando un marco de datos simulado
set.seed(1)
Fecha <- seq(as.Date(“2018-01-01”), as.Date(“2021-03-19”), by = “1 day”)
Cuenta <- rnorm(length(Fecha), mean = 2086, sd= 728)
Cuenta <- round(Cuenta)
df <- data.frame(Fecha, Cuenta)
df
Repitiendo con un nuevo modelo
df$Cuenta <- abs(df$Cuenta) # en caso de que haya valores negativos, forzarlos a ser absolutos
count_data <- as_tsibble(df)
count_data <- imputeTS::na.mean(count_data)
testfrac <- count_data %>% arrange(Fecha) %>% sample_frac(0.8)
lastdate <- last(testfrac$Fecha)
datosentrenamiento
train <- count_data %>%
filter(Fecha <= as.Date(lastdate))
set.seed(1)
fit <- train %>%
model(
ets = ETS(Cuenta),
arima = ARIMA(Cuenta),
snaive = SNAIVE(Cuenta),
croston = CROSTON(Cuenta),
ave = MEAN(Cuenta),
naive = NAIVE(Cuenta),
neural = NNETAR(Cuenta),
lm = TSLM(Cuenta ~ trend() + season())
) %>%
mutate(mixed = (ets + arima + snaive + croston + ave + naive + neural + lm) / 8) # crea un modelo combinado utilizando el promedio de todos los modelos individuales
fc <- fit %>% forecast(h = 7)
accuracy(fc, count_data)
fc_accuracy <- accuracy(fc, count_data,
measures = list(
point_accuracy_measures,
interval_accuracy_measures,
distribution_accuracy_measures
)
)
fc_accuracy
Quiero ser capaz de probar todas las posibles combinaciones de modelos individuales y devolver el modelo mixto con el rendimiento más óptimo en una de las métricas de precisión, por ejemplo, el Error Absoluto Medio (MAE). Pero no estoy seguro de cómo hacer esto de manera automatizada ya que hay muchas posibles combinaciones.
¿Puede alguien sugerir o compartir un código sobre cómo podría hacer esto?
davy.ai
Un enfoque para encontrar el modelo mixto óptimo sería utilizar un algoritmo de búsqueda en grilla para probar todas las posibles combinaciones de modelos individuales y comparar sus métricas de rendimiento. Aquí hay un código de ejemplo que demuestra este enfoque:
“`{r}
library(purrr)
define a list of individual models
models_list <- list(
ets = ETS(Count),
arima = ARIMA(Count),
snaive = SNAIVE(Count),
croston= CROSTON(Count),
ave=MEAN(Count),
naive=NAIVE(Count),
neural=NNETAR(Count),
lm=TSLM(Count ~ trend()+season())
)
define a function to return accuracy of mixed models for each combination of models
get_mixed_model_accuracy <- function(model_list){ mixed_model <- model_list %>% reduce(
+
) / length(model_list)fc <- mixed_model %>% forecast(h = 7)
accuracy(fc, count_data)[“MAE”, “Test”]
}
calculate the performance metric (MAE) for all possible combinations of models using grid search
combinations <- map_dbl(seq_along(models_list), ~ combn(models_list, .x, simplify = FALSE)) %>%
flatten()
comb_acc <- map_dbl(combinations, get_mixed_model_accuracy)
find the optimal combination that results in the lowest MAE
optimal_comb <- combinations[[which.min(comb_acc)]] optimal_mixed_model <- optimal_comb %>% reduce(
+
) / length(optimal_comb)print the optimal combination and its accuracy on the test set
print(paste(“Combinación óptima:”, names(optimal_comb)))
print(paste(“MAE del modelo mixto óptimo:”, comb_acc[which.min(comb_acc)]))
“`
Este código define una lista de modelos individuales y luego define una función que toma una lista de modelos y devuelve el MAE del modelo mixto que los combina. Luego usa
map_dbl
para aplicar esta función a todas las posibles combinaciones de modelos utilizandocombn
, y almacena las métricas de rendimiento resultantes encomb_acc
. Finalmente, encuentra la combinación óptima seleccionando la combinación con el menor MAE y construye el modelo mixto correspondiente. La salida de este código muestra la combinación óptima y su precisión en el conjunto de prueba.