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 Ridgemodelo 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=0en 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.Ridgerealiza la estimación de interceptación no normalizada (estándar) y la penalización es tal que||Xb - y - intercept||^2 + alpha ||b||^2se minimizab. Puede haber factores1/2o1/n_samplesambos 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.Ridgeoptimiza 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.Ridgefuente
standardize = FALSEenglmnet()conseguir los mismos resultados.linear_model.Ridgepara cualquier análisis del mundo real.linear_model.Ridgemodelo 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.Ridgeminimiza 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