R-교차검증
교차검증(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을 남겨주세요.
Leave a comment