1 votos

"Convergencia para el primer valor de lambda no alcanzada"-error al utilizar el paquete GLMNET y especificar el parámetro lambda

Tengo un problema extraño cuando especifico lambda en la función glmnet que no aparece si dejo que la función pase por todas las lambdas.

Cuando uso la secuencia lambda por defecto funciona muy bien:

glmnet.out = glmnet(y=yy[train_id], x=xx[train_id,], family="binomial", alpha=1)

Warning message:
from glmnet Fortran code (error code -82); Convergence for 82th lambda 
 value not reached after maxit=100000 iterations; solutions for larger 
 lambdas returned 

glmnet.out$lambda
[1] 2.126060e-02 1.937187e-02 1.765092e-02 1.608287e-02 1.465411e-02 
    1.335228e-02 1.216610e-02 1.108530e-02 1.010051e-02 9.203207e-03
[11] 8.385619e-03 7.640664e-03 6.961888e-03 6.343413e-03 5.779882e-03 
     5.266413e-03 4.798560e-03 4.372269e-03 3.983849e-03 3.629934e-03

y más filas, hasta el valor 82. La advertencia está bien, ya que no uso lambdas tan pequeñas. El cv.glmnet da un lambda de alrededor de 0,001.

Mientras que cuando especifico un único valor de lambda :

glmnet.out = glmnet(y=yy[train_id], x=xx[train_id,], family="binomial", 
                    alpha=1, lambda=3.629934e-03)  

entonces recibo el siguiente mensaje de advertencia:

Warning messages:
1: from glmnet Fortran code (error code -1); Convergence for 1th lambda 
   value not reached after maxit=100000 iterations; solutions for larger 
   lambdas returned 
2: In getcoef(fit, nvars, nx, vnames) :an empty model has been returned; 
   probably a convergence issue

Tenga en cuenta que el primer valor de lambda es infinito, por lo que no se devuelve nada.

¿Cómo es posible? Puedo evitar el problema no especificando lambda, y luego elegir manualmente las estimaciones para la predicción con el conjunto de datos de validación cruzada así:

coefficients = as.matrix(coef(glmnet.out)[,selected_lamdda])
xBeta        = cbind(rep(1,length(cv_id)),xx[cv_id,])%*%as.matrix(coefficients)
prediction   = 1/(1+exp(-xBeta))

pero es bastante ineficiente, ya que el glmnet hace un montón de cálculos innecesarios.

4voto

Geniuslink Puntos 126

Desde el glmnet Página de ayuda de R:

lambda: Una secuencia 'lambda' suministrada por el usuario. El uso típico es hacer que el programa calcule su propia secuencia 'lambda' basada en nlambda' y 'lambda.min.ratio'. Si se proporciona un valor de lambda' anula esto. ADVERTENCIA: utilizar con cuidado. No suministrar suministrar un solo valor para 'lambda' (para las predicciones después de CV utilice 'predict()' en su lugar). En cambio, la oferta es cada vez menor secuencia de valores 'lambda'. glmnet' se basa en sus calentamientos para la velocidad, y su a menudo más rápido para encajar una ruta completa que calcular un solo ajuste.

Intenta predecir desde cv.glmnet en lugar de glmnet.

3voto

user777 Puntos 10934

Este problema se produce porque no se está utilizando predict ; en cambio, está intentando entrenar un modelo sólo con un valor lambda. La documentación de glmnet ( ?glmnet ) aconseja encarecidamente no hacerlo.

lambda : Un usuario suministrado lambda secuencia. El uso típico es hacer que el programa calcule su propia lambda secuencia basada en nlambda y lambda.min.ratio . Suministrando un valor de lambda anula esto. ADVERTENCIA: utilizar con cuidado. No suministre un solo valor para lambda (para las predicciones tras el uso de CV predict() en su lugar). Suministre en su lugar un secuencia decreciente de lambda valores. glmnet se basa en sus calores de la velocidad, y a menudo es más rápido ajustar una ruta completa que calcular un solo ajuste.

No es necesario calcular un nuevo modelo para obtener predicciones. Basta con utilizar el predict especificando el valor de lambda que se utilizará para las predicciones.

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