R-교차검증

1 minute read

교차검증(K-Fold Cross Validation)

K 개의 fold를 만들어서 진행하는 교차 검증
사용이유

  • 총 데이터 갯수가 적은 데이터 셋에 대하여 정확도를 향상시킬 수 있음
  • 기존에 Training, Validation, Test 세 개의 집단으로 분류하는 것보다, Trainning 과 Test로만 분류할 때 학습 데이터 셋이 더 많기 때문이다.
  • 데이터 수가 적은데 검증과 테스트에 데이터를 더 뺏기면 underfitting 등 성능이 미달되는 모델이 학습됨


참조: ResearchGate

과정

  • 기존 과정과 같이 Trainning Set과 Test Set을 나눈다.
  • Trainning 을 K 개의 fold로 나눈다.
  • 한 개의 Fold에 있는 데이터를 다시 K 개로 쪼갠다음, K-1개는 Trainning Data, 마지막 한개는 Validation Data Set으로 지정한다.
  • 모델을 생성하고 예측을 진행하여, 이에 대한 에러값을 추출한다.
  • 다음 Fold에서는 Validation 셋을 바꿔서 지정하고, 이전 Fold에서 Validation 역할을 했던 Set은 다시 Trainning set으로 활용한다.
  • 이를 K번 반복한다.

참조: nomeyet 블로그

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#K Fold Cross Validation
#패키지 설치 및 불러오기
install.packages("cvTools")
library(cvTools)

#K Fold Data 만들기
set.seed(12)
cross<-cvFolds(n=6,K=3,R=1,type="random")
cross

#Data 확인 및 가공
str(cross)
names(cross)

cross$subsets
cross$which

cross$subsets[cross$which==1,1]
cross$subsets[cross$which==2,1]
cross$subsets[cross$which==3,1]
cross

#K Fold Cross Validation Setting
set.seed(123)
cross<-cvFolds(n=nrow(iris),K=3,R=1,type="random")
cross

acc<-numeric()
cnt<-1
r=1
k=1:3

#K Fold Cross Validation 수행
for(i in k){
  idx<-cross$subsets[cross$which==i,r]
  #cat("test:",i,"검정데이터\n")
  #print(iris[idx,])
  test<-iris[idx,]
  for(j in k[-1]){
    idx<-cross$subsets[cross$which==j,r]
    #cat("test:",i,"훈련데이터\n")
    train<-iris[idx,]
    model<-naiveBayes(Species~.,data=train)
    pred<-predict(model,test)
    t<-table(pred,test$Species)
    acc[cnt]<-(t[1,1]+t[2,2]+t[3,3])/sum(t)
    cnt<-cnt+1
  }
}
acc
mean(acc)

결과:



참조: 원본코드
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Categories:

Updated:

Leave a comment