En la regresión lasso o ridge, hay que especificar un parámetro de contracción, a menudo denominado por $\lambda$ o $\alpha$ . Este valor suele elegirse mediante validación cruzada, comprobando un grupo de valores diferentes en los datos de entrenamiento y viendo cuál da el mejor resultado, por ejemplo. $R^2$ en los datos de las pruebas. ¿Cuál es el intervalo de valores que se debe comprobar? ¿Es $(0,1)$ ?
Respuestas
¿Demasiados anuncios?No hace falta que te molestes. En la mayoría de los paquetes (como glmnet) si no especifica $\lambda$ , el paquete de software genera su propia secuencia (lo que suele recomendarse). La razón por la que subrayo esta respuesta es que durante la ejecución del LASSO el solucionador genera una secuencia de $\lambda$ por lo que, aunque pueda resultar contraintuitivo proporcionar un único $\lambda$ puede ralentizar considerablemente el solucionador (cuando se proporciona un parámetro exacto, el solucionador recurre a la resolución de un programa semidefinido que puede ser lento para casos razonablemente "sencillos").
En cuanto al valor exacto de $\lambda$ potencialmente puede elegir lo que quiera de $[0,\infty[$ . Tenga en cuenta que si su $\lambda$ es demasiado grande, la penalización será demasiado grande y, por tanto, ninguno de los coeficientes podrá ser distinto de cero. Si la penalización es demasiado pequeña, el modelo se ajustará en exceso y no será la mejor solución de validación cruzada.
Para aquellos que tratan de entender esto:
He descubierto que hay una gran diferencia entre permitir glmnet
para calcular $\lambda$ y para cuando creamos un rango para que elija ( grid
).
He aquí un ejemplo utilizando "solicitantes" en el campo College
conjunto de datos de ISLR
# Don't forget to set seed
set.seed(1)
train <- sample(1:dim(College)[1], 0.75*dim(College[1]))
# Matrices
xmat.train <- model.matrix(Apps~.-1,data=College[train,])
xmat.test <- model.matrix(Apps~.-1, data= College[-train,])
y <- College$Apps[train]
# Create a grid of values for the scope of lambda (optional):
grid <- 10 ^ seq(10,-2,length = 100)
# Add the grid here as lambda (optional)
ridge.fit <- glmnet(xmat.train, y, alpha = 0, lambda=grid)
cv.ridge <- cv.glmnet(xmat.train, y, alpha =0, lambda=grid)
bestlam <- cv.ridge$lambda.min
cat("\nBestlam (with grid):",bestlam)
pred <- predict(ridge.fit, s = bestlam, newx= xmat.test)
cat("\nWith Grid:", mean((College$Apps[-train]-pred)^2))
# Again but without the grid (allowing R to figure lambda out
ridge.fit <- glmnet(xmat.train, y, alpha = 0)
cv.ridge <- cv.glmnet(xmat.train, y, alpha =0)
bestlam <- cv.ridge$lambda.min
cat("\n\nBestlam (no grid):",bestlam)
pred <- predict(ridge.fit, s = bestlam, newx= xmat.test)
cat("\nWithout Grid:", mean((College$Apps[-train]-pred)^2))
Puede ejecutar esto usted mismo, y puede cambiar grid
en consecuencia también, he visto ejemplos que van desde grid <- 10 ^ seq(10,-2,length = 100)
a grid <- 10^seq(3, -2, by = -.1)
.
Mi mejor suposición es que $\lambda$ puede restringirse a ciertos valores, y depende de nosotros averiguar el rango más óptimo.
También me ha resultado muy útil esta guía -> https://drsimonj.svbtle.com/ridge-regression-with-glmnet