Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

류동균의 R 공부방입니다.

K-겹 교차검증(K- fold Cross Validation) 본문

Data Analysis

K-겹 교차검증(K- fold Cross Validation)

R쟁이 2019. 10. 2. 22:07

K-겹 교차검증의 개념과 목적

k-겹 교차검증 이하 K-fold란 데이터를 K개의 data fold로 나누고 각각의 데이터들을 train,test 데이터로 나누어 검증하는 방법이다. 우리는 일반적으로 모델을 구성할때 train,test 데이터를 7:3 혹은 8:2 등의 비율로 나누어서 train데이터로 모델을 만들고 test데이터에 적용시킨다. 그러나 K-fold는 train 데이터를 다시 K개의 data fold로 나누어서 train데이터에서 다시 train, test 데이터로 K개 만큼 교차시켜 만들어 검증하는 것이다. K-fold의 목적은 여러번의 교차검증을 통해 모델들의 평균을 구하거나 최적의 모델을 구하는 것이다.

 

기존의 분석 데이터에 적용

이전에 Kaggle에서 Titanic data를 주제로 분석한 내용이 있다.

- Rpubs 타이타닉 데이터 분석 : http://rpubs.com/ryoo/kaggle_titanic

 

RPubs - Kaggle Titanic Data Analysis

 

rpubs.com

Decision Tree 모델을 만들때 K-fold를 적용시켜 모델을 만들어보자.

 

필요한패키지

library(caret) # createFolds

 

K-fold cross validation

# "cv_accuracy_"가 포함된 목록을 리스트에서 제거
rm(list = ls(pattern="cv_accuracy_"))

# data fold 생성 createFolds(), k = number of fold
cv_list <- createFolds(train_set$Survived, k = 5)

# K-fold cross validation model
for(i in 1:length(cv_list)) {
  valid_index <- cv_list[[i]]
  
  # K-fold 에서의 test 데이터
  cv_valid_set <- train_set[valid_index,]
  
  # K-fold 에서의 train 데이터
  cv_train_set <- train_set[-valid_index,]
  
  # Decision Tree 모델 생성
  rpart_m <- rpart(Survived ~ Sex + Age + Pclass, data = cv_train_set)

  # predict 
  rpart_p <- predict(rpart_m, newdata = cv_valid_set, type = "class")
  
  # model acurracy 생성
  assign(paste0("cv_accuracy_",i),sum(cv_valid_set$Survived == rpart_p)/nrow(cv_valid_set))
  
}

# mget() -> "cv_accuracy_"라는 문자가 포함된 데이터들을 하나의 List로 만듬
result_cv <- mget(ls(pattern="cv_accuracy_"))

# acurracy가 가장 높은 모델의 인덱스
index_max <- result_cv %>% as.numeric() %>% which.max()

# acurracy가 가장 높은 모델의 인덱스의 값
result_cv[[index_max]]

다음과 같이 K-겹 교차검증을 통해 가장 정확도가 높은 모델을 구해보았다. 교차검증의 기법에는 K-fold 이외에 여러가지 방법들이 있다. 오늘은 가장 일반적으로 많이 사용되는 K-fold에 대해 알아보았다. 기회가 된다면 다른 교차검증 방법들도 블로그에 적어볼 예정이다.