Estoy revisando la sección LAB §6.6 sobre Regresión de cresta / lazo en el libro 'Una introducción al aprendizaje estadístico con aplicaciones en R' de James, Witten, Hastie, Tibshirani (2013).
Más específicamente, estoy tratando de aplicar el Ridge
modelo scikit-learn al conjunto de datos 'Hitters' del paquete R 'ISLR'. He creado el mismo conjunto de características que se muestran en el código R. Sin embargo, no puedo acercarme a los resultados del glmnet()
modelo. He seleccionado un parámetro de ajuste L2 para comparar. (argumento 'alfa' en scikit-learn).
Pitón:
regr = Ridge(alpha=11498)
regr.fit(X, y)
http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Notebooks/Chapter%206.ipynb
R:
Tenga en cuenta que el argumento alpha=0
en glmnet()
significa que debe aplicarse una penalización L2 (regresión de Ridge). La documentación advierte que no se ingrese un valor único para lambda
, pero el resultado es el mismo que en ISL, donde se usa un vector.
ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)
¿Qué causa las diferencias?
Editar:
cuando se usa penalized()
desde el paquete penalizado en R, los coeficientes son los mismos que con scikit-learn.
ridge.mod2 <- penalized(y,x,lambda2=11498)
Quizás la pregunta también podría ser: '¿Cuál es la diferencia entre glmnet()
y penalized()
cuando se hace la regresión de Ridge?
Nuevo contenedor de Python para el código Fortran real utilizado en el paquete R glmnet
https://github.com/civisanalytics/python-glmnet
sklearn.linear_model.Ridge
realiza la estimación de interceptación no normalizada (estándar) y la penalización es tal que||Xb - y - intercept||^2 + alpha ||b||^2
se minimizab
. Puede haber factores1/2
o1/n_samples
ambos frente a la penalización, lo que hace que los resultados sean diferentes de inmediato. Para descifrar el problema de escala de penalización, establezca la penalización en 0 en ambos casos, resuelva cualquier discrepancia allí y luego verifique qué hace la suma de la penalización. Y por cierto, en mi humilde opinión, aquí es el lugar adecuado para hacer esta pregunta.Respuestas:
A mi respuesta le falta un factor de , consulte la respuesta de @visitors a continuación para obtener la comparación correcta.1N
Aquí hay dos referencias que deberían aclarar la relación.
La documentación de sklearn dice que
linear_model.Ridge
optimiza la siguiente función objetivoEl documento glmnet dice que la red elástica optimiza la siguiente función objetivo
Observe que las dos implementaciones usan de maneras totalmente diferentes, sklearn usa para el nivel general de regularización, mientras que glmnet usa para ese propósito, reservando para el comercio entre la cresta y la regularización de lazo. α λ αα α λ α
Comparando las fórmulas, parece que configurar y en glmnet debería recuperar la solución .λ = 2 α sklearnα=0 λ=2αsklearn
linear_model.Ridge
fuente
standardize = FALSE
englmnet()
conseguir los mismos resultados.linear_model.Ridge
para cualquier análisis del mundo real.linear_model.Ridge
modelo sklearn estandariza las características automáticamente. La normalización es opcional. Me pregunto por qué necesito desactivar la estandarizaciónglmnet()
para que los modelos produzcan resultados idénticos.La respuesta de Matthew Drury debería tener un factor de 1 / N. Más precisamente...
La documentación de glmnet establece que la red elástica minimiza la función de pérdida.
La documentación de sklearn dice que
linear_model.Ridge
minimiza la función de pérdidaque es equivalente a minimizar
Para obtener la misma solución de glmnet y sklearn, sus dos funciones de pérdida deben ser iguales. Esto significa configurar y en glmnet.α=0 λ=2Nαsklearn
Salida glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955
salida de sklearn: –0.03862178, –0.0399697, –0.07276535, 0.42727921
fuente