더북(TheBook)

10겹 교차 검증의 3회 반복 수행

다음은 createMultiFolds(titanic.train$survived, k=10, times=3) 결과의 일부를 보여준다.

> createMultiFolds(titanic.train$survived, k=10, times=3)
$Fold01.Rep1
[1]    1    2    3    4    5    6    7
[8]    9   10   11   14   16   18   19
...
$Fold02.Rep1
[1]    1    2    3    5    6    8    9
[8]   10   11   12   13   14   15   17
...
$Fold10.Rep1
...
$Fold01.Rep2
...
$Fold02.Rep2
...
$Fold10.Rep3

이 결과 화면에서 Fold01.Rep1은 1번째 반복의 1번째 폴드를 의미하며, 해당 폴드에서 훈련 데이터로 사용할 데이터의 색인 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 14, 16, 18, 19가 저장되어 있다.

따라서 createMultiFolds( )가 반환한 리스트를 순서대로 따라가면서 주어진 색인에 해당하는 행을 훈련 데이터로, 주어진 색인에 없는 행을 검증 데이터로 만들면 10겹 교차 검증의 3회 반복을 위한 데이터가 준비된다.

다음은 이를 구현한 함수다.

create_three_ten_fold_cv <- function() {
  set.seed(137)
  lapply(createMultiFolds(titanic.train$survived, k=10, times=3), function(idx) {
    return(list(train=titanic.train[idx, ],
                validation=titanic.train[-idx, ]))
  })
}

이 함수는 앞서 설명한 모델 등에 어렵지 않게 적용할 수 있다. create_three_ten_fold_cv( )의 결과를 folds에 저장하고 실행하면 된다. 다음은 ctree( )를 사용한 예다.

> folds <- create_three_ten_fold_cv()
> ctree_result <- foreach(f=folds) %do% {
+   model_ctree <- ctree(survived ~ pclass + sex + age + sibsp + parch + fare + embarked,
+                        data=f$train)
+   predicted <- predict(model_ctree, newdata=f$validation, type="response")
+   return(list(actual=f$validation$survived, predicted=predicted))
+ }

> (ctree_accuracy <- evaluation(ctree_result))
[1] "MEAN +/- SD: 0.812 +/- 0.035"
 [1] 0.8119658 0.8034188 0.8135593 0.8305085 0.7881356 0.7966102
 [7] 0.8050847 0.8220339 0.8813559 0.7711864 0.8135593 0.8050847
[13] 0.8050847 0.8632479 0.8119658 0.7881356 0.8135593 0.8644068
[19] 0.8389831 0.7457627 0.8559322 0.8119658 0.8461538 0.7966102
[25] 0.8135593 0.8644068 0.8220339 0.7288136 0.7881356 0.7627119

실행 결과 30개의 결과가 잘 구해졌다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.