Być może możesz o tym myśleć w ten sposób. Załóżmy, że masz zestaw danych, w którym znajduje się 100 próbek, 90 w klasie „A” i 10 w klasie „B”. W tym bardzo niezrównoważonym projekcie, jeśli wykonujesz normalne losowe grupy, możesz skończyć budowaniem modeli na nielicznych (lub NAWET NIE!) Z klasy „B”. Jeśli budujesz model, który jest szkolony na danych, w których jest tak mało, a nawet nie ma, drugiej klasy, jak możesz oczekiwać, że skutecznie prognozuje rzadszą grupę? Warstwowa walidacja krzyżowa pozwala na randomizację, ale także zapewnia, że te niezrównoważone zestawy danych mają niektóre z obu klas.
Aby uspokoić obawy dotyczące stosowania warstwowego CV z bardziej „zbalansowanymi” zestawami danych, spójrzmy na przykład wykorzystujący kod 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
Jak widać, w zbiorze danych, który jest dobrze zrównoważony, fałdy będą miały podobny rozkład losowo. Dlatego warstwowe CV jest w tych okolicznościach po prostu miarą pewności. Jednak, aby rozwiązać problem wariancji, należy przyjrzeć się rozkładom poszczególnych foldów. W niektórych okolicznościach (nawet od 50-50) możesz mieć fałdy, które mają losowy podział 30-70 przez przypadek (możesz uruchomić powyższy kod i zobaczyć, jak to się naprawdę dzieje!). Może to prowadzić do gorszego modelu, ponieważ nie miał wystarczającej liczby jednej klasy, aby dokładnie przewidzieć, zwiększając tym samym ogólną wariancję CV. Jest to oczywiście ważniejsze, gdy masz „ograniczone” próbki, w przypadku których istnieje większe prawdopodobieństwo bardzo skrajnych różnic w dystrybucji.
Teraz, przy bardzo dużych zestawach danych, stratyfikacja może nie być konieczna, ponieważ fałdy będą na tyle duże, że nadal prawdopodobnie będą zawierać co najmniej dobry odsetek klasy „rzadszej”. Jednak tak naprawdę nie ma strat obliczeniowych i nie ma prawdziwego powodu, aby zrezygnować ze stratyfikacji, jeśli próbki są niezrównoważone, bez względu na to, ile danych masz według mnie.