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ố
Ccủ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.
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 AUC | Validation AUC | Kết luận |
|---|---|---|
| 0,72 | 0,70 | Underfit nhẹ, thử mô hình phức tạp hơn |
| 0,90 | 0,86 | Cân bằng tốt |
| 0,97 | 0,78 | Overfit rõ |
| 0,99 | 0,55 | Overfit 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.
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ạ:
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.813C 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.
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ách | Khi nào dùng |
|---|---|
| Thêm dữ liệu | Luôn hiệu quả nếu có thể |
| Giảm số đặc trưng | Nhiều đặc trưng nhiễu |
| Giới hạn độ sâu cây | max_depth, min_samples_leaf |
| Dừng sớm | Gradient boosting |
| Cross-validation | Chọn siêu tham số ổn định |
| Bagging | Giả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:
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ăngClạ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
- Chạy vòng lặp
Cvà ghi bảng train/validation. - Chọn
Ctốt nhất theo validation. - Thử L1 và đếm số hệ số bằng 0.
- Vẽ learning curve và kết luận có nên thêm dữ liệu.
- Giải thích vì sao
C=100overfit.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Train 0,99 val 0,70 | Overfit | Giảm C, giảm độ sâu |
| Train và val cùng thấp | Underfit | Tăng độ phức tạp |
Đổi C không thay đổi gì | Chuẩn hoá sai | Dùng pipeline |
| Val dao động mạnh | Tập validation nhỏ | Cross-validation |
| Hệ số quá lớn | Không regularization | Thê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.
Cnhỏ 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