Train / Validation / Test Split
Chia tập dữ liệu
Ba vai trò, ba loại “đề”
Bài tập về nhà
Mô hình 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ử
Mô hình CHỈNH ở đây. Tune hyperparameter, chọn kiến trúc, quyết early stopping.
Đề thi thật
Mô hình ĐƯỢC ĐÁNH GIÁ ở đây. Mở đúng 1 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 ôn thi đại học. Giáo viên cho 100 đề. Bạn làm cả 100, rồi dùng chính 100 đề đó để chấm điểm. Điểm 10/10. Vào thi thật, trượt. Vì sao?
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 accuracy thay đổi thế nào. Rồi thử bật “Nhìn test trước”— bạn sẽ thấy test accuracy “đẹp” 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ỉ 1 lần), test đã trở thành val — và bạn không còn một phép đo khách quan nào nữa.
Train loss thấp = mô hình nhớ bài tập. Val loss thấp = mô hình hợp với đề thi thử. Test loss thấp (được đo đúng 1 lần) = mô hình 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 mô hình 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á mô hình khách quan. Đây là nền tảng phương pháp luận của mọi dự án ML.
Trong đó Generalization Errorlà 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ả 2 tập → mô hình “nhớ mặt” chứ không học đặc điểm.
- Train = bài tập (học). Val = đề thi thử (tune). Test = đề thi thật (đánh giá, chỉ 1 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 = cũ, test = 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?