더북(TheBook)

테스트 데이터의 분리

데이터를 불러오는 작업이 끝나고 나면 곧바로 테스트 데이터Test Data를 전체 데이터에서 분리해야 한다.1 만약 테스트 데이터를 데이터의 형태를 살펴보는 데이터 탐색에 사용하거나 모델링 단계에서 사용해버리면 테스트 데이터에 대한 정보를 모델러가 미리 알게 되어버릴 가능성이 있다. 그렇게 되면 미지의 새로운 데이터라는 테스트 데이터로써의 의미가 퇴색된다.

데이터 분리에는 createDataPartition( )을 사용한다. createDataPartition( )은 Y 값을 고려한 데이터의 분할을 지원하므로 생존자survived와 사망자dead의 수가 훈련 데이터와 테스트 데이터 간에 일정하게 유지된다.

아래 코드에서 set.seed(137)은 난수 생성 시 seed를 지정한 것이다. 이 값을 지정하는 이유는 데이터 불러들이기부터 테스트 데이터 분할까지의 과정을 혹시라도 여러 번 반복할 일이 있을 때 항상 같은 데이터가 훈련 데이터와 테스트 데이터로 분리되게 하기 위함이다. 만약 seed를 지정하지 않으면 데이터를 분리 시마다 매번 다른 데이터가 훈련 데이터로 지정되게 되고, 모델링 과정에 훈련 데이터가 계속 바뀌면 모델 성능이 계속 변하는 등 혼란이 있을 수 있다.

> library(caret)
> set.seed(137)
> test_idx <- createDataPartition(titanic$survived, p=0.1)$Resample1
> titanic.test <- titanic[test_idx, ]
> titanic.train <- titanic[-test_idx, ]
> NROW(titanic.test)
[1] 131
> prop.table(table(titanic.test$survived))
     dead  survived
0.6183206 0.3816794
> NROW(titanic.train)
[1] 1178
> prop.table(table(titanic.train$survived))
     dead  survived
0.6179966 0.3820034

코드 수행 결과를 보면 총 131행의 테스트 데이터와 1,178행의 훈련 데이터가 구해졌음을 알 수 있다. 사망자dead와 생존자survived 비율 역시 약 61% : 38%로 일정하게 유지되고 있다.

데이터 분리가 끝나면 이후 단계에서 사용이 편리하도록 저장해놓는다. 다음 코드는 titanic, titanic.test, titanic.train 데이터를 titanic.RData라는 파일에 저장한다.

> save(titanic, titanic.test, titanic.train, file="titanic.RData")

1 이 책에서는 데이터 정제를 먼저 하고 나서 테스트 데이터를 분리했지만, 데이터를 분리한 다음 정제하는 방법을 택할 수도 있다.

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