¿Cuáles son las diferencias entre la regresión de Ridge usando el glmnet de R y el scikit-learn de Python?

11

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

Jordi
fuente
55
Totalmente desconocido con la regresión de cresta glmnet. Pero, de manera predeterminada, 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 minimiza b. Puede haber factores 1/2o 1/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:

9

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 objetivo

|Xβy|22+α|β|22

El documento glmnet dice que la red elástica optimiza la siguiente función objetivo

|Xβy|22+λ(12(1α)|β|22+α|β|1)

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αsklearnlinear_model.Ridge

Matthew Drury
fuente
Y lo extrañé totalmente en el comentario de @eickenberg también. Tengo que usar standardize = FALSEen glmnet()conseguir los mismos resultados.
Jordi
@Jordi Definitivamente debería estandarizarse si se usa linear_model.Ridgepara cualquier análisis del mundo real.
Matthew Drury
Entiendo que el linear_model.Ridgemodelo sklearn estandariza las características automáticamente. La normalización es opcional. Me pregunto por qué necesito desactivar la estandarización glmnet()para que los modelos produzcan resultados idénticos.
Jordi
10

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.

1NXβy22+λ(12(1α)β22+αβ1)

La documentación de sklearn dice que linear_model.Ridgeminimiza la función de pérdida

Xβy22+αβ22

que es equivalente a minimizar

1NXβy22+αNβ22

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

library(glmnet)
X = matrix(c(1, 1, 2, 3, 4, 2, 6, 5, 2, 5, 5, 3), byrow = TRUE, ncol = 3)
y = c(1, 0, 0, 1)
reg = glmnet(X, y, alpha = 0, lambda = 2 / nrow(X))
coef(reg)

Salida glmnet: –0.03862100, –0.03997036, –0.07276511, 0.42727955

import numpy as np
from sklearn.linear_model import Ridge
X = np.array([[1, 1, 2], [3, 4, 2], [6, 5, 2], [5, 5, 3]])
y = np.array([1, 0, 0, 1])
reg = Ridge(alpha = 1, fit_intercept = True, normalize = True)
reg.fit(X, y)
np.hstack((reg.intercept_, reg.coef_))

salida de sklearn: –0.03862178, –0.0399697, –0.07276535, 0.42727921

visitante
fuente
44
Las diferentes definiciones de parámetros y su escalamiento utilizados en diferentes bibliotecas son una fuente común de confusión.
AaronDefazio
1
No esperaría que tanto Gung como yo entendiéramos esto mal.
Michael R. Chernick
2
Sí, los dos se equivocaron. Sus razones para rechazar mi edición dejan en claro que ambos no vieron mi comentario "Factor faltante de 1 / N" en stats.stackexchange.com/review/suggested-edits/139985
visitante
Tu edición probablemente fue rechazada porque cambió mucho más que solo lo que reclamas. Si desea editar mi publicación y solo cambiar el factor faltante, hágalo, pero cambiar mis enlaces, redacción y código también es excesivo. Los comentarios sobre su trato injusto en su respuesta son inapropiados y no están relacionados con el contenido de la pregunta, elimínelos. Su redacción también plagó mi respuesta, esta no es la forma correcta de responder a una edición rechazada. Nos encantaría su valiosa contribución a nuestra comunidad, pero por favor, infórmese con nuestras normas antes de destriparnos.
Matthew Drury el
1
@visitor Lo siento si salí un poco brusco. Realmente debería tratar de comunicar que pareces un buen contribuyente potencial para el sitio, y quiero que tengas una buena experiencia. Tenemos algunas normas sociales, como cualquier otro grupo, y tendrás una mejor experiencia si las conoces. Sigo pensando que "la respuesta de Matthew Drury es incorrecta" es bastante dura, seguramente hay mejores formas de comunicar que mi respuesta está fallando erróneamente un factor de . "La respuesta de X es incorrecta" se lee como un ataque personal. 1N
Matthew Drury el