-
[ISL] 6장 - Ridge&LASSO Regression(R 실습)Data Science/Data Science in R 2019. 12. 18. 21:29
* 이론 : 업로드 예정
* 이어지는 소스코드 : https://kuklife.tistory.com/105?category=853435
* 소스코드 원본 : http://faculty.marshall.usc.edu/gareth-james/ISL
1. Model Matrix 설정
#모델 메트릭스 만들고 시작(Salary를 제외한 나머지 변수는 설명변수)
x=model.matrix(Salary~.,Hitters)[,-1]
y=Hitters$Salary#y는 반응변수2. Ridge Regression
#10 ~ -2까지 등간격으로 자른 후 10의 지수로 쓰겠다.
#패널티 파라미터가 클 때와 작을 때는 민감도 차이가 있음)
grid=10^seq(10,-2,length=100)
ridge.mod=glmnet(x,y,alpha=0,lambda=grid) #alpha가 0이면 릿지를 쓰겠다.(수식이 1-a를 곱하므로(라쏘는 a))
#각각의 col(세로)은 lamda값에 대한 릿지 추정량
#최종적으로 선택할 모델은 출력된 20개의 데이터 중 한개)
dim(coef(ridge.mod)) #결과 : 20 100ridge.mod$lambda[50] #100개의 릿지가 존재하므로 50번째는 11497.57
coef(ridge.mod)[,50] #50번째의 릿지 추정치
#50번째 해당하는 릿지에서 첫번째 원소 제거(인터셉트 제거) 후 나머지 값에 제곱에 합을 취하고 루트(축소하기 위함)
sqrt(sum(coef(ridge.mod)[-1,50]^2))- 50번째 추정치 일 때는 sqrt값이 6.36
ridge.mod$lambda[60]
coef(ridge.mod)[,60]
sqrt(sum(coef(ridge.mod)[-1,60]^2))- 60번째의 sqrt값이 더 큰 것으로 보아 50번째 추정치의 결과가 더 좋음
#s=50은 lamda를 50으로 하겠다.(적절하게 정해진 lamda가 없으므로 임의로 지정한 상태) 즉, 람다가 50일 때 릿지 추정치들
predict(ridge.mod,s=50,type="coefficients")[1:20,]- lambda가 50일 때의 추정치들
- 주어진 lambda가 없으므로, 적절한 결과인지 모른다. 즉, lambda를 찾아야 한다.
2-1. 적절한 Lambda 찾기
set.seed(1)
cv.out=cv.glmnet(x[train,],y[train],alpha=0)
plot(cv.out)
bestlam=cv.out$lambda.min
bestlam- best lambda는 326.0828
ridge.pred=predict(ridge.mod,s=bestlam,newx=x[test,])
mean((ridge.pred-y.test)^2)- 결과는 139856.6, 즉, 줄어드는 모습을 볼 수 있다.
out=glmnet(x,y,alpha=0)
predict(out,type="coefficients",s=bestlam)[1:20,]- 여기서 -에 가까운 것을 변수들을 제거하면 됨
3. Lasso Regression
#라쏘는 람다랑 별로 다를게 없고 알파만 1로 바꿔주면 됨
lasso.mod=glmnet(x[train,],y[train],alpha=1,lambda=grid)
plot(lasso.mod)
set.seed(1)
cv.out=cv.glmnet(x[train,],y[train],alpha=1)
plot(cv.out)
bestlam=cv.out$lambda.min
lasso.pred=predict(lasso.mod,s=bestlam,newx=x[test,])
mean((lasso.pred-y.test)^2)
out=glmnet(x,y,alpha=1,lambda=grid)
lasso.coef=predict(out,type="coefficients",s=bestlam)[1:20,]
lasso.coeflasso.coef[lasso.coef!=0] #라쏘로 11개만 살아남은 상태
3-1. CV로 찾은 lambda값을 Lasso Regression에 적용
bestlam1=cv.out$lambda.1se
lasso.pred1=predict(lasso.mod,s=bestlam1,newx=x[test,])
mean((lasso.pred1-y.test)^2)
lasso.coef1=predict(out,type="coefficients",s=bestlam1)[1:20,]
lasso.coef1 #cof값을 확인해보니 4개가 살아남음(단순한 모델을 원할 땐 위와 같이 사용하면됨)
lasso.coef1[lasso.coef1!=0]'Data Science > Data Science in R' 카테고리의 다른 글
[ISL] 7장 - 비선형모델(Local regression, Smoothing splines, GAM) 이해하기(R 실습) (0) 2019.12.19 [ISL] 6장 - 연습문제 (R 실습) (0) 2019.12.18 [ISL] 6장 - 예측변수 선택(Stepwise, CV)(R 실습) (0) 2019.12.18 [ISL] 3장 - 선형회귀 (0) 2019.10.24 [ISL] 4장 - 분류(R 실습) (0) 2019.10.24