El documento original de elastic net Zou & Hastie (2005) Regularization and variable selection via the elastic net introdujo la función de pérdida elastic net para regresión lineal (aquí asumo que todas las variables están centradas y escaladas a varianza unitaria): $$\mathcal L = \frac{1}{n}\big\lVert y - X\beta\big\rVert^2 + \lambda_1\lVert \beta\rVert_1 + \lambda_2 \lVert \beta\rVert^2_2,$$ pero lo llamaron "naive elastic net". Argumentaron que realiza una doble contracción (lasso y ridge), tiende a contraer en exceso, y puede mejorarse al reescalar la solución resultante de la siguiente manera: $$\hat\beta^* = (1+\lambda_2)\hat\beta.$$ Dieron algunos argumentos teóricos y evidencia experimental de que esto conduce a un mejor rendimiento.
Sin embargo, el posterior artículo de glmnet
Friedman, Hastie, & Tibshirani (2010) Regularization paths for generalized linear models via coordinate descent no utilizó este reescalado y solo tuvo una breve nota al pie que decía
Zou y Hastie (2005) llamaron a esta penalización el elastic net ingenuo, y prefirieron una versión reescalada que llamaron elastic net. Nosotros eliminamos esta distinción aquí.
No se da una explicación adicional allí (ni en ninguno de los libros de Hastie et al.). Encuentro esto algo desconcertante. ¿Los autores dejaron fuera el reescalado porque lo consideraron demasiado ad hoc? ¿porque funcionó peor en algunos experimentos posteriores? ¿porque no estaba claro cómo generalizarlo al caso del GLM? No tengo ni idea. Pero en cualquier caso, el paquete glmnet
se volvió muy popular desde entonces y así que mi impresión es que hoy en día nadie está usando el reescalado de Zou & Hastie, y la mayoría probablemente ni siquiera está al tanto de esta posibilidad.
Pregunta: después de todo, ¿fue este reescalado una buena idea o una mala idea?
Con la parametrización de glmnet
, el reescalado de Zou & Hastie debería ser $$\hat\beta^* = \big(1+\lambda(1-\alpha)\big)\hat\beta.$$
1 votos
Dado que en el documento glment, el objetivo es ajustar todo el camino de regularización, ¿posiblemente la idea es que el reescalado sería simplemente una transformación monótona del camino?
1 votos
@MatthewDrury Eso es cierto, pero si Friedman et al. creían que reescalar es una buena idea, no lo habrían dejado fuera del documento y en particular del código
glmnet
. No está disponible allí ni siquiera como una función opcional (su código anterior que acompañaba el documento de 2005, por supuesto, soporta el reescalado).4 votos
Lamentablemente, el código público de glmnet es completamente ilegible...
1 votos
No completamente. Debes leer el código de mortran (en
inst/mortran/glmnet5dpclean.m
), que es traducido por el procesador de mortran a fortran 77 (src/glmnet5dpclean.f
), el cual es realmente ilegible. Sin embargo, si quieres hacer algo de depuración y no tienes un preprocesador de mortran funcional, puedes leer el código de mortran, identificar la parte correspondiente en el código f77, y colocar tu salida de depuración allí. Es un poco doloroso, pero se puede hacer...