Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Hồi Quy Logistic (Logistic Regression) trong Python
Trong bài hướng dẫn này, mình sẽ triển khai thuật toán Hồi Quy Logistic chỉ sử dụng các module có sẵn của Python và thư viện numpy. Đồng thời, bạn sẽ hiểu rõ khái niệm và toán học đứng sau thuật toán phổ biến này trong Machine Learning.

Hồi quy Logistic là gì?
.jpg)
Hồi Quy Logistic là một thuật toán Machine Learning có giám sát, thường được sử dụng để giải quyết các bài toán phân loại nhị phân (binary classification). Khác với Hồi Quy Tuyến Tính, nó không dự đoán giá trị liên tục, mà dự đoán xác suất một mẫu thuộc về một trong hai lớp.
Phương trình dự đoán trong Logistic Regression:
Bài viết này được đăng tại [free tuts .net]
Trong đó:
- : trọng số (weights).
- : ma trận đặc trưng (feature matrix).
- : hệ số chặn (bias).
- : hàm sigmoid để đưa kết quả về phạm vi xác suất .
Hàm Sigmoid
Hàm sigmoid là yếu tố chính trong Logistic Regression:
Hàm này chuyển đổi đầu ra thành giá trị trong phạm vi , dễ dàng diễn giải thành xác suất.
Hàm mất mát (Loss Function)
Hồi Quy Logistic sử dụng hàm log-loss hoặc binary cross-entropy để đo lường sai số giữa dự đoán và giá trị thực:
Mục tiêu là giảm thiểu hàm mất mát này để tối ưu hoá các tham số và .
Triển khai Logistic Regression từ đầu trong Python
Dưới đây là đoạn mã Python để triển khai Logistic Regression từ đầu:
import numpy as np
class LogisticRegression:
def __init__(self, learning_rate=0.001, n_iters=1000):
"""
Khởi tạo mô hình với tốc độ học và số lần lặp.
"""
self.lr = learning_rate # Tốc độ học
self.n_iters = n_iters # Số lần lặp
self.weights = None # Trọng số (weights)
self.bias = None # Bias (hệ số chặn)
def fit(self, X, y):
"""
Huấn luyện mô hình trên tập dữ liệu.
"""
n_samples, n_features = X.shape # Lấy số mẫu và đặc trưng
self.weights = np.zeros(n_features) # Khởi tạo trọng số bằng 0
self.bias = 0 # Khởi tạo bias bằng 0
# Thuật toán Gradient Descent
for _ in range(self.n_iters):
# Tính linear model: w·X + b
linear_model = np.dot(X, self.weights) + self.bias
# Áp dụng hàm sigmoid
y_predicted = self._sigmoid(linear_model)
# Tính gradient cho trọng số và bias
dw = (1 / n_samples) * np.dot(X.T, (y_predicted - y))
db = (1 / n_samples) * np.sum(y_predicted - y)
# Cập nhật trọng số và bias
self.weights -= self.lr * dw
self.bias -= self.lr * db
def predict(self, X):
"""
Dự đoán lớp của dữ liệu đầu vào.
"""
linear_model = np.dot(X, self.weights) + self.bias
y_predicted = self._sigmoid(linear_model)
# Quyết định lớp dựa trên xác suất > 0.5
y_predicted_cls = [1 if i > 0.5 else 0 for i in y_predicted]
return np.array(y_predicted_cls)
def _sigmoid(self, x):
"""
Hàm sigmoid: 1 / (1 + e^-x).
"""
return 1 / (1 + np.exp(-x))
Giải thích đoạn mã
Hàm __init__:
- Xác định tốc độ học () và số lần lặp.
- Khởi tạo giá trị ban đầu cho trọng số và bias.
Hàm fit:
Sử dụng Gradient Descent để tối ưu hoá các tham số và :
- Tính toán linear model: .
- Áp dụng hàm sigmoid để đưa đầu ra về phạm vi .
- Cập nhật tham số dựa trên gradient.
Hàm predict:
- Tính đầu ra cho dữ liệu mới, sử dụng hàm sigmoid để tạo xác suất.
- Gán nhãn 1 nếu xác suất lớn hơn 0.5, ngược lại là 0.
Hàm _sigmoid:
- Triển khai hàm sigmoid để tính xác suất.
Ưu điểm và hạn chế trong Python
Ưu điểm:
- Phù hợp với bài toán phân loại nhị phân.
- Dễ hiểu và dễ triển khai.
- Hiệu quả với dữ liệu tuyến tính.
Hạn chế:
- Không phù hợp với dữ liệu phi tuyến tính (trừ khi sử dụng thêm các biến mở rộng).
- Hiệu quả kém khi có quá nhiều đặc trưng hoặc outlier.
- Dễ bị quá khớp nếu số lần lặp quá cao hoặc tốc độ học không được tối ưu.
Kết bài
Hồi Quy Logistic là một thuật toán cốt lõi trong Machine Learning và là bước đệm lý tưởng để học các phương pháp phân loại phức tạp hơn. Việc xây dựng thuật toán từ đầu giúp bạn hiểu rõ nguyên lý hoạt động và sẵn sàng để ứng dụng trong thực tế.
Chúc bạn học vui và thực hành hiệu quả!

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng