Vì k-fold ngẫu nhiên xáo trộn thứ tự thời gian: mô hình được huấn luyện trên dữ liệu tháng 6 rồi đem dự đoán tháng 3. Đó là rò rỉ thời gian, và điểm cross-validation sẽ cao hơn hẳn kết quả thực tế khi mô hình dự báo tương lai chưa biết.
Cách đúng — validation theo cửa sổ trượt tiến về phía trước:
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
# train always precedes test in time
...Hai biến thể:
- Expanding window: tập train lớn dần (fold 1 train tháng 1, test tháng 2; fold 2 train tháng 1-2, test tháng 3...). Mặc định của TimeSeriesSplit.
- Rolling window: giữ độ dài train cố định, trượt theo thời gian. Hợp khi quan hệ dữ liệu thay đổi và dữ liệu quá cũ gây nhiễu.
Những điểm dễ sai kèm theo:
- Gap giữa train và test. Nếu nhãn chỉ biết sau 30 ngày (ví dụ khách có trả nợ không), phải chừa khoảng trống bằng độ trễ nhãn, nếu không lúc train đã dùng thông tin chưa thể có.
- Feature dạng cửa sổ trượt (trung bình 7 ngày, tổng luỹ kế) phải tính chỉ từ quá khứ, không được dùng mean() toàn chuỗi.
- Chuẩn hoá và điền thiếu cũng phải fit trên phần quá khứ.
- Với dữ liệu bảng có cột thời gian nhưng không phải chuỗi thời gian thuần (ví dụ hồ sơ vay), vẫn nên tách tập test theo mốc thời gian để bản đánh giá giống production nhất.