Hồi quy Logistic – Mô hình phân loại tuyến tính đầu tiên


(Logistic Regression – Binary Classification Model)


1. Mục tiêu bài học

Hồi quy tuyến tính chỉ phù hợp cho bài toán dự đoán giá trị liên tục. Với bài toán phân loại, như:

  • Dự đoán khách hàng có mua hàng không (0 hoặc 1)
  • Dự đoán email là spam hay không spam
  • Dự đoán bệnh nhân mắc bệnh hay không

Ta cần một mô hình đầu ra nhị phân (binary), không phải giá trị thực. Hồi quy logistic là mô hình đơn giản và phổ biến nhất cho các bài toán này.


2. Ý tưởng mô hình

Khác với hồi quy tuyến tính cho ra đầu ra y_hat bất kỳ trong khoảng (-∞, +∞)Logistic Regression giới hạn đầu ra trong khoảng (0, 1) bằng cách dùng hàm sigmoid:

    sigmoid(z) = 1 / (1 + exp(-z))

Với:

    z = w1 * x1 + w2 * x2 + ... + wd * xd + b

Kết quả y_hat = sigmoid(z) sẽ là xác suất mẫu thuộc lớp 1.


3. Diễn giải xác suất và quyết định nhị phân

  • y_hat là xác suất đầu vào thuộc lớp 1
  • Ngưỡng quyết định (threshold): mặc định là 0.5
    → Nếu y_hat >= 0.5 → Dự đoán lớp 1
    → Nếu y_hat < 0.5 → Dự đoán lớp 0

4. Hàm mất mát (Loss Function)

Logistic Regression không dùng MSE vì hàm sigmoid và MSE kết hợp có thể gây gradient vanishing. Thay vào đó, dùng Binary Cross-Entropy Loss:

Loss = -[y * log(y_hat) + (1 - y) * log(1 - y_hat)]

Tổng thể trên tập dữ liệu:

L(w, b) = (1/n) * Σ -[y_i * log(y_hat_i) + (1 - y_i) * log(1 - y_hat_i)]

Mục tiêu là tối thiểu hóa hàm mất mát này bằng thuật toán tối ưu như Gradient Descent.


5. So sánh Logistic vs Linear Regression

Đặc điểmLinear RegressionLogistic Regression
Bài toánDự đoán giá trị liên tụcPhân loại nhị phân
Hàm đầu ray_hat = w*x + by_hat = sigmoid(w*x + b)
Khoảng giá trị output(-∞, +∞)(0, 1)
Hàm mất mátMean Squared Error (MSE)Binary Cross-Entropy

6. Triển khai bằng Python (Scikit-Learn)

6.1. Huấn luyện mô hình

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

X = df[['age', 'income']]  # ví dụ đặc trưng
y = df['will_buy']         # biến nhị phân: 0 hoặc 1

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")

6.2. Lấy xác suất

probs = model.predict_proba(X_test)
# probs[:, 1] là xác suất thuộc lớp 1

7. Đánh giá mô hình phân loại

Không chỉ dùng accuracy, bạn nên dùng thêm các chỉ số sau:

  • Precision: Tỷ lệ dự đoán đúng trong số dự đoán là 1
  • Recall: Tỷ lệ bắt đúng trong số thực sự là 1
  • F1-Score: Trung bình điều hòa của Precision và Recall
  • ROC AUC: Diện tích dưới đường cong ROC, đánh giá phân biệt tốt/không
from sklearn.metrics import classification_report, roc_auc_score

print(classification_report(y_test, y_pred))
print("ROC AUC:", roc_auc_score(y_test, probs[:,1]))

8. Ưu điểm và hạn chế

Ưu điểmHạn chế
Dễ huấn luyện, chạy nhanhKhông xử lý tốt quan hệ phi tuyến
Xác suất đầu ra có thể giải thích đượcDễ overfit với dữ liệu nhiễu
Cơ sở cho các mô hình nâng cao (softmax, neural net)Không hoạt động tốt nếu dữ liệu không tuyến tính phân tách được

9. Bài tập thực hành

  1. Chọn tập dữ liệu phân loại nhị phân (ví dụ: Titanic, breast cancer)
  2. Huấn luyện logistic regression
  3. Tính accuracy, precision, recall, F1, AUC
  4. Trực quan hoá phân phối xác suất predict_proba và biểu đồ ROC

10. Tổng kết

Logistic Regression là mô hình đơn giản, hiệu quả và giải thích được trong các bài toán phân loại nhị phân. Dù đơn giản, nó được dùng làm baseline cho mọi bài toán classification, và là nền tảng cho nhiều mô hình nâng cao hơn như:

  • Softmax Regression (đa lớp)
  • Neural Networks (deep learning)
  • CRF, MaxEnt trong NLP