본문 바로가기

회사생활/R

Train vs. Validation vs. Test Data

Train vs. Validation vs. Test Data




데이터를 구하고 나서 분석을 시작할 때 대부분 처음 하는 작업은 데이터를 3등분으로 나누는 작업이다.


-


Train Data

분석 모델을 만들기 위한 학습용 데이터이다.


Validation Data

여러 분석 모델 중 어떤 모델이 적합한지 선택하기 위한 검증용 데이터이다.


Test Data

최종적으로 선택된 분석 모델이 얼마나 잘 작동하는지 확인하기 위한 결과용 데이터이다.


-


3등분으로 나누는 비율은 대체적으로 6 : 2 : 2 를 가장 많이 쓰는데, 이렇게 나누는 방법을 Simple Validation 이라고 한다.

Simple Validation 외에 k-Fold Validation 이나 Leave-One-Out Validation 방법도 있다.


일단 Simple Validation을 위해 6 : 2 : 2, 즉 3 : 1 : 1 로 데이터를 랜덤하게 나누는 방법을 소개하겠다.




(1) 시계열 데이터가 아닌 경우


1.  재현성을 위해 seed를 설정해준다.


이 부분은 랜덤성이 있는 코드를 다른 사람이 실행해도 똑은 결과가 나오게, 재현할 수 있게 해준다.

(1234 대신 아무 숫자라 본인이 원하는 대로 설정해도 된다.)

set.seed(1234)



2.  index를 만들어 준다.


iris 데이터 개수만큼 idx를 만들어 주는 코드이다. idx는 train, valid, test 3가지 값으로 이루어져 있는데 6 : 2 : 2 비율로 구성된다.

idx <- sample(x = c("train", "valid", "test"),
              size = nrow(iris),
              replace = TRUE,
              prob = c(3, 1, 1))


3.  데이터를 분리한다.

idx가 train인 시퀀스와 같은 행 번호의 iris 데이터를 train에 넣어주는 코드이다.
train <- iris[idx == "train", ]

위 코드를 쉽게 이해하려면 아래 코드 먼저 실행해보자. TRUE 또는 FALSE로 이루어진 150개의 값이 출력될 것이다.
idx == "train"


R에서 데이터를 인덱싱 할 때 iris[ , ] 와 같이 대괄호를 사용하는데 TRUE인 것만 인덱싱한다는 의미이다.

즉, iris 데이터 중 idx == "train" 이 TRUE인 1, 7, 8, 10, ... 의 행 번호를 가진 부분만 train에 할당한다.

(인덱싱도 조만간 포스팅 하겠다.)


valid와 test도 똑같이 처리해보자.

valid <- iris[idx == "valid", ]
test <- iris[idx == "test", ]



4.  분리된 데이터를 확인한다.


데이터의 행열을 확인하는 코드이다.

dim(train)
dim(valid)
dim(test)

위 실행하면 각 데이터의 행수와 열수가 출력되는데 아래와 같을 것이다.

> dim(train)
[1] 99  5
> dim(valid)
[1] 27  5
> dim(test)
[1] 24  5


150 행과 5개 열로 이루어진 iris 데이터를 train 99건, validation 27건, test 24건으로 나누었다고 이해하면 된다.

-
-

(2) 시계열 데이터인 경우


시계열 데이터인 경우 랜덤하게 데이터를 나누지 않고 가장 오래된 데이터를 Train Data로 하고 그 다음 최근 데이터를 Validation Data, 가장 최신의 데이터를 Test Data로 삼는다.

그리고 이때는 랜덤성을 갖지 않기 때문에 set.seed 함수를 사용할 필요도 없다. 


iris 데이터가 시계열 데이터이고, 시간순으로 내림차순 정렬되어 있다고 가정하자.



1.  index를 만들어 준다.


iris 데이터 개수만큼 idx를 만들어 주는 코드이다. 시간 순서대로 train > valid > test 값을 6 : 2 : 2 비율로 넣어준다.

idx <- c(rep("train", round(nrow(iris)*0.6)),
         rep("valid", round(nrow(iris)*0.2)),
         rep("test", round(nrow(iris)*0.2)))


2.  데이터를 분리한다.

데이터를 inx 기준으로 3등분 하는 코드이다.
train <- iris[idx == "train", ]
valid <- iris[idx == "valid", ]
test <- iris[idx == "test", ]



3.  분리된 데이터를 확인한다.


데이터의 행열을 확인하는 코드이다.

dim(train)
dim(valid)
dim(test)

위 실행하면 각 데이터의 행수와 열수가 출력되는데 아래와 같을 것이다.

> dim(train)
[1] 90  5
> dim(valid)
[1] 30  5
> dim(test)
[1] 30  5


150 행과 5개 열로 이루어진 iris 데이터를 train 90건, validation 30건, test 30건으로 나누었다고 이해하면 된다.





#dataset#index#k-Fold#LOOCV#r#rcode#rsource#rsourcecode#rstudio#R코드#SimpleValidation#test#train#validation#데이터나누기#데이터셋#시계열데이터#인덱싱#테스트데이터#트레이닝데이터