23 votos

Importancia de las variables en GLMNET

Estoy estudiando el uso del lazo como método para seleccionar características y ajustar un modelo predictivo con un objetivo binario. A continuación se muestra un código que estaba jugando con para probar el método con regresión logística regularizada.

Mi pregunta es la siguiente: obtengo un grupo de variables "significativas", pero ¿puedo ordenarlas para estimar la importancia relativa de cada una? ¿Se pueden estandarizar los coeficientes para este propósito de ordenación por valor absoluto (entiendo que se muestran en la escala original de la variable a través del coef función)? En caso afirmativo, ¿cómo hacerlo (utilizando la desviación típica de x e y)? Normalizar los coeficientes de regresión .

CÓDIGO DE MUESTRA:

    library(glmnet)

    #data comes from

#http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic)

    datasetTest <- read.csv('C:/Documents and Settings/E997608/Desktop/wdbc.data.txt',head=FALSE)

#appears to use the first level as the target success
   datasetTest$V2<-as.factor(ifelse(as.character(datasetTest$V2)=="M","0","1"))

#cross validation to find optimal lambda
#using the lasso because alpha=1

    cv.result<-cv.glmnet(       
              x=as.matrix(dataset[,3:ncol(datasetTest)]),
              y=datasetTest[,2],        
              family="binomial",        
              nfolds=10,        
              type.measure="deviance",       
              alpha=1      
              )

#values of lambda used

    histogram(cv.result$lambda)

#plot of the error measure (here was deviance)
#as a CI from each of the 10 folds
#for each value of lambda (log actually)

    plot(cv.result) 

#the mean cross validation error (one for each of the
#100 values of lambda

    cv.result$cvm

#the value of lambda that minimzes the error measure
#result: 0.001909601

    cv.result$lambda.min
    log(cv.result$lambda.min)

#the value of lambda that minimzes the error measure
#within 1 SE of the minimum
#result: 0.007024236

    cv.result$lambda.1se

#the full sequence was fit in the object called cv.result$glmnet.fit
#this is same as a call to it directly.
#here are the coefficients from the min lambda

    coef(cv.result$glmnet.fit,s=cv.result$lambda.1se)

16voto

RexE Puntos 181

Que yo sepa, glmnet no calcula los errores estándar de los coeficientes de regresión (ya que ajusta los parámetros del modelo mediante el descenso cíclico de coordenadas). Por lo tanto, si necesita coeficientes de regresión estandarizados, tendrá que utilizar algún otro método (por ejemplo, glm)

Dicho esto, si las variables explicativas se estandarizan antes del ajuste y glmnet se llama con "standardize=FALSE", entonces los coeficientes menos importantes serán más pequeños que los más importantes - por lo que podría clasificarlos sólo por su magnitud. Esto se hace aún más pronunciado con una contracción no trivial de la cantidad (es decir, lambda distinto de cero)

Espero que esto ayude

9voto

OnesimusUnbound Puntos 1857

Para obtener el coeficiente en un espacio que permita comparar directamente su importancia, hay que normalizarlos. Escribí un nota en Thinklab para discutir la estandarización de los coeficientes de regresión logística.

(Muy) Larga historia corta, yo aconsejo utilizar el Agresti método:

# if X is the input matrix of the glmnet function,
# and cv.result is your glmnet object:
sds <- apply(X, 2, sd)
cs <- as.matrix(coef(cv.result, s = "lambda.min"))
std_coefs <- coefs[-1, 1] * sds

Si ha confiado en la normalización interna mediante glmnet (opción por defecto standardize = TRUE ), estos coeficientes normalizados son en realidad los resultantes de la etapa de ajuste, antes de la retransformación por glmnet en el espacio original (véase otra nota :-) ).

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