शायद आप इसे इस तरह से सोच सकते हैं। मान लीजिए कि आपके पास एक डेटासेट है जहां 100 नमूने हैं, कक्षा 'ए' में 90 और कक्षा 'बी' में 10 हैं। इस बहुत असंतुलित डिज़ाइन में यदि आप सामान्य यादृच्छिक समूह बनाते हैं, तो आप 'B' वर्ग से बहुत कम (या कुछ 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 के विभाजन होते हैं (आप ऊपर दिए गए कोड को चला सकते हैं और वास्तव में इसे खुश देख सकते हैं!)। यह एक खराब प्रदर्शन करने वाले मॉडल को जन्म दे सकता है क्योंकि इसमें एक वर्ग के लिए पर्याप्त नहीं था कि वह सटीक भविष्यवाणी कर सके जिससे समग्र सीवी संस्करण बढ़ रहा है। यह स्पष्ट रूप से अधिक महत्वपूर्ण है जब आपके पास 'सीमित' नमूने होते हैं जहां आपको वितरण में बहुत अधिक अंतर होने की संभावना होती है।
अब बहुत बड़े डेटासेट के साथ, स्तरीकरण आवश्यक नहीं हो सकता है क्योंकि सिलवटों में काफी बड़ा होगा फिर भी संभावना है कि कम से कम 'दुर्लभ' वर्ग का अच्छा अनुपात हो। हालांकि, वास्तव में कोई कम्प्यूटेशनल नुकसान नहीं है और स्तरीकरण से बचने का कोई वास्तविक कारण नहीं है यदि आपके नमूने असंतुलित हैं, भले ही आपके व्यक्तिगत विचार में आपके पास कितना भी डेटा हो।