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 tuyến tính (Linear 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 Tuyến Tính (Linear Regression) chỉ với 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 Tuyến Tính là gì?
Hồi Quy Tuyến Tính là một thuật toán Machine Learning có giám sát, sử dụng để dự đoán giá trị số dựa trên các mối quan hệ tuyến tính giữa biến độc lập (đặc trưng đầu vào ) và biến phụ thuộc (đầu ra ).
Phương trình của Hồi Quy Tuyến Tính được biểu diễn dưới dạng:
Bài viết này được đăng tại [free tuts .net]
Trong đó:
- : trọng số hoặc hệ số (weights).
- : ma trận các đặc trưng (feature matrix).
- : hệ số chặn (bias/intercept).
- : đầu ra dự đoán.
Mục tiêu là tối ưu các tham số và sao cho hàm dự đoán "hợp lý nhất" với dữ liệu.
Ý tưởng cốt lõi của Linear Regression
Hàm mất mát: Chúng ta sử dụng hàm lỗi bình phương trung bình (MSE) để đo lường mức độ sai số giữa dự đoán và thực tế:
Gradient Descent: Đây là một phương pháp tối ưu hoá dùng để cập nhật các tham số và sao cho hàm mất mát được giảm dần theo mỗi bước:
Trong đó là tốc độ học (learning rate).
- Cập nhật trọng số:
- Cập nhật bias:
Triển khai Linear Regression từ đầu trong Python
Dưới đây là đoạn mã Python đầy đủ để triển khai Linear Regression:
import numpy as np # Thư viện xử lý ma trận class LinearRegression: 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 # Số mẫu và số đặ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 đầu ra dự đoán y_predicted = np.dot(X, self.weights) + self.bias # Tính gradient của trọng số và bias dw = (1 / n_samples) * np.dot(X.T, (y_predicted - y)) # Gradient của weights db = (1 / n_samples) * np.sum(y_predicted - y) # Gradient của bias # 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 đầu ra cho dữ liệu mới. """ y_approximated = np.dot(X, self.weights) + self.bias return y_approximated
Giải thích mã:
Lớp LinearRegression
:
__init__
: Xác định tốc độ học () và số lần lặp ().fit
: Huấn luyện mô hình trên tập dữ liệu:- Khởi tạo và bằng giá trị 0.
- Lặp lần để tính gradient và cập nhật tham số.
predict
: Dự đoán giá trị cho dữ liệu đầu vào .
Phương pháp Gradient Descent:
- : Tính gradient của hàm mất mát theo trọng số .
- : Tính gradient của hàm mất mát theo bias .
- Cập nhật và để giảm giá trị hàm mất mát.
Tốc độ học (Learning Rate): Quyết định kích thước bước nhảy trong mỗi lần cập nhật. Giá trị nhỏ hơn sẽ học chậm nhưng ổn định, trong khi giá trị lớn hơn sẽ tăng tốc độ nhưng có thể gây dao động hoặc không hội tụ.
Ưu điểm và hạn chế của Linear Regression trong Python
Ưu điểm:
- Dễ hiểu và dễ triển khai.
- Hiệu quả với dữ liệu tuyến tính.
- Giải thích mối quan hệ giữa đặc trưng và kết quả.
Hạn chế:
- Không phù hợp với dữ liệu phi tuyến tính.
- Nhạy cảm với outlier trong dữ liệu.
- Hiệu suất kém khi số lượng đặc trưng lớn.
Kết bài
Hồi Quy Tuyến Tính là một thuật toán cơ bản nhưng rất quan trọng trong Machine Learning. Việc xây dựng từ đầu giúp bạn hiểu sâu hơn về nguyên lý hoạt động của nó, đồng thời cung cấp nền tảng để học các thuật toán phức tạp hơn.
Chúc bạn học vui!