DS

[DS Blog #63] Thuật Toán Học Máy Vỡ Lòng: Hồi Quy Tuyến Tính (Linear Regression) & Hồi Quy Logistic (Logistic Regression) – Từ Bản Chất Trực Quan Đến Code Scikit-Learn

0 views
[DS Blog #63] Thuật Toán Học Máy Vỡ Lòng: Hồi Quy Tuyến Tính (Linear Regression) & Hồi Quy Logistic (Logistic Regression) – Từ Bản Chất Trực Quan Đến Code Scikit-Learn

1. Bối cảnh thực tế (Context & Problem Statement)

Trong thực tế doanh nghiệp, mọi bài toán Machine Learning có giám sát (Supervised Learning) đều quy về 2 dạng bài toán cốt lõi:

  1. Bài toán Hồi quy (Regression): Mục tiêu là dự đoán một con số thực liên tục.
    • Ví dụ: Dự đoán giá bán của một căn nhà (bao nhiêu tỷ đồng?), dự đoán doanh thu tháng tới (bao nhiêu triệu?), dự đoán nhiệt độ ngày mai.
  2. Bài toán Phân loại (Classification): Mục tiêu là dự đoán một nhãn danh mục rời rạc.
    • Ví dụ: Khách hàng này sẽ Mua hay Không mua? Giao dịch này là Hợp lệ hay Gian lận? Email này là Spam hay Hộp thư đến?

Hai thuật toán nền tảng, thanh lịch và được sử dụng rộng rãi nhất làm tiêu chuẩn đối chuẩn (Baseline) cho 2 dạng bài toán này chính là Linear Regression và Logistic Regression.


2. Các Khái Niệm & Cơ Chế Cốt Lõi

2.1. Hồi Quy Tuyến Tính (Linear Regression) - Tìm Đường Thẳng Tối Ưu

1. Phương trình đường thẳng quen thuộc từ thời phổ thông:

Giả sử ta muốn dự đoán Giá nhà (yy) dựa trên Diện tích căn nhà (xx): y^=w⋅x+b\hat{y} = w \cdot x + b

  • xx: Biến độc lập đầu vào (Diện tích, ví dụ: 80 m280\text{ m}^2).
  • y^\hat{y}: Giá trị dự đoán đầu ra (Giá nhà dự tính).
  • ww (Weight / Slope): Hệ số góc – Cho biết khi diện tích tăng thêm 1m21\text{m}^2 thì giá nhà tăng thêm bao nhiêu triệu đồng.
  • bb (Bias / Intercept): Hệ số chặn – Giá trị cơ sở khi diện tích bằng 00.
Giá nhà (y)
   ^                                  * (Điểm thực tế y_i)
   |                                 /
   |                         *      / | (Sai số e_i = y_i - y_hat)
   |                               /  * (Điểm dự đoán y_hat)
   |                       *      /
   |                             /
   |                     *      /  Đường hồi quy tối ưu: y = w*x + b
   |                           /
 b +--------------------------+------------------------------> Diện tích (x)
   0

2. Thế nào là đường thẳng "tốt nhất"? (Ordinary Least Squares - OLS):

  • Với mỗi điểm dữ liệu thực tế (xi,yi)(x_i, y_i), khoảng cách chênh lệch giữa thực tế và đường thẳng dự đoán gọi là Phần dư (Residual / Sai số): ei=yi−y^ie_i = y_i - \hat{y}_i.
  • Thuật toán OLS tìm bộ trọng số ww và bb sao cho Tổng bình phương các sai số (Residual Sum of Squares - RSS) là nhỏ nhất: Loss=∑i=1N(yi−y^i)2=∑i=1N(yi−(wxi+b))2⟶min⁡\text{Loss} = \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 = \sum_{i=1}^{N} \Big( y_i - (w x_i + b) \Big)^2 \longrightarrow \min

3. Đo lường chất lượng bằng Hệ số xác định R2R^2 (R-Squared):

R2=1−Tổng sai soˆˊ của moˆ hıˋnh (RSS)Tổng sai soˆˊ neˆˊu chỉ đoaˊn ba˘ˋng giaˊ trị trung bıˋnh (TSS)R^2 = 1 - \frac{\text{Tổng sai số của mô hình (RSS)}}{\text{Tổng sai số nếu chỉ đoán bằng giá trị trung bình (TSS)}}

  • R2=1.0R^2 = 1.0 (100%100\%): Mô hình hoàn hảo, giải thích được toàn bộ sự biến thiên của dữ liệu.
  • R2=0.8R^2 = 0.8: Mô hình giải thích được 80%80\% sự biến thiên của giá nhà dựa vào diện tích; 20%20\% còn lại do các yếu tố khác (vị trí, số phòng ngủ, nội thất).
  • R2=0R^2 = 0: Mô hình vô dụng, đoán không khá hơn việc lấy mức giá trung bình của thị trường.

2.2. Hồi Quy Logistic (Logistic Regression) - Dự Đoán Xác Suất Phân Loại

1. Tại sao KHÔNG THỂ dùng Linear Regression để phân loại nhị phân (00 hoặc 11)?

  • Nếu dùng đường thẳng y=wx+by = wx + b để đoán xác suất, khi diện tích quá lớn, đường thẳng sẽ cho ra kết quả y=1.8y = 1.8 (vô nghĩa vì xác suất không thể >100%> 100\%), hoặc khi diện tích quá nhỏ, đường thẳng cho ra y=−0.3y = -0.3 (xác suất không thể âm)!

2. Cứu cánh từ Hàm Sigmoid (Hàm chữ S):

Hàm Sigmoid nhận bất kỳ giá trị số thực nào từ −∞-\infty đến +∞+\infty và nén chặt nó vào khoảng xác suất từ 00 đến 11: σ(z)=11+e−zvới z=wTx+b\sigma(z) = \frac{1}{1 + e^{-z}} \quad \text{với } z = w^T x + b

Xác suất P(Y=1)
 1.0 +                                       /---------------- (Tiến sát về 1.0)
     |                                      /
 0.5 + - - - - - - - - - - - - - - - - - - / (Ngưỡng Threshold = 0.5)
     |                                    /
 0.0 +-----------------------------------+---------------------> Giá trị z = w*x + b
                                         0
  • Khi z=0  ⟹  P=11+e0=12=0.5z = 0 \implies P = \frac{1}{1 + e^0} = \frac{1}{2} = 0.5.
  • Khi zz rất lớn   ⟹  e−z≈0  ⟹  P≈1.0\implies e^{-z} \approx 0 \implies P \approx 1.0.
  • Khi zz rất nhỏ (âm vô cùng)   ⟹  e−z→∞  ⟹  P≈0.0\implies e^{-z} \to \infty \implies P \approx 0.0.

3. Quy tắc ra quyết định (Decision Threshold):

Mặc định, mô hình so sánh xác suất với ngưỡng 0.50.5:

  • Nếu P(Y=1∣X)≥0.5  ⟹  P(Y=1 \mid X) \ge 0.5 \implies Dự đoán nhãn là 11 (ví dụ: Khách sẽ mua hàng).
  • Nếu P(Y=1∣X)<0.5  ⟹  P(Y=1 \mid X) < 0.5 \implies Dự đoán nhãn là 00 (Khách không mua).

2.3. Đánh Giá Mô Hình Phân Loại: Ma Trận Nhầm Lẫn (Confusion Matrix)

Xét bài toán Chẩn đoán bệnh nhân có bị nhiễm virus hay không:

                                    THỰC TẾ KHÁCH QUAN (Ground Truth)
                               +-----------------------+-----------------------+
                               |     CÓ BỆNH (Y = 1)   |   KHÔNG BỆNH (Y = 0)  |
+--------------+---------------+-----------------------+-----------------------+
| MÔ HÌNH      | ĐOÁN CÓ BỆNH  |  TRUE POSITIVE (TP)   |  FALSE POSITIVE (FP)  |
| DỰ ĐOÁN      | (Predict = 1) | (Bắt đúng bệnh nhân)  |  (Báo động giả / Oan) |
| (Prediction) +---------------+-----------------------+-----------------------+
|              | ĐOÁN KHÔNG    |  FALSE NEGATIVE (FN)  |  TRUE NEGATIVE (TN)   |
|              | (Predict = 0) | (BỎ SÓT NGƯỜI BỆNH!)  | (Bắt đúng người khỏe) |
+--------------+---------------+-----------------------+-----------------------+
  1. Accuracy (Độ chính xác tổng thể): Tỷ lệ đoán đúng trên toàn bộ mẫu: TP+TNTổng soˆˊ maˆ˜u\frac{\text{TP} + \text{TN}}{\text{Tổng số mẫu}}.
    ⚠️ Chỉ dùng khi 2 lớp cân bằng nhau (50/5050/50).
  2. Precision (Độ chuẩn xác - Tránh báo động giả): Precision=TPTP+FP\text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} (Trong những ca mô hình khẳng định là Có bệnh, có bao nhiêu % thực sự có bệnh?)
  3. Recall (Độ bao phủ - Tránh bỏ sót): Recall=TPTP+FN\text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} (Trong tất cả những người thực tế bị bệnh, mô hình tìm ra được bao nhiêu %?)
  4. F1-Score (Trung bình điều hòa giữa Precision và Recall): F1=2×Precision×RecallPrecision+Recall\text{F1} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}

3. Các Bảng Markdown So Sánh Chi Tiết

📊 Bảng 1: So Sánh Toàn Diện Linear Regression vs. Logistic Regression

Tiêu chíHồi Quy Tuyến Tính (Linear Regression)Hồi Quy Logistic (Logistic Regression)
Loại bài toánHồi quy (Regression)Phân loại (Classification)
Bản chất biến mục tiêu (YY)Số thực liên tục (−∞-\infty đến +∞+\infty)Nhãn danh mục rời rạc (00 hoặc 11, Nhị phân)
Hàm toán học áp dụngĐường thẳng: y=wTx+by = w^T x + bĐường cong Sigmoid: P=11+e−(wTx+b)P = \frac{1}{1 + e^{-(w^T x + b)}}
Hàm mất mát (Loss Function)Mean Squared Error (MSE / OLS)Binary Cross-Entropy (Log Loss)
Chỉ số đánh giá chínhR2R^2 (R-squared), RMSE, MAEAccuracy, Precision, Recall, F1-Score, ROC-AUC
Ví dụ thực tế đời thườngDự đoán giá nhà, Doanh số, Nhiệt độDự đoán khách rời bỏ, Email Spam, Rớt/Đậu phỏng vấn

📊 Bảng 2: Khi Nào Ưu Tiên Precision? Khi Nào Ưu Tiên Recall?

Tình huống thực tếChỉ số BẮT BUỘC ưu tiênLý do kinh doanh & Hậu quả nếu sai sót
Chẩn đoán bệnh nan y (Y tế)Ưu tiên RECALL tối đaBỏ sót người bệnh (FN) đồng nghĩa với mất mạng người. Thà báo nhầm (FP) rồi xét nghiệm lại còn hơn để bệnh nhân về nhà!
Bộ lọc thư rác (Spam Filter)Ưu tiên PRECISION tối đaNếu email quan trọng của đối tác (hợp đồng, việc làm) bị phân loại nhầm thành Spam (FP), hậu quả rất nghiêm trọng. Thà lọt vài thư rác vào inbox (FN) còn hơn mất email quan trọng!
Phát hiện gian lận tín dụng (Fraud)Ưu tiên RECALLNgăn chặn tối đa việc lọt giao dịch lừa đảo hàng tỷ đồng (FN). Khách hàng có thể chịu phiền xác nhận OTP một lần (FP).
Hệ thống đề xuất tuyển dụngƯu tiên PRECISIONNhà tuyển dụng chỉ muốn xem Top 5 ứng viên chắc chắn phù hợp nhất, tránh mất thời gian phỏng vấn người không đạt yêu cầu.

📊 Bảng 3: So Sánh Các Kỹ Thuật Chính Quy Hóa (Regularization): Ridge vs. Lasso

Tiêu chíRidge Regression (L2L_2 Regularization)Lasso Regression (L1L_1 Regularization)
Thành phần phạt cộng thêmPhạt bình phương trọng số: λ∑wi2\lambda \sum w_i^2Phạt trị tuyệt đối trọng số: λ∑∥wi∥\lambda \sum \|w_i\|
Tác động lên trọng số wwThu nhỏ trọng số về gần 0, nhưng KHÔNG triệt tiêuÉp các trọng số của biến vô nghĩa về đúng bằng 0!
Khả năng chọn biến (Feature Selection)Không (Giữ lại tất cả các biến)Có (Tự động loại bỏ các biến vô dụng)
Khi nào nên sử dụng?Khi hầu hết các biến đều có đóng góp nhỏKhi có hàng trăm biến nhưng nghi ngờ chỉ có vài biến quan trọng

4. Thực Hành Thực Chiến: Code Scikit-Learn Chuẩn Từng Dòng (Walkthrough)

📌 Bài toán: Dự đoán Khách hàng Mua xe hơi dựa trên Tuổi tác và Thu nhập

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix

# 1. Tạo tập dữ liệu mô phỏng:
data = {
    'age': [22, 25, 47, 52, 46, 56, 41, 35, 30, 48, 55, 23],
    'salary': [20, 25, 80, 110, 95, 120, 75, 40, 35, 90, 130, 22], # Triệu đồng/tháng
    'purchased': [0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0]             # 1: Mua xe, 0: Không mua
}
df = pd.DataFrame(data)

# 2. Tách biến đầu vào (X) và biến mục tiêu (y):
X = df[['age', 'salary']]
y = df['purchased']

# 3. Chia tập Train (80%) và tập Test (20%):
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# 4. Chuẩn hóa thang đo (Bắt buộc cho Logistic Regression để gradient hội tụ tốt):
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # Học mean, std từ Train
X_test_scaled = scaler.transform(X_test)       # Áp dụng sang Test

# 5. Khởi tạo và huấn luyện mô hình Logistic Regression:
model = LogisticRegression()
model.fit(X_train_scaled, y_train)

# 6. Xem hệ số ảnh hưởng của từng thuộc tính:
print("Hệ số chặn (Intercept b):", model.intercept_[0])
print(f"Hệ số góc Tuổi tác: {model.coef_[0][0]:.4f}")
print(f"Hệ số góc Thu nhập: {model.coef_[0][1]:.4f}") # Thu nhập có hệ số dương lớn -> Thu nhập càng cao càng dễ mua xe!

# 7. Dự đoán trên tập Test:
y_pred = model.predict(X_test_scaled)
y_prob = model.predict_proba(X_test_scaled)[:, 1] # Lấy xác suất P(Y=1)

print("\n=== ĐÁNH GIÁ KẾT QUẢ MÔ HÌNH ===")
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("\nBáo cáo chi tiết (Classification Report):\n", classification_report(y_test, y_pred))

5. Góc Ôn Luyện Phỏng Vấn (Interview Corner)

❓ Câu hỏi 1: Tại sao chúng ta không nên sử dụng Hồi quy tuyến tính (Linear Regression) cho các bài toán phân loại nhị phân (Binary Classification)?

  • Gợi ý trả lời ngắn gọn, tự tin:
    1. Đầu ra vượt ngoài biên xác suất [0,1][0, 1]: Linear Regression sinh ra giá trị trên toàn bộ trục số thực (−∞,+∞)(-\infty, +\infty). Khi dự đoán cho một người có thu nhập rất cao, kết quả có thể cho ra y=1.6y = 1.6, hoàn toàn vô nghĩa vì xác suất không thể vượt quá 100%100\%.
    2. Rất nhạy cảm với các điểm ngoại lai (Outliers): Nếu trong tập dữ liệu xuất hiện một khách hàng cực giàu (Outlier), đường thẳng hồi quy sẽ bị bẻ cong lệch hẳn đi để cố gắng khớp với điểm đó, làm thay đổi vị trí cắt ngưỡng quyết định và khiến hàng loạt điểm dữ liệu bình thường bị phân loại sai.
    3. Hàm mất mát không lồi (Non-convex Loss): Nếu ép dùng hàm bình phương sai số MSE cho bài toán nhị phân, đồ thị hàm mất mát sẽ xuất hiện nhiều cực tiểu địa phương gồ ghề, khiến thuật toán Gradient Descent dễ bị mắc kẹt tại điểm tối ưu kém.

❓ Câu hỏi 2: Giải thích ý nghĩa của chỉ số R2R^2 (R-squared) trong Hồi quy tuyến tính. Chỉ số R2R^2 có bao giờ nhận giá trị âm không? Nếu có thì trong trường hợp nào?

  • Gợi ý trả lời:
    • Ý nghĩa của R2R^2:
      • Đại diện cho Tỷ lệ phần trăm sự biến thiên của biến mục tiêu YY được giải thích bởi các biến đầu vào XX.
      • Công thức: R2=1−RSSTSS=1−∑(yi−y^i)2∑(yi−yˉ)2R^2 = 1 - \frac{\text{RSS}}{\text{TSS}} = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}.
    • Chỉ số R2R^2 CÓ THỂ ÂM ĐƯỢC:
      • Mặc dù trên tập Train khi dùng phương pháp OLS chuẩn thì R2∈[0,1]R^2 \in [0, 1], nhưng khi đánh giá mô hình trên Tập Test độc lập (hoặc khi mô hình không có hệ số chặn Intercept), R2R^2 hoàn toàn có thể bị âm (R2<0R^2 < 0).
      • Ý nghĩa khi R2<0R^2 < 0: Dự đoán của mô hình còn tệ hơn cả việc bạn chỉ lấy giá trị trung bình cộng yˉ\bar{y} của tập dữ liệu để làm dự đoán cho tất cả mọi người! Điều này chứng tỏ mô hình bị sai lệch nghiêm trọng hoặc dữ liệu Test hoàn toàn khác biệt với dữ liệu Train.

❓ Câu hỏi 3: Trong một bài toán Phát hiện Giao dịch Gian lận Ngân hàng (Credit Card Fraud Detection), giữa Precision và Recall, bạn sẽ ưu tiên tối ưu hóa chỉ số nào hơn và tại sao?

  • Gợi ý trả lời:
    • Lựa chọn tối thượng: Ưu tiên RECALL!
    • Lập luận kinh doanh & rủi ro:
      • Định nghĩa trong bài toán này:
        • Recall: Trong 100100 vụ gian lận thực tế, hệ thống bắt được bao nhiêu vụ?
        • Precision: Trong 100100 vụ hệ thống cảnh báo còi, có bao nhiêu vụ thực sự là gian lận?
      • Hậu quả của việc bỏ sót (False Negative - FN / Recall thấp): Kẻ gian đánh cắp thành công 500 triệu đoˆˋng500\text{ triệu đồng} từ tài khoản khách hàng. Ngân hàng mất tiền đền bù, mất uy tín thương hiệu và bị phạt bởi cơ quan quản lý.
      • Hậu quả của việc báo nhầm (False Positive - FP / Precision thấp): Khách hàng bình thường quẹt thẻ mua hàng và nhận được tin nhắn SMS yêu cầu xác thực OTP hoặc bị tạm dừng thẻ 1 phút. Khách hàng có thể cảm thấy hơi phiền một chút nhưng an tâm vì tài khoản được bảo vệ.
      • →\rightarrow Chi phí của một ca bỏ sót (FN) đắt hơn gấp hàng trăm lần so với chi phí của một ca báo động giả (FP). Do đó, kỹ sư bắt buộc phải hạ thấp ngưỡng quyết định (Threshold) để tối đa hóa chỉ số Recall lên mức >95%> 95\%.

6. Tóm Tắt Ghi Nhớ Nhanh (Key Takeaways)

  1. Linear Regression dự đoán con số liên tục bằng đường thẳng y=wx+by = wx + b tối thiểu hóa tổng bình phương sai số (OLS).
  2. Hệ số R2R^2 đo lường tỷ lệ phần trăm dữ liệu được giải thích; R2<0R^2 < 0 đồng nghĩa mô hình đoán tệ hơn cả giá trị trung bình.
  3. Logistic Regression dự đoán xác suất phân loại nhị phân nhờ hàm Sigmoid nén kết quả vào đoạn [0,1][0, 1].
  4. Accuracy Paradox: Không dùng Accuracy cho dữ liệu mất cân bằng; ưu tiên Recall khi cần chống bỏ sót (Y tế, Gian lận) và ưu tiên Precision khi cần chống báo động giả (Spam filter).
  5. Lasso (L1L_1) giúp chọn lọc biến bằng cách ép trọng số về 0; Ridge (L2L_2) giúp thu nhỏ trọng số để chống Overfitting.
0Claps