GLMNET의 변수 중요성


18

기능을 선택하고 이진 대상에 예측 모델을 맞추는 방법으로 올가미를 사용하려고합니다. 아래는 정규화 된 로지스틱 회귀 분석을 시도하기 위해 놀고있는 코드입니다.

내 질문은 "유의 한"변수 그룹을 얻는데 각각의 상대적 중요성을 추정하기 위해 순서를 매길 수 있습니까? 이 순위의 목적을 위해 절대 값으로 계수를 표준화 할 수 있습니까 ( coef함수를 통해 원래 가변 스케일로 표시됨을 이해합니다 ) 그렇다면, 그렇게하는 방법 (x와 y의 표준 편차를 사용하여) 회귀 계수 표준화 .

샘플 코드 :

    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)

답변:


14

내가 아는 한 glmnet은 회귀 계수의 표준 오차를 계산하지 않습니다 (순환 좌표 하강을 사용하여 모델 매개 변수에 적합하기 때문에). 따라서 표준화 된 회귀 계수가 필요한 경우 다른 방법 (예 : glm)을 사용해야합니다.

설명 변수가 적합하기 전에 표준화되고 glmnet이 "standardize = FALSE"로 호출되면 덜 중요한 계수가 더 중요한 계수보다 작을 수 있으므로 크기에 따라 순위를 지정할 수 있습니다. 이것은 사소한 양의 수축 (즉, 0이 아닌 람다)으로 더욱 두드러집니다.

도움이 되었기를 바랍니다..


2
감사. 나는 coeff가 원래의 규모로 되돌아 온다고 믿는다. 따라서 크기를 다시 조정해야합니다 (예를 들어 게시 한 기술을 사용하여 가정).
B_Miner

user6129가 맞습니다! 선택한 변수 순위를 매기는 수단이 없습니다. 활발한 연구 분야입니다.
suncoolsu

3
@B_Miner : "standardize = TRUE"로 호출하면 glmnet이 원래 스케일의 계수를 반환합니다. 이를 해결하는 한 가지 방법은 설명 변수를 외부에서 표준화 (예 : "scale ()"함수 사용)하고 "standardize = FALSE"로 glmnet을 호출하는 것입니다. 결과 계수는 중요도를 판단하기 위해 규모별로 순위를 매길 수 있습니다.
예브게니

@suncoolsu : pls 위의 업데이트 된 답변보기
Yevgeny

@ 예브게니 질문이 있습니다. 기술적으로, 'standardize = FALSE'를 설정하고 변수를 직접 표준화하든 'standardize = TRUE'를 사용하든 성능 결과 (예 : 곡선 아래 영역)가 동일해야합니까? (반환되는 베타 계수 만 다릅니다). 이것이 이론적으로 생각하는 것이지만 실제로는 'standardize = TRUE'를 사용할 때 약간 더 나은 결과를 얻습니다. 따라서 계수와 성능이 모두 다릅니다. 이것이 어떻게해야합니까?
Michelle

7

중요도를 직접 비교할 수있는 공간에서 계수를 얻으려면 계수를 표준화해야합니다. 나는 썼다 메모를 로지스틱 회귀 계수의 표준화를 논의하기 위해 Thinklab에.

간단히 말해서, Agresti 방법 을 사용하는 것이 좋습니다 .

# 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

glmnet (기본 옵션 standardize = TRUE)에 의한 내부 표준화에 의존하는 경우 , 이러한 표준화 된 계수는 실제로 원래 공간에서 glmnet에 의해 재 변환되기 전에 피팅 단계에서 나온 계수입니다 ( 다른 참고 사항 :-) 참조 ).


2
std_coefs <- coefs[-1, 1] * sds
b=bσx
Kent Johnson

앙투안-여기에서 나누기가 아닌 곱셈이 올바른지 확인할 수 있습니까?
B_Miner

1
σx+bx+=+(bσx)(xμ)/σx+bσx=x

네, 오타입니다 (코드를 실행하지 않고 예제를 입력하지 마십시오. ;-)) 그것을 잡아 주셔서 감사합니다.
Antoine Lizée

이것은 여부, 정확한 표준화 계수를 제공 glmnet오브젝트가 작성 standardize = TRUE또는 standardize = FALSE네?
James Hirschorn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.