Mungkin Anda bisa memikirkannya dengan cara ini. Katakanlah Anda memiliki dataset di mana terdapat 100 sampel, 90 di kelas 'A' dan 10 di kelas 'B'. Dalam desain yang sangat tidak seimbang ini jika Anda melakukan grup acak yang normal, Anda dapat membuat model dengan sangat sedikit (atau BAHKAN TIDAK ADA!) Dari kelas 'B'. Jika Anda sedang membangun model yang dilatih pada data di mana ada sangat sedikit, atau bahkan tidak ada, dari kelas lain bagaimana Anda bisa mengharapkannya untuk memprediksi kelompok yang lebih jarang secara efektif? Validasi silang bertingkat memungkinkan untuk pengacakan tetapi juga memastikan dataset tidak seimbang ini memiliki beberapa dari kedua kelas.
Untuk menenangkan kekhawatiran tentang penggunaan CV bertingkat dengan dataset yang lebih 'seimbang', mari kita lihat contoh menggunakan kode 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
Seperti yang Anda lihat, dalam dataset yang seimbang lipatan akan memiliki distribusi yang sama secara kebetulan. Oleh karena itu, stratifikasi CV hanyalah ukuran jaminan dalam keadaan ini. Namun, untuk mengatasi perbedaan Anda perlu melihat distribusi setiap lipatan. Dalam beberapa keadaan (bahkan mulai dari 50-50) Anda dapat memiliki lipatan yang memiliki 30-70 secara acak (Anda dapat menjalankan kode di atas dan melihat ini benar-benar membahagiakan!). Ini dapat mengarah pada model yang berkinerja lebih buruk karena tidak memiliki cukup satu kelas untuk memprediksi secara akurat sehingga meningkatkan varian CV keseluruhan. Ini jelas lebih penting ketika Anda memiliki sampel 'terbatas' di mana Anda lebih cenderung memiliki perbedaan distribusi yang sangat ekstrem.
Sekarang dengan kumpulan data yang sangat besar, stratifikasi mungkin tidak diperlukan karena lipatannya akan cukup besar untuk kemungkinan mengandung setidaknya sebagian besar kelas 'jarang'. Namun, sebenarnya tidak ada kerugian komputasi dan tidak ada alasan nyata untuk melupakan stratifikasi jika sampel Anda tidak seimbang, tidak peduli berapa banyak data yang Anda miliki dalam pendapat pribadi saya.