류동균의 R 공부방입니다.
K-겹 교차검증(K- fold Cross Validation) 본문
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에 대해 알아보았다. 기회가 된다면 다른 교차검증 방법들도 블로그에 적어볼 예정이다.
'Data Analysis' 카테고리의 다른 글
서울시 먹거리분석 #2 (0) | 2019.10.16 |
---|---|
서울시 먹거리분석 #1 (0) | 2019.10.16 |
캐글(Kaggle) (0) | 2019.09.28 |
혼동행렬(Confusion Maxtrix) (0) | 2019.09.22 |
R로 카카오톡 채팅 분석하기 #1 (텍스트마이닝, 비정형데이터의 정형화) (0) | 2019.08.31 |