Train / Validation / Test Split
Tập train, val, test: bài tập, thi thử, thi thật
Ba vai trò, ba loại “đề”
Bài tập về nhà
Model học ở đây. Cập nhật tham số, lặp đi lặp lại tới khi hiểu quy luật.
Đề thi thử
Model chỉnh ở đây. Tune hyperparameter, chọn kiến trúc, quyết early stopping.
Đề thi thật
Model được đánh giá ở đây. Mở đúng một lần ở cuối. Không được nhìn trước.
Quy tắc quan trọng nhất: không được nhìn test trước khi nộp. Một khi đã nhìn, dù chỉ một lần, điểm test không còn ý nghĩa. Nó trở thành một phần của quá trình tuning, không phải một phép đo khách quan.
Bạn đã chia train / val / test đúng. Bạn thử 50 kiến trúc model khác nhau, MỖI LẦN đo điểm test để xem cái nào cao nhất, rồi báo cáo điểm test của model thắng cuộc. Con số báo cáo đó có còn tin được không?
Bên dưới là 1.000 điểm dữ liệu. Kéo các thanh trượt để chia thành train / val / test. Xem đường cong độ chính xác thay đổi thế nào. Rồi thử bật “Nhìn test trước”. Bạn sẽ thấy độ chính xác trên test phồng lên một cách giả tạo.
Hình minh họa
Test tự động = 100 − Train − Val. Luôn giữ ≥ 5%.
Ba tập, ba vai trò không thay thế nhau: train để học, val để chỉnh, test để đánh giá. Nếu bạn dùng test để chỉnh, dù chỉ một lần, test đã trở thành val. Bạn không còn một phép đo khách quan nào nữa.
Train loss thấp nghĩa là model nhớ bài tập. Val loss thấp nghĩa là model hợp với đề thi thử. Test loss thấp (được đo đúng một lần) là dấu hiệu model thực sự tổng quát hoá.
Bấm “Tiếp tục” để đi qua từng giai đoạn trong một workflow ML chuẩn. Chú ý: test set xuất hiện rất muộn, chỉ ở bước cuối cùng.
Thu thập dữ liệu
Tổng hợp toàn bộ dữ liệu có được. Giả sử 10.000 mẫu.
Vì sao validation set (chứ không phải test set) được dùng để tune hyperparameters? Cả hai đều là 'data model chưa thấy' cơ mà?
Dataset chuỗi thời gian (giá cổ phiếu theo ngày). Chia train/val/test thế nào?
Giải thích
Train / Val / Test split chia dữ liệu thành ba tập riêng biệt để đảm bảo đánh giá model khách quan. Đây là nền tảng phương pháp luận của mọi dự án ML.
Trong đó Generalization Error là lỗi kỳ vọng trên dữ liệu chưa hề thấy. Chúng ta không đo được con số này trực tiếp (dữ liệu tương lai là vô hạn), nên dùng test error làm ước lượng tốt nhất, với điều kiện: test set phải được giữ nguyên vẹn.
Tỷ lệ chia theo kích thước dataset
| Kích thước dataset | Tỷ lệ đề xuất | Lý do |
|---|---|---|
| < 1.000 mẫu | Nên dùng cross-validation | Hold-out quá nhiễu |
| 1.000–10.000 | 60/20/20 | Cần val/test đủ lớn (≥ 200 mẫu) |
| 10.000–100.000 | 70/15/15 | Phổ biến, cân bằng |
| 100.000–1.000.000 | 80/10/10 | 10% đã đủ tin cậy |
| > 1.000.000 | 90/5/5 hoặc 98/1/1 | Train thiếu dữ liệu mới là vấn đề chính |
- Fit scaler / encoder trên toàn bộdữ liệu trước khi split. Preprocessing “nhìn” được phân phối của test.
- Oversample / SMOTE trước khi split. Bản sao của train có thể xuất hiện trong val/test.
- Time series bị shuffle. Tương lai lọt vào tập train.
- Cùng một “subject” (bệnh nhân, user) có mẫu ở cả hai tập. Model “nhớ mặt” chứ không học đặc điểm.
- Train là bài tập (học). Val là đề thi thử (tune). Test là đề thi thật (đánh giá, chỉ một lần).
- Không bao giờ dùng test để chọn hyperparameter. Nếu làm, test không còn khách quan.
- SPLIT TRƯỚC khi làm preprocessing. Fit scaler/encoder CHỈ trên train. Transform val/test bằng scaler của train.
- Dataset chuỗi thời gian: chia theo thời gian (train là cũ, test là mới). Không shuffle.
- Dataset nhỏ (<10k): dùng cross-validation. Dataset lớn (>1M): hold-out 90/5/5 là đủ.
Kiểm tra hiểu biết
Tại sao KHÔNG được dùng test set để chọn model hay tune hyperparameters?