Training, Validation và Testing trong Machine Learning
Tách việc học, chọn mô hình và đo khả năng tổng quát hóa mà không rò rỉ dữ liệu.
Một phép đánh giá đáng tin phụ thuộc vào cách giữ dữ liệu chưa nhìn thấy, không chỉ vào công thức metric. Ba tập dữ liệu có ba vai trò khác nhau trong vòng phát triển mô hình.
Mục tiêu học tập
- Nêu đúng vai trò train, validation và test.
- Nhận ra rò rỉ qua preprocessing, người dùng và thời gian.
- Chọn split hoặc cross-validation phù hợp đơn vị dữ liệu.
Ba vai trò trong cùng một quy trình
Train giống bài tập để học; validation giúp chọn cách học; test giống đề kiểm tra cuối đã được cất riêng. Nếu xem đáp án đề cuối rồi sửa cách làm, đề đó không còn là phép thử độc lập nữa.
Ví dụ 100 bản ghi giả định được chia 60/20/20 chỉ để minh họa vai trò. Không có một tỷ lệ đúng cho mọi bài toán; dữ liệu hiếm, nhóm liên quan và thời gian có thể quyết định cách chia.
Fit preprocessing và tham số trên train; chọn hyperparameters hoặc threshold bằng validation. Sau khi chốt protocol, có thể refit trên train+validation nếu quy trình cho phép, rồi đánh giá một lần trên test chưa dùng để chọn cấu hình.
Cross-validation luân phiên các fold dùng để fit và validation trong phần dữ liệu phát triển. Một test riêng vẫn cần thiết khi muốn có đánh giá cuối độc lập với quá trình tuning.
Dùng cùng validation cho quá nhiều quyết định có thể tạo selection bias. Nested cross-validation tách vòng chọn cấu hình khỏi vòng ước lượng đánh giá khi không có test riêng đủ phù hợp. Đơn vị lấy mẫu phải phản ánh đơn vị cần tổng quát hóa.
Sai số giữa các fold không tự động là confidence interval cho deployment. Các fold có tập huấn luyện chồng lấp; cần nêu rõ đại lượng đang báo và giả định thống kê.
Leakage xảy ra trước khi train
Nếu ảnh cùng một người nằm ở cả train và test, mô hình có thể nhớ người thay vì học quy luật cần dùng. Tương tự, tính giá trị trung bình từ toàn bộ bảng đã để test ảnh hưởng quy trình học.
Fit scaler, imputer, feature selection trong train hoặc trong từng fold. Với nhiều ảnh của cùng bệnh nhân hoặc video, chia theo group. Với dự đoán tương lai, ưu tiên chia thời gian và kiểm tra các feature chỉ có sau thời điểm dự đoán.
Định nghĩa prediction timestamp và cửa sổ tạo nhãn trước khi trích xuất feature. Các cửa sổ thời gian chồng lấp có thể cần khoảng cách giữa split. Pipeline giúp ngăn fit nhầm nhưng không tự biết group hoặc quy trình gán nhãn có leakage.
Kiểm tra một split theo group
Trong mã, tất cả bản ghi của một người được giữ cùng phía. Có thể tự kiểm tra bằng cách so hai tập ID; giao của chúng phải rỗng. Điều này không kiểm tra được chất lượng nhãn nhưng loại một dạng lỗi rõ ràng.
Mã chỉ minh họa tách group, chưa tối ưu cân bằng lớp hay kích thước. Trong thực tế cần kiểm tra số nhóm, số mẫu và tỷ lệ lớp theo mỗi phần; test quá ít nhóm dễ cho ước lượng biến động lớn.
Lưu manifest ID của từng split cùng hash dữ liệu. Khi thêm dữ liệu mới, kiểm tra trùng nội dung lẫn trùng thực thể. Nếu lựa chọn split sau khi đã nhìn điểm test, phải coi đó là thay đổi protocol và giải thích trong báo cáo.
Workflow & kiến trúc
Ứng dụng & giới hạn
- Phân loại ảnh nhiều frame hoặc nhiều ảnh cùng người.
- Dự đoán nhu cầu theo thời gian.
Điểm mạnh
Tách vai trò dữ liệu giúp phân biệt tối ưu mô hình với đo chất lượng.
Giới hạn cần nhớ
Split sạch không bảo đảm dữ liệu đại diện môi trường mới; test có thể thiếu các trường hợp hiếm.
Thử trong một project nhỏ
Với bộ ảnh của 20 người, mỗi người 10 ảnh, thiết kế đánh giá cho người chưa từng gặp. Ghi group key và ít nhất ba assertion phát hiện leakage.
rows = [("person_a", 0), ("person_a", 1), ("person_b", 0), ("person_c", 1)]
train_groups = {"person_a"}
validation_groups = {"person_b"}
test_groups = {"person_c"}
assert train_groups.isdisjoint(validation_groups | test_groups)
assert validation_groups.isdisjoint(test_groups)
train = [r for r in rows if r[0] in train_groups]
test = [r for r in rows if r[0] in test_groups]
assert {r[0] for r in train}.isdisjoint(r[0] for r in test)
print(len(train), len(test))Dữ liệu giả định, minh họa kiểm tra group separation; chưa phải bộ chia dữ liệu hoàn chỉnh.
