Nhóm 5

Bayesian — Naive Bayes

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
Nền tảng xác suất của toàn bộ họ thuật toán

Đị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\).

$$P(y\mid x)=\frac{P(x\mid y)\,P(y)}{P(x)}$$

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:

$$\hat y=\arg\max_y P(y\mid x)=\arg\max_y P(x\mid y)\,P(y)$$
Ý nghĩa: phân loại không phải là "đoán", mà là chọn lớp khiến dữ liệu quan sát được trở nên hợp lý nhất, có cân nhắc cả mức độ phổ biến (prior) của từng lớp.
Naive Bayes
Giả định "ngây thơ" giúp bài toán trở nên khả thi

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.

$$P(x\mid y)=P(x_1,\dots,x_n\mid y)=\prod_{i} P(x_i\mid y)$$

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ẻ:

$$\hat y=\arg\max_y P(y)\prod_i P(x_i\mid y)$$

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:

$$\hat y=\arg\max_y \Big(\log P(y)+\sum_i \log P(x_i\mid y)\Big)$$

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.

Ứng dụng tiêu biểu: lọc spam email, phân loại chủ đề bài báo, phân tích cảm xúc (sentiment) — những bài toán có rất nhiều đặc trưng từ vựng và cần huấn luyện nhanh.
Gaussian Naive Bayes
Khi đặc trưng là số liên tục

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):

$$P(x_i\mid y)=\frac{1}{\sqrt{2\pi\sigma_{y}^2}}\exp\!\left(-\frac{(x_i-\mu_{y})^2}{2\sigma_{y}^2}\right)$$

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.

Lưu ý: giả định mỗi đặc trưng phân phối chuẩn theo từng lớp không phải lúc nào cũng đúng. Nếu dữ liệu lệch nhiều, có thể biến đổi (log-transform) trước khi đưa vào, hoặc rời rạc hóa và dùng Multinomial.
So sánh các biến thể Naive Bayes
Chọn biến thể theo loại dữ liệu
Biến thểGiả định \(P(x_i\mid y)\)Loại dữ liệuỨng dụng tiêu biểu
Multinomial NBPhân phối đa thức (số đếm)Số đếm / tần suất rời rạcPhân loại văn bản, lọc spam (bag-of-words, TF)
Bernoulli NBBernoulli (0/1)Nhị phân — có/khôngVăn bản ngắn, đặc trưng "từ xuất hiện hay không"
Gaussian NBPhân phối chuẩnSố thực liên tụcDữ liệu cảm biến, đặc trưng số (chiều cao, cân nặng...)
Ưu điểm & Nhược điểm
Khi nào nên (và không nên) dùng
Ưu điểmNhược điểm
Huấn luyện & dự đoán rất nhanh, độ phức tạp tuyến tínhGiả đị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
Thực hành với scikit-learn
GaussianNB & MultinomialNB

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"]))
Vì sao Naive Bayes vẫn hiệu quả dù giả định "sai"? Giả định độc lập gần như không bao giờ đúng tuyệt đối, nhưng để phân loại ta chỉ cần xác định lớp có posterior lớn nhất — chứ không cần giá trị posterior chính xác. Ngay cả khi các xác suất ước lượng bị lệch, thứ tự xếp hạng giữa các lớp thường vẫn được giữ đúng, nên quyết định cuối cùng vẫn chính xác. Đó là lý do Naive Bayes thường là baseline mạnh và khó bị đánh bại trong phân loại văn bản.
← Nhóm trước
Nhóm 4: Regularization