ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 100
    ridge.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.coef

    lasso.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]

     

    댓글

by KUKLIFE