Está de moda usar caret
para estas cosas, pero yo estoy todavía acostumbrado a hacerlas a mano. Creo, además, que es poco instructivo ocultar estas cuestiones detrás de funciones de tipo caja-negra-maravillosa a quienes se inician en el mundo de la construcción y comparación de modelos. Muestro, por tanto, código bastante simple para la validación cruzada de un modelo con R:
# genero ids ids <- rep(1:10, length.out = nrow(cars)) # Nota: da igual si nrow(df) no es múltiplo de 10 # los aleatorizo ids <- sample(ids) # esto devuelve una lista de dfs: preds.cv <- lapply(unique(ids), function(i){ preds <- predict(lm(dist ~ speed, data = cars[ids != i,]), cars[ids == i,]) data.frame(preds = preds, real = cars[ids == i,]$dist) }) # "apilo" los dfs: preds.cv <- do.call(rbind, preds.cv) # calculo el rmse rmse <- sqrt(mean((preds.cv$preds - preds.cv$real)^2))
Sí, estoy usando el RMSE aunque sea un detractor del mismo.
Y, si quieres, también puedes correr ese código en paralelo.
Caret tiene implementados gráficos muy agradables para visualizar los resultados de la validación cruzada… y esos cuesta más hacerlos a mano…