Hồi quy là nhóm thuật toán học có giám sát dùng để dự đoán một giá trị liên tục (số thực) — ví dụ giá nhà, doanh thu, nhiệt độ. Mô hình học mối quan hệ giữa các đặc trưng đầu vào và biến mục tiêu, rồi suy ra giá trị cho dữ liệu mới. Trang này đi qua ba thuật toán nền tảng: Linear Regression, Logistic Regression (thực chất là phân loại) và Stepwise Regression.
Mô hình giả định biến mục tiêu là tổ hợp tuyến tính của các đặc trưng. Với một mẫu có các đặc trưng \(x_1, x_2, \dots, x_n\):
Trong đó \(\theta_0\) là hệ số chặn (bias), \(\theta_1\dots\theta_n\) là các trọng số, và \(X\) là ma trận đặc trưng đã thêm cột \(1\) để gộp \(\theta_0\) vào vector tham số \(\theta\). Mục tiêu là tìm \(\theta\) sao cho dự đoán \(\hat y\) sát với giá trị thực \(y\) nhất.
Sai số được đo bằng trung bình bình phương sai số (Mean Squared Error). Với \(m\) mẫu:
Hệ số \(\tfrac{1}{2}\) chỉ để đạo hàm gọn hơn (triệt tiêu số 2 khi lấy gradient), không ảnh hưởng vị trí cực tiểu. Vì \(J(\theta)\) là hàm lồi theo \(\theta\) nên có duy nhất một cực tiểu toàn cục.
Cho đạo hàm của \(J(\theta)\) bằng \(0\) và giải trực tiếp, ta được công thức nghiệm chính xác:
Ưu điểm: không cần chọn learning rate, không lặp, ra nghiệm chính xác trong một bước. Tuy nhiên không phải lúc nào cũng dùng được:
Thay vì giải trực tiếp, ta cập nhật \(\theta\) từng bước theo hướng giảm dần của hàm mất mát. Phù hợp khi dữ liệu lớn hoặc khi \(X^\top X\) khó nghịch đảo. Chi tiết cơ chế xem trang Gradient Descent.
Ý tưởng: lấy tổ hợp tuyến tính \(z=X\theta\) rồi ép về khoảng \((0,1)\) bằng hàm sigmoid để diễn giải thành xác suất:
Xác suất mẫu thuộc lớp dương:
Không dùng MSE (sẽ thành hàm không lồi với sigmoid), thay vào đó dùng cross-entropy. Ký hiệu \(\hat p_i=\sigma(X_i\theta)\):
Hàm này lồi nên gradient descent hội tụ về cực tiểu toàn cục. Trực giác: khi mẫu thuộc lớp \(1\) mà mô hình dự đoán \(\hat p\) thấp thì \(-\log\hat p\) rất lớn — phạt nặng dự đoán tự tin nhưng sai.
Điều thú vị là gradient của cross-entropy có đúng dạng như của Linear Regression:
Khác biệt duy nhất nằm ở chỗ \(\hat p=\sigma(X\theta)\) thay vì \(\hat y=X\theta\). Không có nghiệm đóng (vì sigmoid phi tuyến) nên bắt buộc giải bằng gradient descent hoặc các biến thể (LBFGS, Newton).
Dự đoán nhãn bằng ngưỡng: nếu \(\hat p \ge 0.5\) thì gán lớp \(1\), ngược lại lớp \(0\). Vì \(\sigma(z)=0.5\) khi \(z=0\), ranh giới quyết định là \(X\theta=0\) — một siêu phẳng tuyến tính. Có thể chỉnh ngưỡng (khác 0.5) để cân bằng precision/recall tùy bài toán.
Stepwise Regression không phải một mô hình mới mà là quy trình chọn tập đặc trưng cho mô hình hồi quy: thêm/bớt biến từng bước theo một tiêu chí thống kê, nhằm tìm mô hình gọn mà vẫn giải thích tốt.
| Ưu điểm | Nhược điểm |
|---|---|
| Giảm overfitting, mô hình gọn và dễ diễn giải; tự động loại biến thừa. | Tham lam (greedy) — chọn tối ưu cục bộ từng bước, không đảm bảo tối ưu toàn cục; kết quả bất ổn (đổi chút dữ liệu là đổi tập biến); việc lặp lại kiểm định làm sai lệch p-value. |
| Thuật toán | Loại bài toán | Đầu ra | Cách huấn luyện |
|---|---|---|---|
| Linear Regression | Hồi quy (giá trị liên tục) | Số thực \(\hat y\) | Normal Equation hoặc Gradient Descent (MSE) |
| Logistic Regression | Phân loại nhị phân | Xác suất \(\hat p\in(0,1)\) → nhãn lớp | Gradient Descent (Cross-Entropy) — không có nghiệm đóng |
| Stepwise Regression | Chọn biến cho mô hình hồi quy | Tập đặc trưng + mô hình tuyến tính | Thêm/bớt biến theo p-value, AIC, BIC, adjusted \(R^2\) |
from sklearn.linear_model import LinearRegression, LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.2) # --- Hồi quy: dự đoán giá trị liên tục --- reg = LinearRegression() reg.fit(X_tr, y_tr) print("R^2:", reg.score(X_te, y_te)) # R^2 trên tập test # --- Phân loại: Logistic Regression --- scaler = StandardScaler().fit(X_tr) # chuẩn hóa trước clf = LogisticRegression(max_iter=1000) clf.fit(scaler.transform(X_tr), y_tr) proba = clf.predict_proba(scaler.transform(X_te))[:, 1] # P(y=1)