Trong nhiều dự án Machine Learning, việc chia dữ liệu thường bị xem là bước kỹ thuật đơn giản: lấy 80% để train, 10% validation, 10% test. Cách này có thể ổn với bài toán học tập hoặc dữ liệu độc lập. Nhưng trong dự án thực tế, nếu chia dữ liệu sai, mô hình có thể đạt điểm rất cao khi thử nghiệm nhưng hoạt động kém khi đưa vào sử dụng. Bài viết này tập trung vào một câu hỏi thực tế: chia dữ liệu thế nào để kết quả đánh giá phản ánh đúng năng lực của mô hình? 1. Hiểu vai trò của từng tập dữ liệu Tập train dùng để mô hình học tham số. Tập validation dùng để chọn mô hình, chỉnh hyperparameter, chọn đặc trưng hoặc quyết định dừng huấn luyện. Tập test chỉ nên được dùng cuối cùng để ước lượng hiệu năng trước khi triển khai. Một lỗi phổ biến là nhìn kết quả trên test quá nhiều lần rồi tiếp tục sửa mô hình. Khi đó, test dần biến thành validation, và kết quả cuối cùng không còn khách quan nữa. Lời khuyên thực tế: nếu dự án kéo dài, hãy khóa tập test lại. Chỉ mở ra ở các mốc quan trọng, ví dụ trước khi quyết định triển khai hoặc so sánh phiên bản lớn. 2. Không phải lúc nào cũng chia ngẫu nhiên Chia ngẫu nhiên rất tiện, nhưng không phù hợp với mọi bài toán. Ví dụ, nếu bạn xây mô hình dự đoán khách hàng có rời bỏ dịch vụ trong tháng tới hay không, dữ liệu có yếu tố thời gian. Nếu chia ngẫu nhiên, dữ liệu của tháng sau có thể lọt vào train, còn dữ liệu tháng trước nằm trong test. Kết quả đánh giá sẽ lạc quan hơn thực tế. Với bài toán có thời gian, nên chia theo mốc thời gian: train trên dữ liệu cũ, validation trên giai đoạn sau đó, test trên giai đoạn mới hơn nữa. Cách này gần với tình huống triển khai thật: mô hình luôn dùng quá khứ để dự đoán tương lai. Ví dụ: - Train: dữ liệu từ tháng 1 đến tháng 8 - Validation: tháng 9 - Test: tháng 10 Nếu dữ liệu thay đổi theo mùa vụ, nên kiểm tra thêm nhiều giai đoạn khác nhau thay vì chỉ một tháng duy nhất. 3. Cẩn thận với dữ liệu cùng nhóm Một trường hợp dễ gây rò rỉ dữ liệu là nhiều dòng thuộc cùng một người dùng, cùng một thiết bị, cùng một bệnh nhân hoặc cùng một cửa hàng. Nếu một người dùng xuất hiện cả trong train và test, mô hình có thể học đặc điểm riêng của người đó thay vì học quy luật tổng quát. Ví dụ, trong bài toán phân loại giao dịch gian lận, nếu các giao dịch của cùng một khách hàng nằm rải rác ở cả train và test, kết quả có thể không phản ánh khả năng dự đoán trên khách hàng mới. Khi dữ liệu có nhóm, hãy cân nhắc chia theo group. Nghĩa là toàn bộ dữ liệu của một người dùng hoặc một đơn vị phải nằm trong cùng một tập. Trong scikit-learn, có thể tìm hiểu các kỹ thuật như GroupKFold hoặc GroupShuffleSplit cho tình huống này. 4. Giữ phân bố nhãn khi cần thiết Với bài toán phân loại mất cân bằng, ví dụ phát hiện lỗi sản phẩm, phát hiện gian lận hoặc dự đoán hủy đơn, số mẫu dương thường rất ít. Nếu chia dữ liệu ngẫu nhiên mà không kiểm tra, tập validation hoặc test có thể có quá ít mẫu dương, khiến chỉ số đánh giá thiếu ổn định. Trong trường hợp này, nên dùng stratified split để giữ tỷ lệ nhãn tương đối giống nhau giữa các tập. Tuy nhiên, nếu dữ liệu vừa có yếu tố thời gian vừa mất cân bằng, cần ưu tiên logic thời gian trước, sau đó kiểm tra xem mỗi tập có đủ số mẫu quan trọng để đánh giá hay không. 5. Tiền xử lý phải học từ train, không học từ toàn bộ dữ liệu Một lỗi rất hay gặp là chuẩn hóa, điền giá trị thiếu, chọn đặc trưng hoặc vector hóa văn bản trên toàn bộ dữ liệu trước khi chia train/test. Việc này làm thông tin từ test rò rỉ vào quá trình huấn luyện. Nguyên tắc đơn giản: mọi phép biến đổi có bước “học” từ dữ liệu phải fit trên train, sau đó transform validation và test. Ví dụ: - StandardScaler: fit trên train, transform train/validation/test - Imputer: học giá trị trung bình hoặc trung vị từ train - TF-IDF: xây từ vựng từ train, không dùng toàn bộ corpus - Feature selection: chọn đặc trưng dựa trên train, không dựa trên test Cách an toàn là đóng gói tiền xử lý và mô hình vào pipeline, tránh thao tác thủ công rời rạc. 6. Đừng chỉ nhìn một lần chia dữ liệu Nếu dữ liệu nhỏ, kết quả có thể thay đổi mạnh tùy cách chia. Một mô hình thắng ở lần chia này chưa chắc thắng ở lần chia khác. Khi có thể, hãy dùng cross-validation hoặc lặp lại nhiều lần chia để xem hiệu năng trung bình và độ dao động. Tuy nhiên, với dữ liệu thời gian, không nên dùng K-Fold ngẫu nhiên thông thường. Hãy dùng cách đánh giá dạng rolling hoặc expanding window, trong đó mô hình luôn được train trên quá khứ và kiểm tra trên tương lai. 7. Một checklist ngắn trước khi tin kết quả đánh giá Trước khi báo cáo điểm số của mô hình, hãy tự hỏi: - Dữ liệu test có thực sự chưa được dùng để ra quyết định không? - Cách chia có phản ánh tình huống triển khai thật không? - Có rò rỉ dữ liệu giữa các người dùng, nhóm, thời điểm hoặc phiên bản không? - Các bước tiền xử lý có chỉ fit trên train không? - Tập validation/test có đủ số mẫu quan trọng để đánh giá không? - Nếu dữ liệu nhỏ, kết quả có ổn định qua nhiều lần chia không? Kết luận Chia dữ liệu không chỉ là thao tác kỹ thuật mà là một phần quan trọng của thiết kế thí nghiệm trong Machine Learning. Một mô hình tốt cần được đánh giá trong điều kiện càng giống thực tế càng tốt. Nếu cách chia dữ liệu sai, mọi chỉ số phía sau đều có thể dẫn bạn đến quyết định sai. Trước khi thử mô hình phức tạp hơn, hãy dành thời gian kiểm tra lại chiến lược chia dữ liệu. Đây là một bước nhỏ, nhưng thường giúp tiết kiệm rất nhiều công sức khi dự án đi từ thử nghiệm sang triển khai thật.