본문 바로가기
R프로그래밍

[R] LASSO, Ridge 적합하기

by 미스터탁 2022. 12. 11.

LASSO와 Ridge는 회귀 계수 축소법으로서, 일반적으로는 다중 선형 회귀 보다는 좋은 성능을 보인다.

 

간략하게 Ridge와 LASSO의 cost function을 보고 R코드를 첨부하도록 하겠다.

다중 선형 회귀 풀고자하는 문제는 다음과 같다.

 

여기서, 회귀 계수 축소법은 Penalty항을 추가한다.

 

Ridge의 cost function은 다음과 같다. lambda는 hyper-paramter이고 SSE를 최소화 하면서 회귀계수의 제곱의 합을 함께 최소화 시킨다.

 

Ridge는 analytic한 solution을 가지고 있어, 다음과 같이 해를 구할 수 있다. 

더불어 Ridge를 통해 추출된 회귀계수들은 labmda가 커짐에 따라 0에 수렴하지만 완전히 0이 되지는 않는다라는 특징이 있다.

 

 

반면 LASSO의 경우에는 다음과 같은 cost funciton을 최소화 시킨다. SSE와 함께 회귀 계수의 절대값의 합을 함께 최소화 시킨다. 

Ridge와는 다르게 LASSO의 경우, 한번에 해를 구할 수 없어 numeric하게 해를 찾아간다. 그러므로 해를 구하는 속도는 Ridge보다 느리다. 더불어, labmda의 크기에 따라 회귀 계수가 완전히 0이 된다. lambda가 무한히 커지면 회귀 계수는 모두 0이 되므로, lambda를 적절히 조절해야한다.

 

다음은 R코드이다. glmnet 패키지를 사용한다.

코드는 매우 간단한데, 주의할점은 glmnet함수 내에서 alpha값이 1인 경우가 LASSO,  0인 경우가 Ridge이다. 그 사이 값 예를 들어, 0.3을 넣을 수도있는데 이는 LASSO와 Ridge의 결합 형태인 ElasticNet을 의미한다.모델을 적합 시킬 때에는 데이터가 matrix형태여야한다. 만약 에러가 난다면 data.frame형태일 가능성이 높다. 

R에서는 적절히 lambda값을 서치하여 준다. 그래서 '학습데이터'내에서 어느정도 optimal한 lambda값을 추출하여 회귀 계수를 뽑을 수도 있고, 새로운 데이터에 대하여 예측도 가능하다. 아래 코드에서 optimal_labmda값을 임의의로 조절하면 당연히 회귀계수와 예측 값도 달라진다.

install.packages("glmnet")
library(glment)
fit<-glmnet(as.matrix(train),y,alpha = 1) # Input variable과, y를 구분해서 넣어야 함
optimal_labmda<-fit$lambda[length(fit$lambda)] # labmda 추출
ss<-coef(fit,s=optimal_labmda) #labmda에 따른 회귀 계수 추출
pry<-predict(fit,as.matrix(valid),s=optimal_labmda) # lambda값을 활용해 validation 데이터 예측
반응형

댓글