DHDataHọc
TheoryLesson 3/84 min read+10 XP

Overfitting và regularization

Bạn sẽ học được

  • Nhận ra overfitting qua khoảng cách train và validation.
  • Hiểu đánh đổi bias – variance bằng trực giác.
  • Dùng regularization L1 và L2.
  • Đọc tham số C của scikit-learn đúng chiều.
  • Các cách kiểm soát overfitting ngoài regularization.

Khái niệm cốt lõi

Overfitting là mô hình học cả nhiễu trong tập train, nên rất tốt trên train và kém trên dữ liệu mới.

Underfitting là mô hình quá đơn giản, kém ở cả hai.

code
Underfitting   ←  độ phức tạp  →   Overfitting
Train: kém                          Train: rất tốt
Val:   kém                          Val:   kém

Điểm cần nhìn không phải điểm train mà là khoảng cách giữa train và validation.

Bảng chẩn đoán

Train AUCValidation AUCKết luận
0,720,70Underfit nhẹ, thử mô hình phức tạp hơn
0,900,86Cân bằng tốt
0,970,78Overfit rõ
0,990,55Overfit nặng, gần như học thuộc

Với dữ liệu mất cân bằng, dùng PR-AUC hoặc F1 thay cho accuracy khi lập bảng này.

Bias – variance

  • Bias cao: mô hình giả định quá đơn giản. Ví dụ dùng đường thẳng cho quan hệ cong.
  • Variance cao: mô hình thay đổi mạnh khi dữ liệu thay đổi. Ví dụ cây sâu không giới hạn.

Regularization làm tăng bias một chút để giảm variance nhiều hơn. Đó là đánh đổi có lợi khi mô hình đang overfit.

Regularization L2

L2 phạt tổng bình phương trọng số, kéo các hệ số về gần 0 nhưng hiếm khi bằng 0.

code
from sklearn.linear_model import LogisticRegression

for c in [100, 1, 0.1, 0.01]:
    model = LogisticRegression(C=c, max_iter=1000)
    model.fit(X_train, y_train)
    train_auc = roc_auc_score(y_train, model.predict_proba(X_train)[:, 1])
    val_auc = roc_auc_score(y_val, model.predict_proba(X_val)[:, 1])
    print(f"C={c:<6} train={train_auc:.3f} val={val_auc:.3f}")

Kết quả minh hoạ:

code
C=100    train=0.972 val=0.781
C=1      train=0.901 val=0.862
C=0.1    train=0.874 val=0.858
C=0.01   train=0.821 val=0.813

C là nghịch đảo của cường độ regularization. C nhỏ = phạt mạnh = mô hình đơn giản hơn. Đây là chỗ nhiều người hiểu ngược.

Chọn C trên validation, không trên test.

Regularization L1

L1 phạt tổng trị tuyệt đối, đẩy một số hệ số về đúng 0 — đồng thời chọn đặc trưng.

code
from sklearn.linear_model import LogisticRegression

model = LogisticRegression(
    penalty="l1",
    solver="liblinear",
    C=0.1,
    max_iter=1000,
)
model.fit(X_train, y_train)

Dùng L1 khi có nhiều đặc trưng và nghi ngờ phần lớn vô ích. Dùng L2 khi muốn giữ mọi đặc trưng nhưng giảm ảnh hưởng.

Elastic Net kết hợp cả hai, điều chỉnh bằng l1_ratio.

Các cách khác kiểm soát overfitting

CáchKhi nào dùng
Thêm dữ liệuLuôn hiệu quả nếu có thể
Giảm số đặc trưngNhiều đặc trưng nhiễu
Giới hạn độ sâu câymax_depth, min_samples_leaf
Dừng sớmGradient boosting
Cross-validationChọn siêu tham số ổn định
BaggingGiảm variance của mô hình

Với cây quyết định, max_depth=3 thường tốt hơn max_depth=None dù điểm train thấp hơn nhiều.

Learning curve

Đường cong học cho biết thêm dữ liệu có giúp không:

code
from sklearn.model_selection import learning_curve
import numpy as np

sizes, train_scores, val_scores = learning_curve(
    model, X_train, y_train, cv=5,
    train_sizes=np.linspace(0.1, 1.0, 5),
    scoring="roc_auc",
)
print(sizes)
print(train_scores.mean(axis=1))
print(val_scores.mean(axis=1))

Đọc kết quả:

  • Hai đường còn xa nhau và validation còn tăng: thêm dữ liệu sẽ giúp.
  • Hai đường gần nhau nhưng cùng thấp: underfit, cần mô hình phức tạp hơn.
  • Hai đường gần nhau và cao: mô hình đã ổn.

Lỗi thường gặp

  • Chọn mô hình theo điểm train: luôn chọn mô hình overfit nhất.
  • Hiểu ngược C: tăng C lại tưởng là tăng regularization.
  • Regularization quá mạnh: underfit, cả train và validation đều thấp.
  • Chuẩn hoá trước khi chia dữ liệu: rò rỉ, bài 4 và 6 sẽ nói.
  • Không kiểm tra learning curve: thêm dữ liệu vô ích mà không biết.
  • Dùng accuracy để chẩn đoán: che mất vấn đề mất cân bằng.

Thực hành

  1. Chạy vòng lặp C và ghi bảng train/validation.
  2. Chọn C tốt nhất theo validation.
  3. Thử L1 và đếm số hệ số bằng 0.
  4. Vẽ learning curve và kết luận có nên thêm dữ liệu.
  5. Giải thích vì sao C=100 overfit.

Lỗi thường gặp

Triệu chứngNguyên nhânCách sửa
Train 0,99 val 0,70OverfitGiảm C, giảm độ sâu
Train và val cùng thấpUnderfitTăng độ phức tạp
Đổi C không thay đổi gìChuẩn hoá saiDùng pipeline
Val dao động mạnhTập validation nhỏCross-validation
Hệ số quá lớnKhông regularizationThêm L2

Tóm tắt

  • Overfitting = khoảng cách lớn giữa train và validation.
  • Regularization đánh đổi bias lấy variance.
  • C nhỏ là regularization mạnh.
  • L1 chọn đặc trưng, L2 co hệ số.
  • Learning curve cho biết nên thêm dữ liệu hay đổi mô hình.

Use ← → to move between lessons