Rò rỉ dữ liệu
Bạn sẽ học được
- Sáu loại rò rỉ dữ liệu thường gặp.
- Cách phát hiện rò rỉ qua điểm bất thường.
- Vì sao rò rỉ chỉ lộ ra khi triển khai.
- Quy trình kiểm tra trước khi báo cáo kết quả.
- Cách sửa từng loại rò rỉ.
Khái niệm cốt lõi
Rò rỉ dữ liệu là khi mô hình được tiếp xúc với thông tin mà lúc dự đoán thật nó sẽ không có.
Mô hình không "gian lận" — nó chỉ học đúng thứ được đưa vào. Vấn đề là thứ đó không tồn tại trong production.
Điểm validation 0,98 → triển khai → thực tế 0,62Khoảng cách đó gần như luôn là rò rỉ.
Sáu loại rò rỉ
| Loại | Ví dụ | Dấu hiệu |
|---|---|---|
| Rò rỉ nhãn | Cột cancel_date khi dự đoán huỷ | Một đặc trưng áp đảo |
| Ô nhiễm train-test | Chuẩn hoá trước khi chia | Điểm CV cao hơn test |
| Rò rỉ thời gian | Chia ngẫu nhiên dữ liệu chuỗi | Điểm test rất cao |
| Rò rỉ nhóm | Cùng khách ở train và test | Điểm cao bất thường |
| Dòng trùng | Bản ghi lặp ở hai tập | Test gần như train |
| Rò rỉ gián tiếp | customer_id tương quan với nhãn | ID có trọng số lớn |
Rò rỉ nhãn
Ví dụ rõ nhất: dự đoán khách huỷ, nhưng đặc trưng gồm cancel_date hoặc refund_after_cancel.
print(df.groupby(df["cancel_date"].notna())["churned"].mean())Kết quả:
cancel_date
False 0.00
True 1.00Một đặc trưng dự đoán hoàn hảo. Không phải vì mô hình giỏi, mà vì thông tin đó chỉ tồn tại sau khi khách đã huỷ.
Cách sửa: xác định thời điểm dự đoán, rồi loại mọi cột được tạo sau thời điểm đó.
Ô nhiễm train-test
# Sai
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_train, X_test = train_test_split(X_scaled)
# Đúng
model = Pipeline([("scale", StandardScaler()), ("clf", LogisticRegression())])
model.fit(X_train, y_train)Lỗi này thường nhỏ và khó thấy, nhưng với tập dữ liệu nhỏ hoặc nhiều đặc trưng, nó làm điểm lạc quan rõ rệt. Cách phòng: luôn dùng Pipeline.
Rò rỉ thời gian
Dữ liệu tháng 1–12, chia ngẫu nhiên 80/20. Mô hình học từ tháng 11 để dự đoán tháng 3 — dùng tương lai dự đoán quá khứ.
Cách sửa: chia theo mốc thời gian, train luôn trước validation và test.
Với dự báo theo thời gian, còn cần kiểm tra các đặc trưng dạng cửa sổ trượt: giá trị trung bình 30 ngày tại thời điểm t chỉ được dùng dữ liệu đến t, không dùng t+1.
Rò rỉ nhóm
overlap = set(train["customer_id"]) & set(test["customer_id"])
print("Khách xuất hiện ở cả hai tập:", len(overlap))Nếu con số lớn hơn 0 với dữ liệu nhiều dòng mỗi khách, phải chia theo nhóm:
from sklearn.model_selection import GroupShuffleSplit
splitter = GroupShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
train_idx, test_idx = next(splitter.split(X, y, groups=df["customer_id"]))Dòng trùng
dups = df.duplicated(subset=["customer_id", "event_date"], keep=False)
print("Số dòng trùng:", dups.sum())Xử lý trước khi chia. Nếu không, cùng một quan sát có thể rơi vào cả train và test.
Rò rỉ gián tiếp qua ID
customer_id thường không mang thông tin thật, nhưng nếu dữ liệu được tạo hoặc sắp xếp theo thời gian, ID có thể tương quan với nhãn. Mô hình sẽ học ID thay vì tín hiệu.
Cách phòng: loại mọi cột định danh khỏi đặc trưng, trừ khi ID thật sự có ý nghĩa dự báo và có sẵn lúc dự đoán.
Quy trình kiểm tra
Trước khi báo cáo bất kỳ kết quả nào:
- Liệt kê thời điểm dự đoán và xác nhận từng đặc trưng có sẵn tại thời điểm đó.
- Kiểm tra điểm bất thường. Validation AUC trên 0,95 với dữ liệu hành vi thường là dấu hiệu xấu.
- Kiểm tra đặc trưng áp đảo. Nếu một đặc trưng chiếm phần lớn độ quan trọng, xem nó có hợp lệ không.
- Kiểm tra trùng lặp và giao nhau giữa các tập.
- Kiểm tra pipeline để chắc tiền xử lý nằm trong đó.
- So sánh với một mô hình chỉ dùng đặc trưng an toàn. Nếu chênh lệch lớn, tìm đặc trưng gây ra.
Lỗi thường gặp
- Tin vào điểm validation quá cao: không kiểm tra nguồn gốc đặc trưng.
- Chuẩn hoá trước khi chia: ô nhiễm.
- Chia ngẫu nhiên dữ liệu thời gian: rò rỉ tương lai.
- Giữ
customer_idlàm đặc trưng: học ID. - Không khử trùng lặp: cùng dòng ở hai tập.
- Chỉ kiểm tra sau khi triển khai: phát hiện muộn và tốn kém.
Thực hành
- Tìm một đặc trưng rò rỉ nhãn trong bộ dữ liệu mẫu.
- Kiểm tra giao nhau của
customer_idgiữa train và test. - Đếm dòng trùng theo khách và ngày.
- So sánh điểm khi chuẩn hoá trước và sau khi chia.
- Viết danh sách kiểm tra sáu bước cho dự án của bạn.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Validation 0,99 | Rò rỉ nhãn | Loại cột tương lai |
| Test tốt, production kém | Nhiều loại rò rỉ | Kiểm tra sáu bước |
| CV cao hơn test | Tiền xử lý ngoài pipeline | Dùng Pipeline |
| ID có trọng số lớn | Rò rỉ gián tiếp | Bỏ cột định danh |
| Điểm giảm khi bỏ một cột | Cột đó gây rò rỉ | Kiểm tra nguồn gốc |
Tóm tắt
- Rò rỉ là mô hình thấy thông tin không có lúc dự đoán.
- Sáu loại: nhãn, ô nhiễm, thời gian, nhóm, trùng lặp, gián tiếp.
- Điểm validation quá cao là dấu hiệu cảnh báo, không phải thành tích.
- Pipeline loại bỏ phần lớn ô nhiễm train-test.
- Kiểm tra trước khi báo cáo, không chờ đến khi triển khai.
Dùng ← → để chuyển bài