Возможно, вы можете думать об этом таким образом. Допустим, у вас есть набор данных, в котором 100 выборок, 90 в классе «А» и 10 в классе «В». В этом очень несбалансированном дизайне, если вы делаете обычные рандомизированные группы, вы можете в конечном итоге построить модели на очень немногих (или ДАЖЕ НЕТ!) Из класса 'B'. Если вы строите модель, которая обучается на данных, где так мало, или даже нет, данных другого класса, как вы могли бы ожидать, что она будет эффективно предсказывать более редкую группу? Стратифицированная перекрестная проверка допускает рандомизацию, но также гарантирует, что эти несбалансированные наборы данных имеют некоторые из обоих классов.
Чтобы успокоить опасения по поводу использования стратифицированного 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. Это, очевидно, более важно, когда у вас есть «ограниченные» выборки, где вы, скорее всего, будете иметь очень большие различия в распределении.
Теперь с очень большими наборами данных стратификация может не потребоваться, потому что сгибы будут достаточно большими, чтобы все еще, вероятно, содержать, по крайней мере, хорошую долю «более редкого» класса. Тем не менее, на самом деле нет вычислительных потерь и нет реальной причины отказаться от стратификации, если ваши выборки не сбалансированы, независимо от того, сколько данных у вас есть, по моему личному мнению.