[ADP] R을 활용한 모형평가 방법(1) - Holdout, K-fold, Boostrap

2020. 8. 2. 15:44ADP | ADsP with R/Knowledge

 분류 분석의 모형을 평가하기 위해서 먼저 raw data에서 모형 구축을 위한 train data와 모형 성과 검증을 위한 test data를 추출한다. 이는 주어진 뎅터에서만 높은 성과를 보이게 되는 Overfitting 문제를 해결하기 위한 단계로 잘못된 가설을 가정하는 2종 오류의 발생을 방지할 수 있다. 이 단계를 위해 사용되는 추출방법이 대표적으로 Holdout method, K-fold Cross Validation, Boostrap이다. 

 

학습용& 훈련용 데이터 추출방법

1. Holdout

 Holdout 방법은 일반적인 train_test_split방법으로 전체 데이터중 70%는 train data로, 나머지 30%는 test data로 분리해서 사용하는 것이다. 이런 방식을 통해서 검증용 자료의 결과가 분류모형에 영향을 미치지 않고 모형의 성과 측정만을 할 수 있도록 한다. 

 

# data load
data(iris)

# shape
nrow(iris)

set.seed(1234)

# 1: train data, 2: test data
idx <- sample(2,nrow(iris), replace=TRUE, prob=c(0.7,0.3))
trainData <- iris[idx==1,]
testData <- iris[idx==2,]

nrow(trainData)
nrow(testData)

2. K-fold

 K-fold는 Cross-validation(교차검증)의 가장 대표적인 방법이다. 교차검증은 주어진 데이터를 가지고 반복적으로 성과를 측정하여 그 결과를 평균내 분류 분석 모형을 평가하는 방법이다. K-fold는 전체 데이터 사이즈가 동일한 k개의 부분집합으로 나누고 k번째 부분집합을 검증용 자료로, 나머지 k-1개의 부분집합을 훈련용 자료로 사용한다. 

 이를 k번 반복측정하고 각 반복 측정의 결과를 평균낸 값을 최종 평가로 사용한다. 일반적으로 10-fold교차검증을 많이 사용하지만, 데이터의 특성과 부분 집합의 분포에 따라 적절한 k의 선정이 필요하다. 

# load data
data(iris)
set.seed(1234)

# 10-fold cross validation
k = 10  # 10-fold cross validation
iris <- iris[sample(nrow(iris)),] # Randomly shuffle the data
folds <- cut(seq(1,nrow(iris)),breaks = k, labels = FALSE)

# an empty list of length k
trainData = list(0)
testData = list(0)

# insert data to list
for (i in 1:k) {
  testIdx <- which(folds==i, arr.ind=TRUE)
  testData[[i]] <- iris[testIdx, ]
  trainData[[i]] <- iris[-testIdx, ]
}
head(trainData[[1]])
head(testData[[1]])

 

3. Boostrap

 Boostrap은 평가를 반복하는 측면에서 교차검증과 유사하지만, train data를 반복복원추출한다는 점에서 차이가 있다. Bootstrap에는 다양한 방법론이 있지만, 일반적인 예제로 0.632 Boostrap이 있다. 0.632는 data의 개수가 커질수록 전체  row data에서 63.2%만 train data로 추출되고 나머지 36.8%는 test data로 사용된다는 것이다.