Quiero sintonizar lambda de una red elástica. Es posible optimizar el lambda basado en una validación cruzada con el glmnet
paquete. Sin embargo, me di cuenta de que la estimación de la lambda varía mucho, si puedo ejecutar la validación cruzada varias veces. Ver el código de abajo, para un reproducible ilustración de esta situación:
library("glmnet")
set.seed(1234)
# Some example data
N <- 1000
y <- rnorm(N, 5, 10)
x1 <- y + rnorm(N, 2, 10)
x2 <- y + rnorm(N, - 5, 20)
x3 <- y + rnorm(N, 10, 200)
x4 <- rnorm(N, 20, 50)
x5 <- rnorm(N, - 7, 200)
x6 <- rbinom(N, 1, exp(x1) / (exp(x1) + 1))
x7 <- rbinom(N, 1, exp(x2) / (exp(x2) + 1))
x8 <- rbinom(N, 1, exp(x3) / (exp(x3) + 1))
x9 <- rbinom(N, 1, exp(x4) / (exp(x4) + 1))
x10 <- rbinom(N, 1, exp(x5) / (exp(x5) + 1))
data <- data.frame(y, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10)
# Estimate lambda.1se several times
est_lambda.1se <- numeric()
for(i in 1:1000) {
# Tuning in glmnet
mod_cv_test <- cv.glmnet(x = as.matrix(data[ , colnames(data) %in% "y" == FALSE]),
y = y, alpha = 0.5, family = "gaussian")
# Store lambda.1se
est_lambda.1se[i] <- mod_cv_test$lambda.1se
}
# Distribution of the estimated lambdas
hist(est_lambda.1se, breaks = 50) # Could the median be taken?
En mi ejemplo, lambda oscila aproximadamente entre 1 y 2.3. Me pregunto si hay espacio para mejoras. Mi idea es coger el median
de todas las carreras como mejor lambda. Sin embargo, me temo que este procedimiento resulta en problemas que no puedo ver ahora mismo.
Pregunta: ¿Cómo puede la optimización de lambda ser mejorado?