python-100Đọc toàn bộ đề miễn phí

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

PythonNâng cao35 phút

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ủ đề

pandastarget encodingcross validationfeature engineering

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 cat_col. Với các category mới chưa từng xuất hiện trong train_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.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ế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.