Cross-Validation
Kiểm chứng chéo
Một đề thi thử không nói lên gì
Bạn làm một đề thi thử và được 9 điểm. Bạn có chắc mình giỏi thật không? Biết đâu hôm đó may đề dễ. Hôm sau làm đề khác được 5. Rồi 7. Rồi 8. Chỉ khi làm nhiều đề khác nhau và tính trung bình, bạn mới biết thực lực.
Đó chính là cross-validation trong ML. Kiểm định chéo chia dữ liệu thành K phần bằng nhau, rồi xoay vòng: mỗi lượt một phần làm “đề thi”, K-1 phần còn lại làm “sách ôn”. K điểm đánh giá ⇒ trung bình = thực lực mô hình.
Bạn chia dataset thành train/test một lần rồi đo accuracy được 88%. Bạn chia lại (random seed khác) — lần này được 82%. Chuyện gì đang xảy ra?
Bên dưới là minh hoạ K-Fold. Chọn K để đổi số phần, bấm từng fold để xem phần nào đang làm test, hoặc bấm Play để xem xoay vòng tự động.
Hình minh họa
Điểm từng fold
Quan sát: K càng lớn, mỗi phần (fold) càng nhỏ, nhưng tổng số lượt huấn luyện cũng tăng theo ⇒ tốn thời gian hơn.
Một đề không nói lên gì — K đề cho ta trung bình đáng tin.Mỗi mẫu trong dataset đều được thử làm “đề thi” đúng 1 lần, và “sách ôn” (K-1) lần. Điểm cuối cùng không phải một con số mà là cặp (trung bình, độ lệch chuẩn).
Độ lệch chuẩn thấp = mô hình ổn định. Độ lệch chuẩn cao = có fold đặc biệt dễ/khó → nên kiểm tra dữ liệu có cân đối không.
Bên dưới là dataset 20 hàng, chia thành 5 fold (4 hàng mỗi fold). Bấm “Tiếp tục”để xem 5 lượt huấn luyện — mỗi lượt, một fold chuyển thành test (màu), 4 fold còn lại là train (xám).
Lượt 1 — Fold F1 làm test
Lượt này: 4 hàng của Fold 1 là “đề thi”; 16 hàng còn lại (Fold 2, 3, 4, 5) là “sách ôn”. Kết quả: 85.0%.
Leave-One-Out CV (LOO) là K-Fold với K = n (n là số mẫu dataset). Khi nào dùng LOO hợp lý nhất?
Bạn chạy 5-Fold CV và nhận được scores [95%, 50%, 93%, 48%, 94%]. Trung bình là 76%. Điểm đáng chú ý là gì?
Giải thích
K-Fold Cross-Validationlà cách “nhân bản” phép đo hiệu năng. Dataset được chia thành K phần bằng nhau. Ta lặp K lần: mỗi lần, 1 phần làm test, K-1 phần còn lại làm train. K điểm đánh giá ⇒ trung bình và độ lệch chuẩn.
Kèm theo là độ lệch chuẩn, đo tính ổn định của ước lượng:
Các biến thể thường gặp (ngắn gọn)
K-Fold thường
Chia ngẫu nhiên K phần đều nhau. Mặc định cho hồi quy, phân loại cân bằng.
Stratified K-Fold
Giữ tỷ lệ lớp trong mỗi fold. Bắt buộc cho phân loại mất cân bằng.
Leave-One-Out
K = n (mỗi lần 1 mẫu test). Dùng khi dataset rất nhỏ.
Time Series Split
Luôn train quá khứ, test tương lai. Bắt buộc cho dữ liệu có thứ tự thời gian.
Group K-Fold
Giữ các mẫu cùng nhóm (bệnh nhân, user) trong cùng một fold — tránh data leakage.
Repeated K-Fold
Chạy K-Fold nhiều lần với seed khác → ước lượng cực kỳ ổn định, tính được khoảng tin cậy.
KHÔNG được fit scaler / feature selection / imputer trên toàn bộ dữ liệutrước khi CV. Phải đặt trong một pipeline để mỗi fold có preprocessing riêng. Nếu không, thông tin từ test lọt vào train ⇒ kết quả CV “ảo” (lạc quan hơn thực tế).
Khi nào nên dùng cross-validation vs train/val/test split?
- Dataset nhỏ (< 10k mẫu): CV— tận dụng tối đa dữ liệu.
- Dataset lớn (> 100k mẫu): train/val/test split một lần là đủ — variance tự nhiên đã thấp.
- Cần báo cáo khoa học / benchmark chính thức: Repeated K-Fold hoặc Nested CV.
- Có time series / group / mất cân bằng: dùng biến thể tương ứng (TimeSeriesSplit, GroupKFold, StratifiedKFold).
- Chia một lần = một đề thi may rủi. Chia K phần và xoay vòng = K đề, trung bình ổn định hơn.
- K=5 hoặc K=10 là mặc định. Báo cáo luôn kèm mean ± std. Std cao là cờ đỏ.
- Stratified cho phân loại mất cân bằng, Time Series Split cho dữ liệu thời gian, Group K-Fold cho dữ liệu có nhóm tự nhiên.
- Cạm bẫy: fit preprocessing TRƯỚC CV → leakage. Luôn đặt scaler/encoder trong pipeline để mỗi fold có preprocessing riêng.
Kiểm tra hiểu biết
Tại sao cross-validation tốt hơn chia train/test một lần?