Forse puoi pensarlo in questo modo. Supponiamo che tu abbia un set di dati in cui ci sono 100 campioni, 90 nella classe 'A' e 10 nella classe 'B'. In questo progetto molto sbilanciato se fai normali gruppi randomizzati, potresti finire per costruire modelli su un numero estremamente limitato (o ANCORA NESSUNO!) Della classe "B". Se stai costruendo un modello che è addestrato sui dati in cui ci sono così pochi, o addirittura nessuno, dell'altra classe come puoi aspettarti che preveda in modo efficace il gruppo più raro? La convalida incrociata stratificata consente la randomizzazione ma assicura anche che questi set di dati non bilanciati abbiano alcune di entrambe le classi.
Per placare le preoccupazioni sull'uso di CV stratificato con set di dati più "bilanciati", diamo un'occhiata a un esempio usando il codice 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
Come puoi vedere, in un set di dati ben bilanciato le pieghe avranno una distribuzione simile per caso. Pertanto il CV stratificato è semplicemente una misura di garanzia in queste circostanze. Tuttavia, per affrontare la varianza è necessario esaminare le distribuzioni di ogni piega. In alcune circostanze (anche a partire dal 50-50) potresti avere delle pieghe che hanno divisioni di 30-70 per caso (puoi eseguire il codice qui sopra e vedere che ciò sta realmente accadendo!). Ciò potrebbe portare a un modello con prestazioni peggiori perché non aveva abbastanza di una classe per prevederlo con precisione, aumentando così la varianza complessiva del CV. Ciò è ovviamente più importante quando hai campioni "limitati" in cui è più probabile che tu abbia differenze molto estreme nella distribuzione.
Ora con set di dati molto grandi, la stratificazione potrebbe non essere necessaria perché le pieghe saranno abbastanza grandi da contenere probabilmente almeno una buona proporzione della classe "più rara". Tuttavia, non c'è davvero alcuna perdita computazionale e nessuna vera ragione per rinunciare alla stratificazione se i tuoi campioni sono sbilanciati, non importa quanti dati hai a mio avviso personale.