Có lẽ bạn có thể nghĩ về nó theo cách này. Giả sử bạn có một bộ dữ liệu trong đó có 100 mẫu, 90 trong lớp 'A' và 10 trong lớp 'B'. Trong thiết kế không cân bằng này nếu bạn thực hiện các nhóm ngẫu nhiên bình thường, bạn có thể kết thúc việc xây dựng các mô hình với số lượng cực kỳ ít (hoặc NGAY CẢ KHÔNG!) Từ lớp 'B'. Nếu bạn đang xây dựng một mô hình được đào tạo về dữ liệu có rất ít hoặc thậm chí không có lớp nào khác, làm thế nào bạn có thể mong đợi nó dự đoán nhóm hiếm hơn một cách hiệu quả? Xác thực chéo phân tầng cho phép ngẫu nhiên nhưng cũng đảm bảo các bộ dữ liệu không cân bằng này có một số cả hai lớp.
Để làm dịu những lo ngại về việc sử dụng CV phân tầng với bộ dữ liệu 'cân bằng' hơn, hãy xem xét một ví dụ sử dụng mã 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
Như bạn có thể thấy, trong một tập dữ liệu được cân bằng tốt, các nếp gấp sẽ có phân phối tương tự ngẫu nhiên. Do đó CV phân tầng chỉ đơn giản là một biện pháp đảm bảo trong những trường hợp này. Tuy nhiên, để giải quyết phương sai, bạn sẽ cần xem xét các phân phối của mỗi lần. Trong một số trường hợp (thậm chí bắt đầu từ 50-50), bạn có thể có các nếp gấp có tỷ lệ chia 30-70 một cách ngẫu nhiên (bạn có thể chạy mã ở trên và thấy điều này thực sự xảy ra!). Điều này có thể dẫn đến một mô hình hoạt động kém hơn bởi vì nó không có đủ một lớp để dự đoán chính xác nó do đó làm tăng phương sai CV tổng thể. Điều này rõ ràng quan trọng hơn khi bạn có các mẫu 'giới hạn' trong đó bạn có nhiều khả năng có sự khác biệt rất lớn trong phân phối.
Bây giờ với các bộ dữ liệu rất lớn, sự phân tầng có thể không cần thiết vì các nếp gấp sẽ đủ lớn để vẫn có khả năng chứa ít nhất một tỷ lệ tốt của lớp 'hiếm hơn'. Tuy nhiên, thực sự không có tổn thất tính toán và không có lý do thực sự để từ bỏ sự phân tầng nếu các mẫu của bạn không cân bằng cho dù bạn có bao nhiêu dữ liệu theo quan điểm cá nhân của tôi.