Họ thuật toán phân loại dựa trên định lý Bayes kết hợp giả định độc lập giữa các đặc trưng. Tuy đơn giản và dựa trên một giả định gần như không bao giờ đúng tuyệt đối, Naive Bayes vẫn nhanh, ít tốn dữ liệu và đặc biệt mạnh trong phân loại văn bản như lọc spam.
Định lý Bayes cho phép "đảo ngược" xác suất có điều kiện: từ việc biết khả năng quan sát được dữ liệu \(x\) khi đã biết lớp \(y\), ta suy ra khả năng dữ liệu \(x\) thuộc về lớp \(y\).
Trong đó:
Để phân loại, ta chọn lớp có posterior lớn nhất — gọi là quy tắc MAP (Maximum A Posteriori). Vì \(P(x)\) giống nhau với mọi lớp nên có thể bỏ mẫu số khi so sánh:
Khó khăn nằm ở likelihood \(P(x\mid y)\): khi \(x=(x_1,x_2,\dots,x_n)\) có nhiều đặc trưng, việc ước lượng phân phối đồng thời của tất cả đặc trưng đòi hỏi một lượng dữ liệu khổng lồ. Naive Bayes đưa ra một giả định "ngây thơ" (naive): các đặc trưng độc lập có điều kiện khi đã biết lớp.
Nhờ đó, công thức phân loại trở nên cực kỳ gọn — chỉ cần ước lượng từng \(P(x_i\mid y)\) riêng lẻ:
Tích của nhiều xác suất nhỏ dễ gây tràn số (underflow), nên trên thực tế ta tính trong không gian log — tích thành tổng, kết quả phân loại không đổi:
Tùy cách mô hình hóa \(P(x_i\mid y)\), ta có các biến thể:
Một vấn đề thực tế: nếu một từ chưa từng xuất hiện cùng lớp \(y\) trong tập huấn luyện thì \(P(x_i\mid y)=0\), khiến cả tích bằng 0 và "giết chết" mọi bằng chứng khác. Để tránh điều này, ta dùng Laplace smoothing (cộng thêm \(\alpha\), thường \(\alpha=1\)) để không có xác suất nào tuyệt đối bằng 0.
Multinomial và Bernoulli phù hợp với dữ liệu đếm/nhị phân. Với đặc trưng liên tục (chiều cao, cân nặng, nồng độ...), Gaussian Naive Bayes giả định mỗi \(P(x_i\mid y)\) tuân theo phân phối chuẩn (Gaussian):
Việc huấn luyện trở nên rất nhẹ: với mỗi lớp \(y\) và mỗi đặc trưng \(i\), ta chỉ cần ước lượng hai tham số từ dữ liệu huấn luyện:
Khi phân loại một điểm mới, ta thay \(x_i\) vào hàm mật độ chuẩn để lấy likelihood, rồi áp dụng đúng quy tắc MAP (tính trong log) như ở trên.
| Biến thể | Giả định \(P(x_i\mid y)\) | Loại dữ liệu | Ứng dụng tiêu biểu |
|---|---|---|---|
| Multinomial NB | Phân phối đa thức (số đếm) | Số đếm / tần suất rời rạc | Phân loại văn bản, lọc spam (bag-of-words, TF) |
| Bernoulli NB | Bernoulli (0/1) | Nhị phân — có/không | Văn bản ngắn, đặc trưng "từ xuất hiện hay không" |
| Gaussian NB | Phân phối chuẩn | Số thực liên tục | Dữ liệu cảm biến, đặc trưng số (chiều cao, cân nặng...) |
| Ưu điểm | Nhược điểm |
|---|---|
| Huấn luyện & dự đoán rất nhanh, độ phức tạp tuyến tính | Giả định độc lập có điều kiện hiếm khi đúng trong thực tế |
| Cần ít dữ liệu để ước lượng tham số | Xác suất đầu ra thường thiếu chính xác (chỉ tốt cho việc xếp hạng/chọn lớp, không nên dùng làm xác suất tin cậy tuyệt đối) |
| Rất tốt cho dữ liệu nhiều chiều, đặc biệt là văn bản | Đặc trưng tương quan mạnh sẽ bị "đếm" trùng lặp ảnh hưởng |
| Dễ cài đặt, dễ giải thích, ít siêu tham số | Cần Laplace smoothing để tránh xác suất 0 cho giá trị chưa gặp |
Gaussian NB cho đặc trưng số liên tục:
from sklearn.naive_bayes import GaussianNB from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split X, y = load_iris(return_X_y=True) X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=42) model = GaussianNB() model.fit(X_tr, y_tr) print("Accuracy:", model.score(X_te, y_te))
Multinomial NB cho phân loại văn bản (đặc trưng đếm từ):
from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.pipeline import make_pipeline texts = ["khuyen mai giam gia ngay", "hop bao cao tien do du an"] labels = ["spam", "ham"] # CountVectorizer dem tu -> MultinomialNB (alpha=1.0: Laplace smoothing) clf = make_pipeline(CountVectorizer(), MultinomialNB(alpha=1.0)) clf.fit(texts, labels) print(clf.predict(["giam gia sieu khung hom nay"]))