더북(TheBook)

파라미터 튜닝

randomForest( )에는 나무 개수ntree, 각 노드를 자식 노드로 나누는 기준을 정할 때 고려할 변수의 개수mtry 등의 파라미터가 있다. ntree나 mtry는 기본값이 자동으로 잘 부여되지만 모델 성능을 더욱 개선하고 싶다면 이 값들을 조절해볼 수 있다. 이들 파라미터를 정하는 한 가지 방법은 교차 검증을 사용하는 것이다.

ntree와 mtry의 다양한 조합에 대해 모델 성능을 평가해보자. 조합의 목록은 expand.grid( )로 만든다.

표 10-6 파라미터 목록 생성

expand.grid : 가능한 모든 팩터 레벨의 조합을 만든다.

expand.grid(
  ...  # 벡터, Factor 또는 이들을 저장한 리스트
)

반환 값은 Factor의 모든 레벨을 조합한 데이터 프레임이다.

다음은 ntree를 10, 100, 200으로, mtry를 3, 4로 바꿔가면서 조합한 예다.

> (grid <- expand.grid(ntree=c(10, 100, 200), mtry=c(3, 4)))
  ntree mtry
1    10    3
2   100    3
3   200    3
4    10    4
5   100    4
6   200    4

파라미터 조합을 10개로 분할한 데이터에 적용하여 모델의 성능을 평가하는 일을 3회 반복하여 최선의 파라미터를 찾아보자.

library(cvTools)
library(foreach)
library(randomForest)
set.seed(719)
K = 10
R = 3
cv <- cvFolds(NROW(iris), K=K, R=R)

grid <- expand.grid(ntree=c(10, 100, 200), mtry=c(3, 4))

result <- foreach(g=1:NROW(grid), .combine=rbind) %do% {
  foreach(r=1:R, .combine=rbind) %do% {
    foreach(k=1:K, .combine=rbind) %do% {
      validation_idx <- cv$subsets[which(cv$which == k), r]
      train <- iris[-validation_idx, ]
      validation <- iris[validation_idx, ]
      # 모델 훈련
      m <- randomForest(Species ~.,
                           data=train,
                           ntree=grid[g, "ntree"],
                           mtry=grid[g, "mtry"])
      # 예측
      predicted <- predict(m, newdata=validation)
      # 성능 평가
      precision <- sum(predicted == validation$Species) / NROW(predicted)
      return(data.frame(g=g, precision=precision))
    }
  }
}

코드에서 foreach 문의 .combine에 rbind를 사용한 점을 눈여겨보기 바란다. foreach( )에 .combine을 지정하지 않으면 반환 값이 리스트 형태가 된다. 여기서는 결과를 데이터 프레임으로 모으려고 rbind를 사용했다. 코드 수행 결과 result에 grid에서의 색인과 성능이 데이터 프레임으로 반환된다.

> result
    g precision
1   1 1.0000000
2   1 1.0000000
3   1 0.9333333
4   1 0.9333333
5   1 1.0000000
...
176 6 0.9333333
177 6 0.9333333
178 6 0.9333333
179 6 0.9333333
180 6 1.0000000

g 값마다 묶어 성능의 평균을 구해보자. ddply( )를 사용한다.

> library(plyr)
> ddply(result, .(g), summarize, mean_precision=mean(precision))
  g mean_precision
1 1      0.9444444
2 2      0.9533333
3 3      0.9533333
4 4      0.9555556
5 5      0.9533333
6 6      0.9555556

가장 높은 성능을 보인 조합은 g=4일 때와 g=6일 때다. 파라미터 조합을 grid에서 찾아보면 ntree=10, mtry=4인 경우와 ntree=200, mtry=4인 경우임을 알 수 있다.

> grid[c(4, 6), ]
  ntree mtry
4    10    4
6   200    4
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.