13 votos

¿Cuáles son las diferencias entre la regresión Ridge utilizando R ' s glmnet y Python ' s scikit-aprender?

Estoy pasando por la sección de LABORATORIO §6.6 en la Cresta de Regresión/Lazo en el libro "Una Introducción a la Estadística de Aprendizaje con Aplicaciones en R' por James, Witten, Hastie, Tibshirani (2013).

Más específicamente, estoy tratando de hacer aplicar la scikit-learn Ridge modelo de los 'Pesos pesados' del conjunto de datos del paquete de R 'ISLR'. He creado el mismo conjunto de características, como se muestra en el código R. Sin embargo, no puedo llegar cerca de los resultados de la glmnet() modelo. He seleccionado una L2 parámetro de ajuste para comparar. ("alfa", argumento en scikit-learn).

Python:

regr = Ridge(alpha=11498)
regr.fit(X, y)

http://nbviewer.ipython.org/github/JWarmenhoven/ISL-python/blob/master/Chapter%206.ipynb

R:

Tenga en cuenta que el argumento alpha=0 en glmnet() significa que una L2 pena debe ser aplicado (regresión Ridge). La documentación advierte de no introducir un valor único para lambda, pero el resultado es el mismo que en ISL, donde se utiliza un vector.

ridge.mod <- glmnet(x,y,alpha=0,lambda=11498)

https://github.com/JWarmenhoven/ISL-python/blob/master/R_glmnet.png

¿Qué causa las diferencias?

Editar:
Cuando se utiliza penalized() de la penalizado paquete en R, los coeficientes son los mismos que con scikit-learn.

ridge.mod2 <- penalized(y,x,lambda2=11498)

Quizá la pregunta podría ser: ¿Cuál es la diferencia entre glmnet() y penalized() al hacer la regresión contraída?

9voto

eldering Puntos 3814

Aquí aparecen dos referencias que deben aclarar la relación.

La documentación de sklearn dice que linear_model.Ridge optimiza la función objetivo siguiente

$$ \left| X \beta - y \right|_2^2 + \alpha \left| \beta \right|_2^2 $$

The glmnet paper says that the elastic net optimizes the following objective function

$$ \left| X \beta - y \right|_2^2 + \lambda \left( \frac{1}{2} (1 - \alpha) \left| \beta \right|_2^2 + \alpha \left| \beta \right|_1 \right) $$

Notice that the two implementations use $\alpha$ in totally different ways, sklearn uses $\alpha$ for the overall level of regularization while glmnet uses $\lambda$ for that purpose, reserving $\alpha$ for trading between ridge and lasso regularization.

Comparing the formulas, it look like setting $\alpha = 0$ and $\lambda = 2 \alpha_{\text{sklearn}}$ en glmnet debería recuperar la solución de linear_model.Ridge .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X