아마도 당신은 이런 식으로 생각할 수 있습니다. 'A'클래스에서 90 개, 'B'클래스에서 10 개, 100 개의 샘플이있는 데이터 세트가 있다고 가정합니다. 균형이 잘 잡히지 않은이 디자인에서는 정상적인 무작위 그룹을 만들면 'B'클래스에서 극소수 (또는 EVEN NONE!)로 모델을 만들 수 있습니다. 다른 클래스가 거의 없거나 전혀없는 데이터에 대해 훈련 된 모델을 구축하는 경우 어떻게 희귀 한 그룹을 효과적으로 예측할 수 있을까요? 계층화 된 교차 검증은 무작위 화를 허용하지만 이러한 불균형 데이터 세트에 두 클래스 중 일부가 있는지 확인합니다.
보다 '균형화 된'데이터 세트와 함께 계층화 된 CV 사용에 대한 우려를 완화하기 위해 R 코드를 사용한 예를 살펴 보겠습니다.
require(mlbench)
require(caret)
require(cvTools)
# using the Sonar dataset (208 samples)
data(Sonar)
# see the distribution of classes are very well balanced
prop.table(table(Sonar$Class))
> prop.table(table(Sonar$Class))
M R
0.5336538 0.4663462
# stratified
# set seed for consistency
# caret::createFolds does stratified folds by default
set.seed(123)
strat <- createFolds(Sonar$Class, k=10)
# non-stratified using cvTools
set.seed(123)
folds <- cvFolds(nrow(Sonar), K=10, type="random")
df <- data.frame(fold = folds$which, index = folds$subsets)
non_strat <- lapply(split(df, df$fold), FUN=function(x) x$index)
# calculate the average class distribution of the folds
strat_dist <- colMeans(do.call("rbind", lapply(strat, FUN = function(x) prop.table(table(Sonar$Class[x])))))
non_strat_dist <- colMeans(do.call("rbind", lapply(non_strat, FUN = function(x) prop.table(table(Sonar$Class[x])))))
strat_dist
> strat_dist
M R
0.5338312 0.4661688
non_strat_dist
> non_strat_dist
M R
0.5328571 0.4671429
보시다시피, 균형이 잘 잡힌 데이터 세트에서 접기는 무작위로 비슷한 분포를 갖습니다. 따라서 계층화 된 이력서는 단순히 이러한 상황에서 보증 수단입니다. 그러나 분산 문제를 해결하려면 각 접기의 분포를 확인해야합니다. 어떤 상황에서는 (50-50에서 시작하더라도) 무작위로 우연히 30-70으로 나눠진 접기가있을 수 있습니다 (위의 코드를 실행하고 실제로 발생하는 것을 볼 수 있습니다!). 이는 정확하게 예측할 수있는 클래스가 충분하지 않아 전체 CV 분산이 증가하기 때문에 성능이 저하 된 모델로 이어질 수 있습니다. 분포에 매우 큰 차이가있을 가능성이있는 '제한된'표본이있을 때 이것은 더욱 중요합니다.
이제 매우 큰 데이터 세트를 사용하면 주름이 최소한 'rarer'클래스의 비율을 충분히 포함 할만큼 충분히 크므로 계층화가 필요하지 않을 수 있습니다. 그러나 내 개인적인 의견에 얼마나 많은 데이터가 있더라도 샘플의 균형이 맞지 않으면 계산 손실이없고 계층화를 포기할 실제적인 이유가 없습니다.