ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ISL] 8장 - 연습문제 (R 실습)
    Data Science/Data Science in R 2019. 12. 19. 06:55

    ※ 8장의 연습문제 중 9번, 10번만 진행하였습니다.

     

    문제 원본 : http://faculty.marshall.usc.edu/gareth-james/ISL/ISLR%20Seventh%20Printing.pdf

     

    문제

    ==========================================================================

    9. ISLR 패키지 내 OJ 데이터를 적합시켜 아래의 내용을 해결하시오.

    9(a). 800개의 관측치를 가진 training set과 나머지는 test set으로 나누시오.

    9(b). training settree를 적합시키시오( Putchase는 반응변수, 나머지는 예측변수 )

    9(d). (b)Tree를 그리시오.

    9(e). (b)의 모델을 test set으로 predict 하시오.

    9(f). cv.tree()를 적용하여 최적의 tree size를 결정하시오. 어떤 tree size가 가장 낮은 error rate를 갖는가?

    9(i). 최적의 tree sizePrunning 하시오.

    9(j). 프루닝 이전과 이후의 error rate를 비교하시오.

    9(k). 프루닝 이전과 이후의 test error rate를 비교하시오.

    ==========================================================================

    10. Hiiters Data set 안에 Salary(연봉)을 부스팅을 활용하여 예측하시오.

    10(a). 결측치를 지우고, Salary에 대해 log 변환을 취하시오.

    10(b). 200개의 관측치를 가진 training set을 만들고 나머지는 test set으로 만드시오.

    10(c). shrinkage parameter1000개의 treetraining set으로 boosting을 수행하시오.

    10(g). Bagging을 적용하여 위와 비교하시오.

    ==========================================================================

    해답

    9(a)

    library(ISLR)
    attach(OJ)
    set.seed(1)

    train = sample(dim(OJ)[1], 800)
    OJ.train = OJ[train, ]
    OJ.test = OJ[-train, ]

    9(b)

    library(tree)
    oj.tree = tree(Purchase ~ ., data = OJ.train)
    summary(oj.tree)

    9(d)

    plot(oj.tree)
    text(oj.tree, pretty = 0)

    9(e)

    oj.pred = predict(oj.tree, OJ.test, type = "class")
    table(OJ.test$Purchase, oj.pred)

    - 정분류율 : 0.8296

    9(f)

    cv.oj = cv.tree(oj.tree, FUN = prune.tree)
    cv.oj

    plot(cv.oj$size, cv.oj$dev, type = "b", xlab = "Tree Size", ylab = "Deviance")

    - Tree Size가 6일 때, 가장 error rate가 낮다

    9(i)

    oj.pruned = prune.tree(oj.tree, best = 6)
    oj.pruned

     

    9(j)

    pred.unpruned = predict(oj.tree, OJ.test, type = "class")
    misclass.unpruned = sum(OJ.test$Purchase != pred.unpruned)
    misclass.unpruned/length(pred.unpruned)

    pred.pruned = predict(oj.pruned, OJ.test, type = "class")
    misclass.pruned = sum(OJ.test$Purchase != pred.pruned)
    misclass.pruned/length(pred.pruned)

    - Prunning 결과, Error rate는 조금 올라갔지만 훨씬 단순해졌다.

     

    ==========================================================================

     

    10(a)

    library(ISLR)
    sum(is.na(Hitters$Salary))

    Hitters = Hitters[-which(is.na(Hitters$Salary)), ]
    Hitters$Salary = log(Hitters$Salary)

     

    10(b)

    train = 1:200
    Hitters.train = Hitters[train, ]
    Hitters.test = Hitters[-train, ]

     

    10(c)

    library(gbm)
    set.seed(1)

    pows = seq(-10, -0.2, by = 0.1)
    lambdas = 10^pows
    length.lambdas = length(lambdas)
    train.errors = rep(NA, length.lambdas)
    test.errors = rep(NA, length.lambdas)
    for (i in 1:length.lambdas) {
      boost.hitters = gbm(Salary ~ ., data = Hitters.train, distribution = "gaussian", 
                          n.trees = 1000, shrinkage = lambdas[i])
      train.pred = predict(boost.hitters, Hitters.train, n.trees = 1000)
      test.pred = predict(boost.hitters, Hitters.test, n.trees = 1000)
      train.errors[i] = mean((Hitters.train$Salary - train.pred)^2)
      test.errors[i] = mean((Hitters.test$Salary - test.pred)^2)
    }
    plot(lambdas, train.errors, type = "b", xlab = "Shrinkage", ylab = "Train MSE", 
         col = "blue", pch = 20)

    #Test set에 적합 시

    plot(lambdas, test.errors, type = "b", xlab = "Shrinkage", ylab = "Test MSE", 
         col = "red", pch = 20)

    min(test.errors) #0.254
    lambdas[which.min(test.errors)] # 0.079

    - 람다가 0.079일 때, test error 값이 0.254로 가장 낮은 모습을 보였음

     

    10(g)

    set.seed(1)
    rf.hitters = randomForest(Salary ~ ., data = Hitters.train, ntree = 500, mtry = 19)
    rf.pred = predict(rf.hitters, Hitters.test)
    mean((Hitters.test$Salary - rf.pred)^2)
    plot(lambdas, test.errors, type = "b", xlab = "Shrinkage", ylab = "Test MSE", 
         col = "red", pch = 20)

    min(test.errors) #0.254
    lambdas[which.min(test.errors)] # 0.079

    - 배깅과 부스팅의 결과값이 동일한 모습을 보임

    댓글

by KUKLIFE