Leakage là khi thông tin không có ở thời điểm dự đoán thật lọt vào lúc huấn luyện. Triệu chứng điển hình: điểm offline cao bất thường nhưng lên production sụp.
Các dạng hay gặp:
1. Tiền xử lý trước khi tách tập. Gọi scaler.fit() hoặc điền giá trị thiếu trên toàn bộ dữ liệu rồi mới train_test_split → thống kê của tập test đã tham gia huấn luyện.
2. Feature thuộc tương lai. Ví dụ dự đoán khách rời bỏ nhưng dùng cột ngay_huy_hop_dong, hoặc dự đoán nợ xấu bằng cột so_lan_nhac_no chỉ tồn tại sau khi đã quá hạn.
3. Target leakage gián tiếp. Cột là hệ quả của nhãn: dự đoán bệnh nhân mắc bệnh X nhưng feature có loai_thuoc_da_ke.
4. Rò rỉ theo nhóm. Cùng một khách hàng/bệnh nhân/thiết bị xuất hiện ở cả train và test → mô hình nhớ cá thể chứ không học quy luật. Phải dùng GroupKFold.
5. Rò rỉ theo thời gian. Xáo trộn ngẫu nhiên dữ liệu chuỗi thời gian khiến mô hình học từ tương lai để đoán quá khứ.
6. Rò rỉ do chọn feature/tinh chỉnh trên toàn bộ dữ liệu rồi mới cross-validate.
Cách phòng:
- Bọc mọi bước biến đổi vào Pipeline và đặt cả pipeline vào cross-validation — fit chỉ chạy trên phần train của từng fold.
pipe = Pipeline([
('impute', SimpleImputer()),
('scale', StandardScaler()),
('model', LogisticRegression()),
])
cross_val_score(pipe, X, y, cv=5) # scaler fits inside each fold only- Với mỗi feature, hỏi: "tại thời điểm dự đoán, giá trị này đã tồn tại chưa?"
- Giữ một tập giữ lại (holdout) theo thời gian, không đụng tới cho đến khi chốt mô hình.