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 đượ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_colhoặctarget_colkhông có trongdf.columns, raiseKeyError("Khong tim thay cot yeu cau"). - Nếu
n_splits < 2hoặclen(df) < n_splits, raiseValueError("n_splits khong hop le"). - Tạo K-Fold chia đều các chỉ số dòng
0, 1, ..., N-1thànhn_splitsfold 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_idxlà tất cả các chỉ số không thuộc fold k. - Tập kiểm định trong fold:
val_idxlà 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
cat_col. Với các category mới chưa từng xuất hiện trongtrain_data, 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.Seriesfloat.
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
TrueGiả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.
