Cross-Validation
Kiểm định chéo huấn luyện và đánh giá model trên k phân vùng luân phiên của một tập dữ liệu để ước tính khả năng khái quát hóa. Nội dung đề cập các bước K-fold, biến thể, rò rỉ dữ liệu và code.
Cross-validation ước tính hiệu suất của model trên dữ liệu chưa thấy bằng cách huấn luyện và đánh giá nhiều lần trên các phần chia khác nhau của cùng một dataset, rồi tổng hợp điểm số. Trong cross-validation k-fold, dữ liệu được chia thành k phần bằng nhau gọi là fold; mỗi fold lần lượt làm dữ liệu validation, còn model được huấn luyện trên k − 1 fold còn lại. Giá trị trung bình của k điểm số ước tính hiệu suất, còn độ phân tán cho biết mức độ ước tính phụ thuộc vào những mẫu tình cờ nằm trong tập validation. Cross-validation là phương pháp đánh giá tiêu chuẩn khi dữ liệu quá ít để một lần chia giữ lại duy nhất tạo ra điểm số đáng tin cậy; phương pháp này được dùng rộng rãi để so sánh thuật toán và tinh chỉnh hyperparameter mà không đụng đến dữ liệu kiểm thử.
Cách cross-validation k-fold hoạt động#
Dataset được xáo trộn một lần rồi chia thành k fold, thường là 5 hoặc 10. Trong mỗi vòng của k vòng, một model mới được huấn luyện trên k − 1 fold và được chấm điểm trên fold còn lại, vì vậy mỗi mẫu được dùng để validation đúng một lần và để huấn luyện k − 1 lần. K điểm số được lấy trung bình và báo cáo cùng độ lệch chuẩn. Sau khi cross-validation chọn được model hoặc bộ hyperparameter, model cuối cùng thường được huấn luyện lại trên toàn bộ dữ liệu huấn luyện với các thiết lập đó. Leave-one-out cross-validation là trường hợp cực đoan trong đó k bằng số mẫu; phương pháp này dùng nhiều dữ liệu nhất để huấn luyện ở mỗi vòng, đổi lại phải huấn luyện số model bằng số mẫu.
Cách đọc điểm số cross-validation#
Độ phân tán giữa các fold cũng có nhiều thông tin như giá trị trung bình. Script scikit-learn dưới đây chạy cross-validation 5-fold trên dataset ung thư vú đi kèm:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# 569 labeled tumor samples with 30 features each
X, y = load_breast_cancer(return_X_y=True)
# The scaler sits inside the pipeline, so each round fits it on that round's training folds only
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
# 5 stratified folds: each sample is validated exactly once
folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(model, X, y, cv=folds)
print("Fold accuracies:", scores.round(3))
print(f"Mean {scores.mean():.3f} +/- {scores.std():.3f}")Năm accuracy của các fold nằm trong khoảng từ 0.956 đến 1.000, với giá trị trung bình là 0.979 và độ lệch chuẩn là 0.014. Một lần chia 80/20 duy nhất sẽ báo cáo một trong năm con số đó, chênh lệch trong khoảng 4.4 điểm phần trăm. Đặt scaler bên trong pipeline giúp fold validation không bị đưa vào thống kê tiền xử lý dữ liệu; nếu chuẩn hóa toàn bộ dataset trước, sẽ xảy ra rò rỉ dữ liệu từ mỗi fold validation sang tập huấn luyện.
Chọn biến thể cross-validation#
K-fold thông thường giả định các mẫu độc lập và có thể thay thế cho nhau. Khi không đáp ứng giả định này, phép chia ngẫu nhiên sẽ làm rò rỉ thông tin hoặc tạo ra các fold không phản ánh đúng tác vụ:
- Stratified k-fold: Giữ tỷ lệ lớp trong mỗi fold bằng với tỷ lệ của toàn dataset; điều này quan trọng khi một lớp hiếm có thể vắng mặt trong một fold.
- Group k-fold: Giữ mọi ví dụ thuộc cùng một nhóm, chẳng hạn một bệnh nhân, video hoặc địa điểm thực địa, trong cùng fold để model không bao giờ được validation trên các ảnh huấn luyện gần trùng lặp. Group k-fold phân tầng kết hợp cả hai ràng buộc.
- Chia chuỗi thời gian: Chỉ huấn luyện trên dữ liệu quá khứ và validation trên giai đoạn tiếp theo, mở rộng cửa sổ huấn luyện sau mỗi vòng, vì xáo trộn dữ liệu theo thứ tự thời gian sẽ khiến model nhìn thấy tương lai.
- Cross-validation lồng nhau: Chạy một vòng cross-validation bên trong để tinh chỉnh hyperparameter trong mỗi fold bên ngoài, nhờ đó điểm số bên ngoài không bị tăng giả tạo do tinh chỉnh trên chính các fold được dùng để báo cáo điểm số.
Cross-validation cho deep learning#
Huấn luyện một mạng sâu k lần làm chi phí tính toán tăng gấp k lần, vì vậy các dataset lớn như ImageNet và COCO dùng một tập validation cố định duy nhất, vốn đã đủ lớn để tạo điểm số ổn định. Cross-validation hữu ích với dataset thị giác nhỏ có từ vài trăm đến vài nghìn ảnh, khi một lần chia validation có thể chỉ chứa một vài mẫu của mỗi lớp. Hướng dẫn Cross Validation K-Fold của Ultralytics chia một dataset detection thành năm fold bằng KFold của scikit-learn, ghi danh sách ảnh huấn luyện và validation cùng file YAML dataset cho từng fold, rồi huấn luyện một model YOLO26 trên mỗi fold. Vì ảnh detection thường chứa nhiều lớp nên không thể phân tầng theo một nhãn duy nhất; do đó, hướng dẫn cũng ghi lại tỷ lệ nhãn validation so với nhãn huấn luyện cho từng lớp trong mỗi fold.
Cross-validation và các thuật ngữ liên quan#
- Validation hold-out: Một lần chia dữ liệu, chẳng hạn 80/20, được chấm điểm một lần. Phương pháp này chỉ tốn một lần chạy huấn luyện, phù hợp với dataset lớn, và điểm số phụ thuộc vào những mẫu nằm trong tập validation.
- Bootstrapping: Tạo các tập huấn luyện bằng cách lấy mẫu có hoàn lại và chấm điểm mỗi model trên những mẫu không được chọn trong lần lấy mẫu đó. K-fold phân vùng dữ liệu không hoàn lại, nên mỗi mẫu chỉ nằm trong đúng một fold.
- Đánh giá trên tập kiểm thử: Cross-validation chọn model và thiết lập. Một tập kiểm thử riêng, không thuộc bất kỳ fold nào, cung cấp ước tính cuối cùng cho model đã chọn.










