App: tuning siêu tham số với gradient và eval

Xây pipeline tuning: gradient descent cho hồi quy, random và grid search siêu tham số, eval chống overfit, báo cáo đường cong học.
Chuyên giaThuật toán ~120 phút

Giới thiệu

Bài này học chỉnh model cho vừa đẹp. Nhỏ quá thì dốt, lớn quá thì học vẹt.

Kiến thức cần nhớ

Gradient descent học tham số

  • Tham số là số trong model, học bằng bước ngược gradient.
  • Learning rate lớn quá thì phân kỳ, nhỏ quá thì lì.
  • Log loss mỗi epoch để vẽ đường cong học.
  • Ví dụ đời thường: xuống núi đi bước vừa chân, bước dài quá thì ngã.
  • Siêu tham số là số ngoài model như độ sâu cây.
  • Grid search vét hết lưới, random search bốc ngẫu nhiên.
  • Cùng 20 trial thì random hay thắng vì ít siêu tham số quan trọng.
  • Mỗi trial chấm bằng cross-validation 3-fold cho chắc.

Chống overfit khi eval

  • Chia train, validation, test theo 60-20-20 có seed.
  • Chọn cấu hình trên validation, đo test đúng 1 lần cuối.
  • Train tốt mà validation tệ là overfit học vẹt.
  • Điểm train cao hơn hẳn validation là dấu hiệu overfit; khoảng cách nhỏ và ổn định qua các fold mới đáng tin.
# Vòng tuning gọn
for params in search(20):  # grid hoặc random 20 trial
    score = cross_val(params, train)  # chấm CV 3-fold
    log(params, score)  # ghi nhật ký
best = pick_best()  # chốt trên validation
test_once(best)  # đo test đúng 1 lần

Ví dụ

  • Input: hồi quy tuyến tính với 3 learning rate. Output: rate vừa cho loss giảm đều, rate lớn gây phân kỳ.
  • Giải thích: bước quá dài nhảy qua đáy nên loss nổ tung.
  • Input: cây quá sâu. Output: train tốt, validation tệ, gap lớn.
  • Giải thích: cây nhớ vẹt từng điểm train nên không tổng quát.

💻 Bài tập

Ngôn ngữ: Python 3 với sklearn. Nộp vào day-138-tuning/.

Bài 1: Đường cong học

  1. Dùng logistic regression tự cài (ngày 55) trên Breast Cancer. Quét lr = 1, 0.1, 0.01, 0.001. Vẽ log-loss theo epoch cho cả 4.
  2. Chia train/validation/test 60/20/20 có seed. In loss train và validation mỗi epoch.
  3. Chỉ ra lr phân kỳ, lr lì, lr tốt.

Bài 2: Grid search và random search tự cài

def grid_search(model_fn, param_grid: dict, X, y, cv=3, seed=0) -> list[dict]: ...
def random_search(model_fn, param_dist: dict, n_iter: int, X, y, cv=3, seed=0) -> list[dict]: ...
# param_dist: giá trị là list (chọn đều) hoặc hàm sinh (ví dụ log-uniform)
# Trả mọi trial: params, mean_score, std_score, time

Dùng GradientBoostingClassifier trên bộ Adult Income với 4 siêu tham số: learning_rate, max_depth, n_estimators, subsample.

cách        số_trial   best_cv   test_score   thời_gian
grid        81         ...
random      20         ...
random      81         ...

Vẽ điểm CV theo từng siêu tham số (scatter). Chỉ ra siêu tham số nào quan trọng nhất.

Bài 3: Tối ưu thông minh hơn (nâng cao)

  1. Dùng optuna (TPE) với 40 trial. So với random 40 trial.
  2. Thêm pruning: dừng sớm trial có điểm thấp ở fold đầu.
  3. Chỉ đánh giá test đúng 1 lần với cấu hình cuối cùng. Ghi rõ trong README.md quy trình để không rò rỉ.
  4. Chạy lại toàn bộ với seed khác. So cấu hình được chọn.

✅ Tiêu chí hoàn thành

  • Hình đường cong học 4 lr.
  • Grid và random tự cài, bảng so sánh có số thật.
  • Bảng random vs optuna.
  • Test chỉ chạm 1 lần, có ghi quy trình.

❓ Câu hỏi ôn tập

  • Learning rate lớn quá và nhỏ quá gây gì?
  • Random search thắng grid search khi nào?
  • Overfit lộ qua dấu hiệu nào?
  • Vì sao test chỉ đo 1 lần cuối?

🌕 Bạn đã hoàn thành ngày 138. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.