glmnet을 해석하는 방법?


36

약 60 개의 예측 변수와 30 개의 관측치가있는 다변량 선형 회귀 모형을 적합 시키려고하기 때문에 p> n 때문에 정규 회귀 분석에 glmnet 패키지를 사용하고 있습니다.

나는 문서와 다른 질문을 겪었지만 여전히 결과를 해석 할 수 없습니다. 여기에는 샘플 코드가 있습니다 (예측 자 20 명과 단순화하기 위해 10 개의 관측치가 있음).

num rows = numobservs 및 num cols = num predictors 및 반응 변수를 나타내는 벡터 y를 가진 행렬 x를 만듭니다.

> x=matrix(rnorm(10*20),10,20)
> y=rnorm(10)

알파를 기본값으로 유지하는 glmnet 모델에 적합합니다 (올가미 패널티의 경우 1).

> fit1=glmnet(x,y)
> print(fit1)

람다 값이 감소함에 따라 다른 예측을 얻는다는 것을 이해합니다 (즉, 페널티)

Call:  glmnet(x = x, y = y) 

        Df    %Dev   Lambda
  [1,]  0 0.00000 0.890700
  [2,]  1 0.06159 0.850200
  [3,]  1 0.11770 0.811500
  [4,]  1 0.16880 0.774600
   .
   .
   .
  [96,] 10 0.99740 0.010730
  [97,] 10 0.99760 0.010240
  [98,] 10 0.99780 0.009775
  [99,] 10 0.99800 0.009331
 [100,] 10 0.99820 0.008907

이제 베타 값이 예를 들어 glmnet

> predict(fit1,type="coef", s = 0.008907)

21 x 1 sparse Matrix of class "dgCMatrix"
                  1
(Intercept) -0.08872364
V1           0.23734885
V2          -0.35472137
V3          -0.08088463
V4           .         
V5           .         
V6           .         
V7           0.31127123
V8           .         
V9           .         
V10          .         
V11          0.10636867
V12          .         
V13         -0.20328200
V14         -0.77717745
V15          .         
V16         -0.25924281
V17          .         
V18          .         
V19         -0.57989929
V20         -0.22522859

대신에 람다를 선택하면

cv <- cv.glmnet(x,y)
model=glmnet(x,y,lambda=cv$lambda.min)

모든 변수는 (.)입니다.

의심과 질문 :

  1. 람다를 선택하는 방법에 대해 잘 모르겠습니다.
  2. 다른 모델에 맞게 비 (.) 변수를 사용해야합니까? 내 경우에는 가능한 한 많은 변수를 유지하고 싶습니다.
  3. p- 값, 즉 어떤 변수가 반응을 유의하게 예측하는지 어떻게 알 수 있습니까?

통계 지식이 부족하여 죄송합니다. 도움을 주셔서 감사합니다.


아마도 CRAN 패키지 hdi를 살펴보면 , 고차원 모델에 대한 추론을 제공 할 수 있습니다.
Tom Wenseleers

사용 된 방법에 대한 자세한 설명은이 문서를 참조하십시오 : projecteuclid.org/euclid.ss/1449670857
Tom Wenseleers

답변:


40

직관적이지 않은 사실이 있습니다. 실제로 glmnet에 람다의 단일 값을 부여해서는 안됩니다. 여기 문서 에서 :

람다에 단일 값을 제공하지 마십시오 (CV 후 예측의 경우 predict () 대신 사용). 대신 감소하는 람다 값 시퀀스를 제공하십시오. glmnet은 속도를 높이기 위해 따뜻하게 시작하며 단일 경로를 계산하는 것보다 전체 경로를 결정하는 것이 더 빠릅니다.

cv.glmnet예제에서 언급했듯이 람다를 선택하는 데 도움이됩니다. glmnet 패키지의 저자는 cv$lambda.1se대신에 제안 cv$lambda.min하지만 실제로는 후자에서 성공했습니다.

cv.glmnet을 실행 한 후 glmnet을 다시 실행할 필요가 없습니다! 그리드 ( cv$lambda) 의 모든 람다 는 이미 실행되었습니다. 이 기술을 "따뜻한 시작"이라고하며 자세한 내용은 여기를 참조하십시오 . 웜 스타트 기술은 도입부에서 해석하여 다른 최적화 문제 (예 : 람다가 큰 glmnet)의 솔루션을 이후 최적화 문제 (예 : 람다가 더 작은 glmnet)의 시작 값으로 사용하여 반복 방법의 실행 시간을 줄입니다. ).

에서 원하는 런을 추출하려면 다음을 cv.glmnet.fit시도하십시오.

small.lambda.index <- which(cv$lambda == cv$lambda.min)
small.lambda.betas <- cv$glmnet.fit$beta[, small.lambda.index]

개정 (2017 년 1 월 28 일)

위에서 한 것처럼 glmnet 객체를 해킹 할 필요가 없습니다. @ 걸릴 아래 alex23lemm의 조언과 통과 s = "lambda.min", s = "lambda.1se"또는 다른 어떤 수를 (예를 들어, s = .007모두) coefpredict. 계수와 예측은 교차 검증에 의해 설정된이 값에 따라 달라집니다. 재현성을 위해 씨앗을 사용하십시오! "s"in coef및을 제공하지 않으면 predict기본값 인을 사용 한다는 것을 잊지 마십시오 s = "lambda.1se". 작은 데이터 상황에서 더 잘 작동하는 것을 본 후에 그 기본값으로 예열했습니다.s = "lambda.1se"또한 더 많은 정규화를 제공하는 경향이 있으므로 알파> 0으로 작업하는 경우보다 포용 적 인 모델로 향하는 경향이 있습니다. plot.glmnet을 사용하여 s의 숫자 값을 선택하여 사이의 어딘가에 도달 할 수도 있습니다 (x 축의 값을 지수화하는 것을 잊지 마십시오!).


1
고맙습니다! 이것은 도움이 될 것입니다 ... 2 번과 3 번 문제에 대한 답이 있습니까?
앨리스

3
걱정하지 마세요. (.)는 0을 나타냅니다. Lasso와 함께 갔기 때문에 "스파 스"솔루션을 원한다고 지정했습니다 (예 : 많은 0). 모두 값을 가지려면 alpha = 0으로 설정하십시오. 이제 올가미에서 릿지 회귀로 이동했습니다. glmnet의 p- 값은 개념적으로 까다 롭습니다. 예를 들어, "올가미에 대한 p- 값"을 검색하면 최근의 많은 연구와 토론이 표시됩니다. 저자는 p- 값이 올가미 및 능선 회귀와 같은 편향 회귀에 적합하지 않다고 주장한 한 계정 (출처 기억 상실증)을 읽었습니다.
Ben Ogorek

6
최소 cvm을 제공하는 람다 값과 관련된 계수를 추출하는 다른 방법은 다음과 같습니다.small.lambda.betas <- coef(cv, s = "lambda.min")
alex23lemm

1
@BenOgorek, 훌륭한 업데이트! 또 다른 유용한 참조는 Friedman J, Hastie T, Hoefling H, Tibshirani R입니다. Pathwise coordinate optimization. 응용 통계의 연대기. 2007; 2 (1) : 302–332. ( arxiv.org/pdf/0708.1485.pdf )
dv_bn 2016 년

1
@erosennin에서 cv.glmnet의 람다 인수를 확인하십시오. "선택적인 사용자 제공 람다 시퀀스. 기본값은 NULL이며 glmnet은 자체 시퀀스를 선택합니다." 웜 스타트 원리를 사용하고 관심있는 범위로 감소하기 전에 더 큰 람다 값으로 시퀀스를 시작하려고합니다.
Ben Ogorek

2

Q1) 람다 선택 방법을 잘 모르겠습니다. Q2) 다른 모델에 적합하도록 비 (.) 변수를 사용해야합니까? 내 경우에는 가능한 한 많은 변수를 유지하고 싶습니다.

@ BenOgorek의 위대한 대답에 따라 일반적으로 피팅은 전체 람다 시퀀스를 사용하도록 허용 한 다음 최적 계수를 추출 할 때 람다.

아래 세 가지주의 사항을 따르는 한 정규화에 맞서거나 모델을 조정하지 마십시오. 변수를 생략하면 전체적인 형벌이 낮아지기 때문입니다. 경고는 다음과 같습니다.

  1. 정규화 된 계수가 의미가 있으려면 먼저 변수의 평균과 표준 편차를 명시 적으로 정규화했는지 확인하십시오 scale(). 에 의존하지 마십시오 glmnet(standardize=T). 정당화를 위해 Lasso 이전의 표준화가 실제로 필요한가?를 참조하십시오 . ; 기본적으로 값이 큰 변수는 정규화시 불공정하게 처벌 될 수 있습니다.

  2. 재현 할 수 있도록 set.seed여러 랜덤 시드로 실행 하고 정규화 된 계수의 안정성을 확인하십시오.

  3. 덜 엄격한 정규화, 예를 들어 더 많은 변수가 포함되도록하려면 간단한 릿지 대신 알파 <1 (즉, 적절한 탄성 그물)을 사용하십시오. 난 당신이 그렇게 할 거라면 당신은, 당신은 crossvalidation를 사용해야합니다, 즉 사용하는 hyperparameter 알파와 회귀 오류를 overfitting 방지하기 위해 다음, 0에서 1로 알파를 쓸어 제안 cv.glmnet()간단한보다는 glmnet():

.

for (alpha in c(0,.1,.3,.5,.7,.9,1)) {
  fit <- cv.glmnet(..., alpha=alpha, nfolds=...)
  # Look at the CVE at lambda.1se to find the minimum for this alpha value...
}

CV를 사용하여 이러한 그리드 검색을 자동화하려면 직접 코딩하거나 glmnet 위에 캐럿 패키지를 사용하십시오. 캐럿은 이것을 잘합니다. 들어 cv.glmnet nfolds는 대형의 경우 매개 변수 값, 3 데이터 세트가 작은 경우 (최소), 또는 5 또는 10을 선택합니다.

Q3) p- 값, 즉 어떤 변수가 반응을 유의하게 예측하는지 어떻게 알 수 있습니까?

의미가 없습니다 . glmnet 모델에서 회귀 계수에 대한 통계 요약 정보를 얻는 것이 바람직하지 않은 이유 에 자세히 설명 된대로 ?

그냥하자 cv.glmnet()자동으로 변수 선택을한다. 위의 경고와 함께. 물론 응답 변수의 분포는 정상이어야합니다 (사용한다고 가정 family='gaussian').


매우 유용한 의견에 감사드립니다! 또한 변수 표준화 자체가 glmnet (standardize = T)을 사용하는 것보다 작동하는 것 같습니다.
Michelle

cvglmnet에서 반환 한 베타 값에 대해 @smci 질문이 있습니다. 시도한 람다 값의 각 그리드 지점에서 베타 값이라는 것을 알고 있습니다. 그러나 각 람다 값에 대해 반환되는 베타 값은 (1) 10 배 (평균 10 배 CV를 사용한 것으로 가정)의 평균 계수 값, (2) 최상의 정확도를 제공 한 배의 베타 값 또는 (3) 전체 데이터 세트에서 모델을 다시 실행 하시겠습니까?
Michelle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.