Mã hóa biến định danh Target Encoding với K-Fold Out-of-Fold chống rò rỉ dữ liệu
Sc = nc · yc + m · ync + m
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: kfold, groupby, smoothing.
Nội dung đề bài
Mục tiêu kiến thức
- Hiểu hiện tượng rò rỉ mục tiêu (Target Leakage) khi mã hóa biến phân loại bậc cao (High-Cardinality Categoricals).
- Triển khai kỹ thuật Out-of-Fold (OOF) Target Encoding kết hợp K-Fold deterministic.
- Áp dụng công thức làm mượt Bayes (M-estimate Smoothing):
Sc = nc · yc + m · ync + m trong đó nc là số mẫu của lớp c, yc là giá trị trung bình mục tiêu của lớp c, y là giá trị trung bình toàn cục và m là hệ số smoothing.
Mô tả bài toán
Viết hàm kfold_target_encoder(df: pd.DataFrame, cat_col: str, target_col: str, n_splits: int = 5, smoothing: float = 10.0) -> pd.Series:
- Kiểm tra tính hợp lệ:
- Nếu cat_col hoặc target_col không có trong df.columns, raise KeyError("Khong tim thay cot yeu cau").
- Nếu n_splits < 2 hoặc len(df) < n_splits, raise ValueError("n_splits khong hop le").
- Tạo K-Fold chia đều các chỉ số dòng 0, 1, ..., N-1 thành n_splits fold liên tiếp (deterministic chunking):
- Fold k gồm các chỉ số từ ⌊ k × N / n_splits ⌋ đến ⌊ (k + 1) × N / n_splits ⌋ - 1.
- Khởi tạo một Series encoded = pd.Series(index=df.index, dtype=float).
- Với mỗi fold k:
- Tập huấn luyện ngoài fold: train_idx là tất cả các chỉ số không thuộc fold k.
- Tập kiểm định trong fold: val_idx là các chỉ số thuộc fold k.
- Trên train_data = df.iloc[train_idx]:
- Tính trung bình toàn cục: y = train_data[target_col].mean().
- Thống kê theo từng category c: số lượng nc và trung bình yc.
- Tính giá trị làm mượt: Sc = nc · yc + smoothing · ync + smoothing.
- Áp dụng vào val_data = df.iloc[val_idx]:
- Ánh xạ giá trị Sc vào từng dòng theo catcol. Với các category mới chưa từng xuất hiện trong traindata, gán bằng giá trị y toàn cục.
- Lưu kết quả vào encoded.iloc[val_idx].
- Trả về pd.Series đã được mã hóa.
Input
- Tham số: df: pd.DataFrame, cat_col: str, target_col: str, n_splits: int, smoothing: float.
Output
- Trả về: pd.Series float.
Ràng buộc
- Thời gian chạy tối đa: 1000ms.
- Giới hạn bộ nhớ: 256MB.
- Dữ liệu đầu vào tuân thủ đúng kiểu dữ liệu và miền giá trị được mô tả.
Ví dụ 1
Input
kfold_target_encoder(data=[{'cat': 'A', 'target': 1.0}, {'cat': 'A', 'target': 1.0}, {'cat': 'B', 'target': 0.0}, {'cat': 'B', 'target': 0.0}], cat_col='cat', target_col='target', n_splits=2, smoothing=1.0)
Output
[0.0, 0.0, 1.0, 1.0]
Giải thích
Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.
Ví dụ 2
Input
kfold_target_encoder(data=[{'cat': 'A'}], cat_col='cat', target_col='target', n_splits=2)
Output
True
Giải thích
Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
