Nhóm 4

Regularization — chống overfitting

Regularization là kỹ thuật thêm một số hạng phạt vào hàm mất mát để kiểm soát độ lớn của hệ số mô hình. Bằng cách "ép" các hệ số nhỏ lại, ta đánh đổi một chút bias để giảm mạnh variance, giúp mô hình tổng quát hoá tốt hơn trên dữ liệu mới thay vì học thuộc lòng nhiễu trong tập huấn luyện.

1. Vì sao cần regularization
Overfitting và đánh đổi bias–variance

Overfitting xảy ra khi mô hình quá phức tạp so với lượng thông tin thực sự có trong dữ liệu: nó khớp gần như hoàn hảo với tập huấn luyện (kể cả nhiễu ngẫu nhiên) nhưng lại dự đoán kém trên dữ liệu chưa thấy. Dấu hiệu kinh điển là sai số huấn luyện rất thấp nhưng sai số kiểm thử cao.

Sai số kỳ vọng của một mô hình có thể tách thành ba phần — đây chính là đánh đổi bias–variance:

$$\mathbb{E}\big[(y-\hat{f}(x))^2\big]=\underbrace{\text{Bias}^2}_{\text{sai lệch hệ thống}}+\underbrace{\text{Variance}}_{\text{độ nhạy với dữ liệu}}+\underbrace{\sigma^2}_{\text{nhiễu không khử được}}$$

Ý tưởng cốt lõi của regularization: các hệ số có độ lớn lớn thường là biểu hiện của một mô hình "gồ ghề", dao động mạnh. Bằng cách thêm số hạng phạt độ lớn hệ số vào hàm mục tiêu, ta buộc mô hình phải "trả giá" cho sự phức tạp, qua đó tạo ra một hàm mượt hơn, ổn định hơn — chấp nhận tăng nhẹ bias để đổi lấy mức giảm variance lớn hơn nhiều.

Bias–variance tradeoff: mục tiêu không phải triệt tiêu cả hai (bất khả thi vì còn nhiễu \(\sigma^2\)), mà tìm điểm cân bằng làm tổng sai số kỳ vọng nhỏ nhất. Tham số \(\lambda\) của regularization chính là "núm xoay" để điều chỉnh điểm cân bằng này.
2. Ridge Regression (L2)
Phạt theo bình phương chuẩn \(\ell_2\)

Ridge thêm vào hàm mất mát bình phương chuẩn \(\ell_2\) của vector hệ số. Hàm mục tiêu cần tối thiểu hoá:

$$J(\theta)=\frac{1}{2m}\lVert X\theta-y\rVert^2+\lambda\lVert\theta\rVert_2^2$$

Vì số hạng phạt khả vi trơn ở mọi nơi, Ridge có nghiệm đóng (closed-form):

$$\theta=(X^\top X+\lambda I)^{-1}X^\top y$$

Điểm đẹp về mặt số học: ma trận \(X^\top X+\lambda I\) luôn khả nghịch khi \(\lambda\gt 0\), nhờ \(\lambda I\) đẩy mọi trị riêng lên dương. Điều này khắc phục được trường hợp \(X^\top X\) suy biến (khi đặc trưng cộng tuyến hoặc số đặc trưng nhiều hơn số mẫu) — nơi hồi quy tuyến tính thường thất bại.

Vai trò của \(\lambda\): khi \(\lambda\to 0\), Ridge quay về hồi quy tuyến tính thường (variance cao). Khi \(\lambda\to\infty\), mọi hệ số bị ép về 0 (mô hình gần như hằng số, bias cao). Giá trị \(\lambda\) tốt thường chọn bằng cross-validation.

3. LASSO (L1)
Phạt theo chuẩn \(\ell_1\) — tạo nghiệm thưa

LASSO (Least Absolute Shrinkage and Selection Operator) thay chuẩn \(\ell_2\) bằng chuẩn \(\ell_1\) — tổng giá trị tuyệt đối của các hệ số:

$$J(\theta)=\frac{1}{2m}\lVert X\theta-y\rVert^2+\lambda\lVert\theta\rVert_1$$

Khác biệt mang tính quyết định: LASSO tạo ra nghiệm thưa (sparse) — nhiều hệ số bị đẩy đúng bằng 0. Những đặc trưng có hệ số 0 coi như bị loại khỏi mô hình, nên LASSO đồng thời thực hiện chọn đặc trưng tự động (feature selection). Đây là ưu thế lớn khi dữ liệu có rất nhiều đặc trưng nhưng chỉ một số ít thực sự quan trọng.

Không có nghiệm đóng: chuẩn \(\ell_1\) không khả vi tại 0 (hàm \(|\theta|\) có điểm gãy), nên không thể giải bằng công thức ma trận như Ridge. Thay vào đó dùng các thuật toán lặp như coordinate descent (cập nhật lần lượt từng hệ số, rất nhanh) hoặc subgradient / proximal gradient.

Vì sao L1 cho nghiệm thưa — giải thích hình học: bài toán có thể nhìn dưới dạng tối thiểu hoá sai số trong một vùng ràng buộc quanh gốc toạ độ. Vùng ràng buộc của L1, \(|\theta_1|+|\theta_2|\le t\), là một hình thoi có các góc nhọn nằm ngay trên trục toạ độ. Các đường đồng mức (contour) hình elip của hàm sai số khi mở rộng ra rất dễ chạm vào vùng này tại một góc nhọn — mà tại góc thì một trong các toạ độ bằng 0, tức một hệ số bị triệt tiêu. Ngược lại, vùng ràng buộc của L2, \(\theta_1^2+\theta_2^2\le t\), là một hình tròn nhẵn không có góc, nên điểm tiếp xúc gần như luôn nằm ngoài trục → hệ số nhỏ nhưng khác 0.

Trực giác: "góc nhọn nằm trên trục" của hình thoi L1 chính là cơ chế hình học khiến LASSO đẩy hệ số về đúng 0, trong khi đường cong trơn của L2 chỉ co hệ số lại mà không loại bỏ.
4. Least-Angle Regression (LARS)
Xây toàn bộ regularization path một cách hiệu quả

LARS là một thuật toán hồi quy hiệu quả dùng để dựng toàn bộ đường hệ số (regularization path) — tức quỹ đạo của tất cả hệ số khi tham số \(\lambda\) thay đổi từ lớn (mọi hệ số = 0) về nhỏ — chỉ trong một lượt chạy có chi phí tương đương một phép bình phương tối thiểu.

Ý tưởng vận hành:

Liên hệ với LASSO: LARS có quan hệ rất chặt với LASSO — chỉ cần một chỉnh sửa nhỏ (cho phép hệ số bị loại khỏi tập hoạt động khi nó chạm 0), LARS sẽ tính được chính xác đường nghiệm LASSO. Đây là lý do trong sklearn có lớp LassoLars.

LARS đặc biệt hữu ích khi số đặc trưng rất lớn: nó cho ta nhìn toàn cảnh thứ tự các đặc trưng được "kích hoạt" và toàn bộ đường co hệ số mà không phải giải lại bài toán cho từng giá trị \(\lambda\).

So sánh L1 (LASSO) vs L2 (Ridge)
Chọn đúng công cụ cho bài toán
Tiêu chíLASSO (L1)Ridge (L2)
Số hạng phạt\(\lambda\lVert\theta\rVert_1\)\(\lambda\lVert\theta\rVert_2^2\)
Nghiệm thưa?Có — nhiều hệ số = 0Không — hệ số nhỏ nhưng khác 0
Feature selectionCó (tự động loại đặc trưng)Không (giữ lại tất cả)
Nghiệm đóngKhông (\(\ell_1\) không khả vi tại 0) → coordinate descent / LARSCó: \((X^\top X+\lambda I)^{-1}X^\top y\)
Đặc trưng tương quan caoCó xu hướng chọn 1, bỏ phần còn lạiPhân bổ trọng số đều cho cả nhóm
Khi nào dùngNhiều đặc trưng, nghi ngờ chỉ ít biến quan trọng, cần mô hình gọn & dễ giải thíchHầu hết đặc trưng đều có ích, có đa cộng tuyến, ưu tiên ổn định
Elastic Net = L1 + L2: kết hợp cả hai số hạng phạt \(\lambda_1\lVert\theta\rVert_1+\lambda_2\lVert\theta\rVert_2^2\). Vừa tạo được nghiệm thưa (như LASSO) vừa ổn định với nhóm đặc trưng tương quan (như Ridge) — thường là lựa chọn an toàn khi không chắc nên dùng L1 hay L2.
Code với scikit-learn
Ridge, Lasso, Lars
# Ridge, Lasso, LARS trong scikit-learn
from sklearn.linear_model import Ridge, Lasso, Lars, LassoLars
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

# Chuẩn hoá đặc trưng RỒI mới regularize (rất quan trọng)
ridge = make_pipeline(StandardScaler(), Ridge(alpha=1.0))
lasso = make_pipeline(StandardScaler(), Lasso(alpha=0.1))

ridge.fit(X_train, y_train)
lasso.fit(X_train, y_train)

# Xem hệ số nào bị LASSO ép về 0 (feature selection)
coef = lasso.named_steps['lasso'].coef_
print('Số đặc trưng còn lại:', (coef != 0).sum())

# LARS: dựng toàn bộ regularization path
lars = Lars(n_nonzero_coefs=10).fit(X_train, y_train)

# LassoLars = đường nghiệm LASSO tính bằng thuật toán LARS
lasso_lars = LassoLars(alpha=0.1).fit(X_train, y_train)
Luôn chuẩn hoá đặc trưng trước khi regularize: số hạng phạt cộng trực tiếp độ lớn các hệ số, nên nếu các đặc trưng có thang đo khác nhau (vd. tuổi 0–100 vs thu nhập hàng triệu), hệ số sẽ bị phạt không công bằng. Dùng StandardScaler (đưa về trung bình 0, độ lệch chuẩn 1) để mọi đặc trưng được đối xử bình đẳng.
Lưu ý về \(\lambda\) (alpha): chọn quá lớn → underfitting (bias cao); quá nhỏ → mất tác dụng chống overfitting. Hãy dò bằng RidgeCV / LassoCV hoặc GridSearchCV với cross-validation thay vì đoán thủ công.
← Quay lại
Nhóm 3: Instance-based