변수 선택을 위해 R의 lars (또는 glmnet) 패키지에서 LASSO 사용


39

이 질문에 약간의 기초가 있다면 미안합니다.

R의 다중 선형 회귀 모델에 LASSO 변수 선택을 사용하려고합니다. 15 개의 예측 변수가 있는데 그중 하나는 범주 형입니다 (문제를 일으킬 수 있습니까?). 내 와 설정 한 후 다음 명령을 사용합니다.yxy

model = lars(x, y)
coef(model)

내 문제는 내가 사용할 때 coef(model)입니다. 이렇게하면 매 15 개의 예측 변수가 추가 된 15 개의 행이 포함 된 행렬이 반환됩니다. 그러나 어떤 모델을 선택해야하는지에 대한 제안은 없습니다. 내가 놓친 것이 있습니까? 하나의 " 최고의 "모델 만 반환하도록 lars 패키지를 얻을 수있는 방법이 있습니까?

glmnet대신 사용 을 제안하는 다른 게시물 이 있지만 더 복잡해 보입니다. 동일한 및 사용하여 다음과 같이 시도 합니다. 내가 여기서 뭔가를 놓친 적이 있습니까? : yxy

cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")

마지막 명령은 내 변수 목록을 반환하며 대부분은 계수가 있지만 대부분은 0입니다. 이것이 LASSO에 의해 선택된 " 최고 "모델 의 올바른 선택 입니까? 그런 다음 계수가있는 모든 변수에 선형 모델을 not=0맞추면 계수 추정치가 매우 비슷하지만 약간 다릅니다. 이 차이에 대한 이유가 있습니까? LASSO에서 선택한 이러한 변수를 사용하여 선형 모델을 다시 피팅하고 최종 모델로 사용할 수 있습니까? 그렇지 않으면 유의성에 대한 p- 값을 볼 수 없습니다. 내가 놓친 것이 있습니까?

않습니다

type.gaussian="covariance" 

glmnet다중 선형 회귀 를 사용 하는지 확인하십시오 .

변수의 자동 정규화가 계수에 전혀 영향을 줍니까? LASSO 절차에 상호 작용 용어를 포함시킬 수있는 방법이 있습니까?

이 절차를 변경하여 중요한 추론 / 예측에 실제로 사용될 모델보다 LASSO를 사용하는 방법에 대한 데모로이 절차를 더 많이 사용하려고합니다.

이것을 읽어 주셔서 감사합니다. LASSO / lars / glmnet에 대한 일반적인 의견도 크게 감사하겠습니다.


4
부수적으로, 결과를 해석하려면 lasso에 의해 선택된 변수 세트가 안정적인지 확인하십시오. 이것은 Monte Carlo 시뮬레이션을 사용하거나 자신의 데이터 세트를 부트 스트랩하여 수행 할 수 있습니다.
Frank Harrell

답변:


28

http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.htmlglmnet 의 뛰어난 비네팅 덕분에 사용 이 매우 쉽습니다 (CRAN 패키지 페이지도 확인할 수 있음). 에 대한 가장 좋은 람다 는 엄지 손가락의 규칙을 사용하는 것입니다.glmnet

cvfit <- glmnet::cv.glmnet(x, y)
coef(cvfit, s = "lambda.1se")

대신에 lambda.min.

동일한 작업을 수행하려면 lars손으로해야합니다. 여기 내 해결책이 있습니다

cv <- lars::cv.lars(x, y, plot.it = FALSE, mode = "step")
idx <- which.max(cv$cv - cv$cv.error <= min(cv$cv))
coef(lars::lars(x, y))[idx,]

이것은 정확히 같지 않다는 것을 명심하십시오. 이것은 어떤 시점이 아닌 올가미 매듭 (변수가 들어갈 때)에서 멈추기 때문입니다.

참고 glmnet이제 기본 패키지입니다, 그것은 적극적보다는 이렇게, 유지 lars, 그리고에 대한 질문이되었는지 glmnetlars(사용 된 알고리즘이 다른) 전에 대답했다.

올가미를 사용하여 변수를 선택하고 OLS에 맞추는 것에 대한 귀하의 질문은 진행중인 토론입니다. OLS 용 Google 게시물 올가미와 관련하여 몇 가지 논문이 있습니다. 통계 학습 요소의 저자조차도 가능하다는 것을 인정합니다.

편집 : 여기에 무엇을보다 정확하게 재현하는 코드 glmnet가 있습니다.lars

  cv <- lars::cv.lars(x, y, plot.it = FALSE)
  ideal_l1_ratio <- cv$index[which.max(cv$cv - cv$cv.error <= min(cv$cv))]
  obj <- lars::lars(x, y)
  scaled_coefs <- scale(obj$beta, FALSE, 1 / obj$normx)
  l1 <- apply(X = scaled_coefs, MARGIN = 1, FUN = function(x) sum(abs(x)))
  coef(obj)[which.max(l1 / tail(l1, 1) > ideal_l1_ratio),]

+1 좋은 답변입니다! lambda.min 대신 lambda.1se가 경험의 원칙 인 이유에 대해 자세히 설명해 주시겠습니까?
Erosennin

이것을 4 년 동안 쓰고 (그리고 얼마 동안 올가미를 사용하지 않은) 내 기억은 사라졌습니다. 죄송합니다!
Juancentro

8

올바른 솔루션을 해결했다고 생각하기 때문에 얼마 전부터이 질문으로 돌아갑니다.

mtcars 데이터 셋을 사용한 복제본은 다음과 같습니다.

library(glmnet)
`%ni%`<-Negate(`%in%')
data(mtcars)

x<-model.matrix(mpg~.,data=mtcars)
x=x[,-1]

glmnet1<-cv.glmnet(x=x,y=mtcars$mpg,type.measure='mse',nfolds=5,alpha=.5)

c<-coef(glmnet1,s='lambda.min',exact=TRUE)
inds<-which(c!=0)
variables<-row.names(c)[inds]
variables<-variables[variables %ni% '(Intercept)']

'변수'는 ​​최상의 솔루션을 해결하는 변수 목록을 제공합니다.


1
코드를 찾고 있는데 "testing"이 아직 정의되지 않았으므로 "final.list <-testing [-removed] #removing variables"코드에 오류가 발생합니다. 개체를 찾을 수 없습니다. "testing"을 사용하는 대신 "cp.list"를 사용하여 코드가 다음과 같아야한다고 가정합니다. final.list <-cp.list [-removed] #removing 변수 final.list <-c (final.list, 중복) 모두 다음 제거 추가 된 그 바르에서 #adding 나중에 올바른 종류와 관련있는 경우 알려주세요

3
`% ni %`<-Negate (`% ni %`); ## 잘못 보입니다. `% ni %`<-Negate (`% in %`); ##는 잘 보인다. stackexchange 포맷터가 엉망인 것 같습니다 ...
Chris

nfolds=5alpha=0.5매개 변수를 어떻게 선택했는지 자세히 설명 할 수 있습니까 ?
colin

7

순방향 선택 단계적 회귀와 비교하면 도움이 될 것입니다 (저자 중 한 명이 다음 사이트에 링크를 참조하십시오 http://www-stat.stanford.edu/~tibs/lasso/simple.html). 이것은 통계 학습의 요소 3.4.4 장 (무료로 온라인으로 제공)에서 사용 된 접근 방식입니다. 나는이 책의 3.6 장이 최소 제곱, 최상의 부분 집합, 올가미 (두 가지 다른 절차) 사이의 관계를 이해하는 데 도움이된다고 생각했다. 또한 계수 t (coef (model)) 및 write.csv의 조옮김을 사용하여 측면의 플롯 (모델) 사본과 함께 Excel에서 열 수 있습니다. 최소 제곱 추정값이 포함 된 마지막 열을 기준으로 정렬 할 수 있습니다. 그런 다음 각 단계별 단계에서 각 변수가 추가되는 방법과 결과로 계수가 어떻게 변하는 지 명확하게 확인할 수 있습니다. 물론 이것은 전체 이야기는 아니지만 시작이 되길 바랍니다.


3

larsglmnet원시 행렬에서 작동합니다. 교호 작용 항을 포함 시키려면 행렬을 직접 구성해야합니다. 이는 상호 작용 당 하나의 열을 의미합니다 (요소가있는 경우 요소 당 수준 당). lm()그것이 어떻게 작동하는지 살펴보십시오 (경고 : 용이 있음).

지금하기 위해서는 다음과 같이하십시오 : 상호 작용 용어를 수동으로 만들려면 다음과 같이 할 수 있습니다 (그러나 느릴 수 는 없습니다 ).

int = D["x1"]*D["x2"]
names(int) = c("x1*x2")
D = cbind(D, int)

그런 다음 이것을 lars로 사용하려면 ( y차는 것이 있다고 가정 ) :

lars(as.matrix(D), as.matrix(y))

다른 질문에 더 도움을 드리겠습니다. lars가 나에게 슬픔을 주었고 웹과 문서의 문서가 매우 얇기 때문에 이것을 발견했습니다.


2
"경고 : 용이있다"이것은 매우 쉽다 model.matrix().
Gregor

2

LARS는 전체 솔루션 경로를 해결합니다. 솔루션 경로는 부분적으로 선형입니다. 솔루션이 변경되는 유한 한 "노치"포인트 (즉, 정규화 매개 변수 값)가 있습니다.

따라서 솔루션의 매트릭스는 가능한 모든 솔루션입니다. 반환되는 목록에서 정규화 매개 변수의 값도 제공해야합니다.


답변 주셔서 감사합니다. 정규화 매개 변수의 값을 표시하는 방법이 있습니까? 또한이 매개 변수를 기반으로 솔루션 중에서 선택할 수있는 방법이 있습니까? (또한 매개 변수는 람다?)
James

구간 별 선형성이 선이 수평임을 의미하는 것은 아니므로 솔루션이 람다로 항상 변경됩니다. 예를 들어, 예측을 위해 하나뿐만 아니라 람다 값의 눈금을 가질 것이다 에서 뿐만 아니라 사이 매듭. 매듭 사이의 특정 지점이 가장 우수한 예측 성능을 제공 할 수 있습니다.
Richard Hardy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.