SW/R

R : K-fold Cross Validation ( 개념 및 예제 )

얇은생각 2019. 3. 22. 07:30
반응형

K-fold Cross Validation

오직 하나의 분류 실험만으로 충분할까요? Test 데이터셋을 다르게 만들면 accuracy가 달라질 것입니다. 따라서 Test 데이터셋이 어떻게 구성되었는가에 따라 accuracy가 원래 성능보다 높거나 낮게 나올 수도 있습니다. 그렇다면 어떻게 해야 분류 모델 또는 분류 알고리즘의 성능을 보다 정확히 알 수 있을까요?


데이터셋의  K-fold partition을 생성합니다. 각각의 k의 실험에서 훈련을 위해 k-1 부분을 테스팅용으로 남기는 방식으로 진행합니다. 보통 k는 10으로 많이 사용합니다.  델(or 알고리즘)의 정확도는 각 fold의 정확도들의 평균으로 계산합니다.


K-fold Cross Validation 



평균을 구하는 식


K-fold Cross Validation 





3-fold cross validation

모든 클래스에서 균등한 비율(33%)의 테스트 사례를 취합합니다.


K-fold Cross Validation 





R code : 5-fold cross validation (iris 데이터 실습)

데이터를 총 5 등분으로 나누어 데이터의 정확도를 측정합니다. 그리고 총 5개의 정확도에 대한 평균을 나타내고 있습니다. 이렇게 정확도를 구한다면 더욱 정확한 값을 구할 수 있습니다. 아래 코드를 참조하세요.


require("class")
# 필요한 패키지를 로딩중입니다: class
# get fold no for each rows
group.1 <- cut(seq(1,50),breaks=5,labels=FALSE)
group.2 <- cut(seq(51,100),breaks=5,labels=FALSE)
group.3 <- cut(seq(101,150),breaks=5,labels=FALSE)
fold <- c(group.1, group.2, group.3)
acc <- c() # accuracy for each fold
for (i in 1:5){
ds.tr <- iris[fold != i, 1:4]
ds.ts <- iris[fold == i, 1:4]
cl.tr <- factor(iris[fold != i, 5])
cl.ts <- factor(iris[fold == i, 5])
pred <- knn(ds.tr, ds.ts, cl.tr, k = 3)
acc[i] <- mean(pred==cl.ts) # 예측 정확도
}
acc # accuracy of 5 fold
# [1] 0.9666667 0.9666667 0.9333333 0.9666667 1.0000000
mean(acc) # mean accuracy of 5 fold
# [1] 0.9666667


반응형