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ì?
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ả!