Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Thuật toán Naive Bayes trong Python
Trong bài viết này, mình sẽ triển khai thuật toán Naive Bayes sử dụng chỉ các module tích hợp sẵn của Python và thư viện numpy. Đồng thời, bài viết sẽ giải thích khái niệm và toán học phía sau thuật toán này.
Naive Bayes là gì?
Thuật toán Naive Bayes là một mô hình phân loại dựa trên Định Lý Bayes. Nó thường được sử dụng trong các bài toán phân loại như lọc thư rác, phân tích cảm xúc, hoặc nhận diện văn bản.
Đặc trưng quan trọng của Naive Bayes là:
- "Naive" (ngây thơ): Giả định các đặc trưng (features) độc lập với nhau.
- Bayes: Dựa trên Định Lý Bayes, tính toán xác suất hậu nghiệm dựa trên dữ liệu đã biết.
Công thức toán học
Định Lý Bayes:
Bài viết này được đăng tại [free tuts .net]
Trong đó:
- : Xác suất của nhãn cho tập dữ liệu .
- : Xác suất của tập dữ liệu thuộc nhãn .
- : Xác suất tiên nghiệm của nhãn .
- : Xác suất tổng của tập dữ liệu .
Naive Bayes phân loại dựa vào nhãn có xác suất hậu nghiệm lớn nhất:
Triển khai Naive Bayes trong Python
Khởi tạo và huấn luyện mô hình
Mô hình tính các thông số cần thiết cho mỗi nhãn (class):
- Mean: Trung bình của mỗi đặc trưng.
- Variance: Phương sai của mỗi đặc trưng.
- Prior: Xác suất tiên nghiệm ().
import numpy as np class NaiveBayes: def fit(self, X, y): """ Huấn luyện mô hình Naive Bayes với tập dữ liệu X và nhãn y. """ n_samples, n_features = X.shape self._classes = np.unique(y) # Tất cả các nhãn n_classes = len(self._classes) # Khởi tạo các tham số self._mean = np.zeros((n_classes, n_features), dtype=np.float64) self._var = np.zeros((n_classes, n_features), dtype=np.float64) self._priors = np.zeros(n_classes, dtype=np.float64) for idx, c in enumerate(self._classes): X_c = X[y == c] # Lọc các mẫu thuộc nhãn `c` self._mean[idx, :] = X_c.mean(axis=0) self._var[idx, :] = X_c.var(axis=0) self._priors[idx] = X_c.shape[0] / float(n_samples) # Tính P(C)
Dự đoán (Prediction)
Dự đoán nhãn của dữ liệu đầu vào dựa trên:
- Tính toán xác suất hậu nghiệm ().
- Trả về nhãn với xác suất cao nhất.
def predict(self, X): """ Dự đoán nhãn cho tập dữ liệu X. """ y_pred = [self._predict(x) for x in X] return np.array(y_pred) def _predict(self, x): """ Dự đoán nhãn cho từng mẫu x. """ posteriors = [] # Tính xác suất hậu nghiệm cho mỗi nhãn for idx, c in enumerate(self._classes): prior = np.log(self._priors[idx]) # log(P(C)) posterior = np.sum(np.log(self._pdf(idx, x))) # log(P(X|C)) posterior = prior + posterior posteriors.append(posterior) # Nhãn có xác suất cao nhất return self._classes[np.argmax(posteriors)]