Tổng quan 3 mô hình Naive Bayes trong học máy
Mục lục
Giới thiệu
Trong thư viện scikit-learn
, Naive Bayes là một họ các mô hình học máy có giám sát nằm trong module sklearn.naive_bayes
với đặc trưng được dựa trên nguyên lý Bayes trong xác suất. Trong post này, mình sẽ tập chung vào 3 loại Naive Bayes chính mà bạn thường gặp nhất (đặc biệt là đối với môn Học Máy MAT3533), đó là MultinomialNB
, BernoulliNB
, GaussianNB
.
Nguyên lý Bayes
Một chút mở đầu thì nguyên lý Bayes được áp dụng quan trọng nhất là cho xác suất có điều kiện, công thức cơ bản nhất như sau:
\[P(H \mid E) = \frac{P(H) P(E \mid H)}{P(E)}\]
Trong đó, giả sử ta có một giả thiết $ H $ (Hypothesis) và bằng chứng $ E $ (Evidence), thì $ P(H \mid E) $ đại diện cho xác suất xảy ra giả thiết $ H $ với điều kiện rằng $ E $ đã xảy ra. Công thức này giúp chúng ta điều chỉnh xác suất của một giả thuyết khi có thêm bằng chứng mới.
Các thành phần trong công thức:
- $ P(H) $: Xác suất tiên nghiệm (prior probability) – xác suất ban đầu của giả thuyết $ H $ trước khi có bằng chứng.
- $ P(E \mid H) $: Xác suất có điều kiện của bằng chứng (likelihood) – xác suất quan sát được bằng chứng $ E $ nếu giả thuyết $ H $ đúng.
- $ P(E) $: Xác suất của bằng chứng (marginal likelihood) – tổng xác suất để bằng chứng xảy ra, bất kể giả thuyết nào đúng. Được tính bằng quy tắc xác suất toàn phần:
\[P(E) = P(H) P(E \mid H) + P(\neg H) P(E \mid \neg H)\]
- $ P(H \mid E) $: Xác suất hậu nghiệm (posterior probability) – xác suất đã được cập nhật của giả thuyết $ H $ sau khi quan sát bằng chứng $ E $.
Nguyên lý Bayes có thể được hiểu như một cách mô hình hóa quá trình cập nhật niềm tin của con người dựa trên bằng chứng mới. Trong thực tế, quan điểm của chúng ta về một vấn đề có thể thay đổi khi có thêm thông tin – một hiện tượng rất tự nhiên trong tư duy.
Ví dụ, nếu bạn nghe thấy một tiếng động lớn bên ngoài, bạn có thể nghĩ rằng đó là tiếng sấm. Nhưng nếu ai đó nói với bạn rằng có công trình xây dựng gần đó, bạn có thể điều chỉnh suy nghĩ của mình và cho rằng đó là tiếng búa. Quá trình này phản ánh chính xác cách nguyên lý Bayes hoạt động: chúng ta bắt đầu với một giả thuyết (niềm tin ban đầu), rồi cập nhật nó khi có thêm bằng chứng.
Lớp mô hình Naive Bayes
Bây giờ, bạn đã hiểu cách nguyên lý Bayes giúp chúng ta cập nhật niềm tin dựa trên bằng chứng mới. Trong học máy, ta có thể áp dụng ý tưởng này để xây dựng mô hình phân loại, trong đó giả thuyết $ H $ là một nhãn lớp và bằng chứng $ E $ là các đặc trưng của dữ liệu.
Tuy nhiên, nếu làm theo cách thông thường, việc tính toán $ P(E) $ có thể trở nên phức tạp khi dữ liệu có nhiều đặc trưng. Để đơn giản hóa bài toán, Naive Bayes đưa ra một giả định quan trọng: các đặc trưng là độc lập có điều kiện với nhau khi đã biết nhãn lớp (phần nào giải thích trong phần Naive trong Naive Bayes). Mặc dù đây là một giả định mạnh (và đôi khi không hoàn toàn đúng trong thực tế), nhưng nó giúp đơn giản hóa tính toán đáng kể và vẫn mang lại hiệu quả tốt trong nhiều bài toán thực tế.
Trong phần tiếp theo, chúng ta sẽ tìm hiểu ba biến thể phổ biến của Naive Bayes trong thư viện scikit-learn
:
- MultinomialNB – phù hợp với dữ liệu rời rạc như mô hình bag-of-words trong xử lý ngôn ngữ tự nhiên.
- BernoulliNB – phù hợp với dữ liệu nhị phân, chẳng hạn như vector đặc trưng có giá trị 0 hoặc 1.
- GaussianNB – phù hợp với dữ liệu liên tục, giả định rằng dữ liệu tuân theo phân phối chuẩn.
MultinomialNB
Cơ sở lí thuyết
Multinomial Naive Bayes là một biến thể của Naive Bayes được sử dụng phổ biến trong phân loại văn bản, đặc biệt khi dữ liệu có dạng biểu diễn tần suất (frequency-based) như mô hình bag-of-words.
Giả sử chúng ta có:
- Bộ dữ liệu đầu vào $ X $ gồm các mẫu dữ liệu, trong đó mỗi mẫu $ X_i $ có nhiều đặc trưng (ví dụ: số lần xuất hiện của từ trong tài liệu).
- Nhãn đầu ra $ y $, trong trường hợp đơn giản là một bài toán nhị phân với hai lớp $ y \in {0, 1} $.
Theo nguyên lý Bayes, xác suất một mẫu $ X $ thuộc lớp $ y $ được tính là:
\[P(y \mid X) = \frac{P(y) P(X \mid y)}{P(X)}\]
Do giả định Naive Bayes về tính độc lập có điều kiện, ta có:
\[P(X \mid y) = \prod_{j=1}^{n} P(x_j \mid y)\]
Với Multinomial Naive Bayes, ta giả định rằng mỗi đặc trưng $ x_j $ của $ X $ tuân theo một phân phối đa thức (multinomial), tức là:
\[P(x_j \mid y) = \frac{N_{j, y} + \alpha}{N_y + \alpha d}\]
Trong đó:
- $ N_{j, y} $ là tổng số lần xuất hiện của đặc trưng $ j $ trong tất cả các mẫu thuộc lớp $ y $.
- $ N_y $ là tổng số lần xuất hiện của tất cả các đặc trưng trong tập dữ liệu thuộc lớp $ y $.
- $ d $ là số lượng đặc trưng (số từ trong từ điển nếu dùng bag-of-words).
- $ \alpha $ là hệ số Laplace smoothing, thường dùng để tránh xác suất bằng 0 khi một từ không xuất hiện trong tập huấn luyện.
Vậy xác suất của một mẫu $ X $ thuộc lớp $ y $ được tính bằng:
\[P(y \mid X) \propto P(y) \prod_{j=1}^{n} \left( \frac{N_{j, y} + \alpha}{N_y + \alpha d} \right)^{x_j}\]
Trong đó $ P(y) $ là xác suất tiên nghiệm của lớp $ y $, thường được tính bằng tần suất của lớp đó trong dữ liệu huấn luyện.
Ví dụ: Phân loại Email Spam bằng Multinomial Naive Bayes
Chúng ta sẽ lấy một ví dụ đơn giản về phân loại email spam và không spam (ham) bằng Multinomial Naive Bayes với mô hình bag-of-words (BOW).
Bước 1: Tạo bộ dữ liệu đơn giản
Giả sử chúng ta có một tập dữ liệu gồm 4 email, mỗi email chứa một số từ vựng cụ thể. Dưới đây là tập dữ liệu mẫu:
Nội dung | Nhãn (Spam = 1, Ham = 0) | |
---|---|---|
1 | “mua ngay giảm giá” | 1 (Spam) |
2 | “giảm giá đặc biệt hôm nay” | 1 (Spam) |
3 | “hôm nay trời đẹp quá” | 0 (Ham) |
4 | “hôm nay đi chơi không” | 0 (Ham) |
Bước 2: Xây dựng Từ điển (Vocabulary) & Biểu diễn BOW
Chúng ta lấy tất cả các từ xuất hiện trong tập dữ liệu và xây dựng từ điển (Bag-of-Words). Giả sử chúng ta có danh sách các từ duy nhất:
Vocabulary:
[“mua”, “ngay”, “giảm”, “giá”, “đặc”, “biệt”, “hôm”, “nay”, “trời”, “đẹp”, “quá”, “đi”, “chơi”, “không”]
Mỗi email bây giờ được biểu diễn dưới dạng vector số, trong đó mỗi phần tử của vector thể hiện số lần xuất hiện của từ đó trong email.
mua | ngay | giảm | giá | đặc | biệt | hôm | nay | trời | đẹp | quá | đi | chơi | không | Nhãn | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 |
Bước 3: Tính xác suất tiên nghiệm $ P(y) $
Xác suất của mỗi lớp (tần suất xuất hiện trong tập dữ liệu):
\[P(\text{Spam}) = \frac{\text{số email spam}}{\text{tổng số email}} = \frac{2}{4} = 0.5\]
Và:
\[P(\text{Ham}) = \frac{\text{số email ham}}{\text{tổng số email}} = \frac{2}{4} = 0.5\]
Bước 4: Tính xác suất có điều kiện $ P(x_j \mid y) $ theo phân phối Multinomial
Tính tổng số lần xuất hiện của từng từ trong mỗi lớp:
Từ | Spam (y=1) | Ham (y=0) |
---|---|---|
mua | 1 | 0 |
ngay | 1 | 0 |
giảm | 2 | 0 |
giá | 2 | 0 |
đặc | 1 | 0 |
biệt | 1 | 0 |
hôm | 1 | 2 |
nay | 1 | 2 |
trời | 0 | 1 |
đẹp | 0 | 1 |
quá | 0 | 1 |
đi | 0 | 1 |
chơi | 0 | 1 |
không | 0 | 1 |
Tổng số từ trong từng lớp:
\[N_{\text{Spam}} = 1+1+2+2+1+1+1+1 = 10\]
Và:
\[N_{\text{Ham}} = 2+2+1+1+1+1+1+1 = 10\]
Áp dụng Laplace smoothing ($ \alpha = 1 $):
\[P(x_j \mid \text{Spam}) = \frac{N_{j, \text{Spam}} + \alpha}{N_{\text{Spam}} + \alpha d}\]
Và:
\[P(x_j \mid \text{Ham}) = \frac{N_{j, \text{Ham}} + \alpha}{N_{\text{Ham}} + \alpha d}\]
Với $ d = 14 $ (số lượng từ trong từ điển), ta có:
\[P(\text{"mua"} \mid \text{Spam}) = \frac{1+1}{10+14} = \frac{2}{24} \approx 0.083\]
Và:
\[P(\text{"mua"} \mid \text{Ham}) = \frac{0+1}{10+14} = \frac{1}{24} \approx 0.042\]
Tương tự, ta tính cho tất cả các từ.
Bước 5: Dự đoán một email mới
Giả sử email mới: “hôm nay giảm giá”
Vector BOW của email này:
mua | ngay | giảm | giá | đặc | biệt | hôm | nay | trời | đẹp | quá | đi | chơi | không |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
Xác suất của email này thuộc lớp Spam:
\[P(\text{Spam} \mid X) \propto P(\text{Spam}) \times P(\text{"giảm"} \mid \text{Spam}) \times P(\text{"giá"} \mid \text{Spam}) \times P(\text{"hôm"} \mid \text{Spam}) \times P(\text{"nay"} \mid \text{Spam})\]
Làm tương tự cho Ham và chọn lớp có xác suất cao hơn.
Tóm tắt
- Xây dựng từ điển và biểu diễn dữ liệu bằng BOW.
- Tính xác suất tiên nghiệm $ P(y) .
- Tính xác suất có điều kiện $ P(x_j \mid y) $ bằng Laplace smoothing.
- Tính xác suất của một email mới thuộc từng lớp.
- Chọn lớp có xác suất cao nhất.
Lưu ý
MultinomialNB
được thiết kế để xử lý dữ liệu rời rạc, chẳng hạn như số lần xuất hiện của từ trong phân loại văn bản. Tuy nhiên, thư viện không cấm bạn sử dụng dữ liệu liên tục (tức là thuộc $\mathbb{R}$), và mô hình vẫn sẽ chạy mà không báo lỗi. Nhưng hãy lưu ý:
- Vì mô hình giả định dữ liệu tuân theo phân phối Multinomial, các tính toán có thể bị sai lệch nghiêm trọng nếu bạn dùng dữ liệu liên tục.
- Nếu bạn cần xử lý dữ liệu liên tục, hãy xem xét sử dụng GaussianNB, một mô hình Naive Bayes được thiết kế để làm việc với dữ liệu dạng này (sẽ được đề cập trong phần sau).
(Hãy chú ý điều này vì trong lớp mình học, đã có khá nhiều người mắc phải lỗi này)
BernoulliNB
BernoulliNB
là một biến thể của Naive Bayes được thiết kế cho dữ liệu nhị phân. Thay vì đếm số lần xuất hiện của từ trong văn bản như MultinomialNB
, mô hình này chỉ quan tâm đến sự có mặt hay không của một đặc trưng.
Cơ sở lí thuyết
Công thức xác suất của Bernoulli Naive Bayes vẫn dựa trên Nguyên lý Bayes, nhưng xác suất có điều kiện được tính theo phân phối Bernoulli:
\[P(x_i \mid y) = p_i^{x_i} (1 - p_i)^{(1 - x_i)}\]
trong đó:
- $ x_i $ là giá trị của đặc trưng thứ $ i $, chỉ có thể là 0 hoặc 1.
- $ p_i = P(x_i = 1 \mid y) $ là xác suất đặc trưng $ i $ xuất hiện trong lớp $ y $.
Công thức này có thể hiểu như sau:
- Nếu $ x_i = 1 $ (đặc trưng xuất hiện), thì xác suất sẽ là $ p_i $.
- Nếu $ x_i = 0 $ (đặc trưng không xuất hiện), thì xác suất sẽ là $ 1 - p_i $.
Ví dụ về BernoulliNB
Giả sử chúng ta có một hệ thống phân loại email thành spam (y=1) và không spam (y=0). Mỗi email được biểu diễn bằng một vector nhị phân, trong đó mỗi đặc trưng ($ x_i $) biểu thị một từ quan trọng có xuất hiện trong email hay không.
Ví dụ: giả sử chúng ta xét từ “FREE” ($ x_1 $) trong email.
- $ p_1 = 0.8 $ nghĩa là trong tập huấn luyện, 80% email spam có chứa từ “FREE”.
- Khi một email mới đến, nếu từ “FREE” xuất hiện trong email ($ x_1 = 1 $), thì xác suất đóng góp của nó là $ P(x_1 = 1 \mid \text{spam}) = 0.8 $.
- Nếu từ “FREE” không xuất hiện ($ x_1 = 0 $), thì xác suất đóng góp của nó là $ P(x_1 = 0 \mid \text{spam}) = 1 - 0.8 = 0.2 $.
Mô hình Bernoulli Naive Bayes tính xác suất của toàn bộ email bằng cách nhân tất cả xác suất của các từ trong email theo công thức trên.
Nhận xét về MultinomialNB và BernoulliNB
Hai mô hình này đặc biệt phổ biến trong các bài toán xử lý văn bản, chẳng hạn như phân loại email spam, phân tích cảm xúc, hay gán nhãn tài liệu. Tuy nhiên, như đã đề cập, chúng cũng có thể áp dụng trong nhiều lĩnh vực khác như sinh học, bảo mật mạng, y khoa,…
Tuy vậy, những ứng dụng ngoài xử lý văn bản thường mang tính đặc thù và đòi hỏi bạn hiểu rõ bản chất dữ liệu trước khi sử dụng. MultinomialNB hoạt động tốt với dữ liệu dạng đếm, trong khi BernoulliNB phù hợp hơn với dữ liệu nhị phân. Vì vậy, khi làm việc với dữ liệu thực tế, hãy thử nghiệm và kiểm tra kỹ mô hình nào thực sự phù hợp, đừng chỉ áp dụng máy móc.
So sánh nhanh MultinomialNB vs. BernoulliNB:
Đặc điểm | MultinomialNB | BernoulliNB |
---|---|---|
Dữ liệu | Số lần xuất hiện (0, 1, 2, …) | Có hoặc không có (0 hoặc 1) |
Ứng dụng phổ biến | Phân loại văn bản dựa trên tần suất | Phân loại văn bản với túi từ đơn giản |
Phù hợp cho | Dữ liệu có đặc trưng rời rạc (count) | Dữ liệu có đặc trưng nhị phân |
Lưu ý
- BernoulliNB hoạt động tốt khi đặc trưng có thể biểu diễn dưới dạng nhị phân, chẳng hạn như có hoặc không có từ trong văn bản.
- Nếu bạn sử dụng nó với dữ liệu số lần xuất hiện thay vì nhị phân, nó có thể cho kết quả sai lệch.
GaussianNB
Cơ sở lý thuyết
Gaussian Naive Bayes (GNB) vẫn dựa trên Nguyên lý Bayes, nhưng khác với MultinomialNB và BernoulliNB, nó được thiết kế để làm việc với dữ liệu liên tục thay vì dữ liệu dạng tần suất hay nhị phân.
Mô hình hóa xác suất với phân phối Gaussian
Thay vì giả định rằng mỗi đặc trưng tuân theo phân phối Bernoulli (nhị phân) hay Multinomial (đếm số lần xuất hiện), GaussianNB giả định rằng các đặc trưng liên tục tuân theo phân phối chuẩn (Gaussian/Normal), nghĩa là:
\[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)\]
Trong đó:
- $ x_i $ là giá trị của đặc trưng thứ $ i $.
- $ \mu_y $ là trung bình (mean) của đặc trưng $ x_i $ trong lớp $ y $.
- $ \sigma_y^2 $ là phương sai (variance) của đặc trưng $ x_i $ trong lớp $ y $.
- $ P(x_i \mid y) $ là xác suất quan sát được giá trị $ x_i $ nếu lớp là $ y $.
Ý nghĩa của công thức
- Thay vì tính xác suất một đặc trưng xuất hiện như MultinomialNB hoặc BernoulliNB, GaussianNB mô hình hóa xác suất của giá trị liên tục theo phân phối chuẩn.
- Với mỗi lớp $ y $, mô hình sẽ ước lượng các tham số $ \mu_y $ và $ \sigma_y^2 $ từ dữ liệu huấn luyện.
- Khi gặp dữ liệu mới, thay vì kiểm tra xem một từ có xuất hiện hay không, GaussianNB sẽ tính xác suất của từng đặc trưng theo hàm mật độ xác suất (PDF) của phân phối chuẩn.
Lưu ý
Với GaussianNB,
scikit-learn
cũng không cấm bạn sử dụng các đặc trưng dạng tần suất nguyên, nhưng về mặt tính toán, điều này có thể dẫn đến sai lệch tương tự như khi dùng dữ liệu liên tục cho MultinomialNB hoặc dữ liệu không nhị phân cho BernoulliNB.Nếu áp dụng GaussianNB cho bài toán xử lý văn bản, thay vì sử dụng tần suất nguyên (số lần xuất hiện từ), bạn nên chuyển đổi đặc trưng về dạng liên tục, ví dụ:
- Dùng
TF-IDF
thay vì chỉ đếm số lần xuất hiện từ.- Dùng
StandardScaler
hoặcMinMaxScaler
nếu đặc trưng là số liệu có đơn vị đo lường khác nhau.Điều này giúp GaussianNB hoạt động hợp lý hơn với dữ liệu, tránh những sai số do mô hình giả định rằng các đặc trưng phải tuân theo phân phối chuẩn.
Kết luận
Chúng ta đã cùng đi qua ba mô hình Naive Bayes chính trong scikit-learn
:
- MultinomialNB: Phù hợp với dữ liệu tần suất, đặc biệt là bài toán xử lý văn bản như phân loại email, tài liệu.
- BernoulliNB: Là lựa chọn khi dữ liệu có dạng nhị phân, như mô hình có/không xuất hiện từ trong tài liệu hoặc bài toán phân loại dựa trên câu trả lời đúng/sai.
- GaussianNB: Dành cho dữ liệu liên tục, như dữ liệu y khoa, nhận diện khuôn mặt, hoặc phân loại dựa trên thông số kỹ thuật.
Một số lưu ý quan trọng
Chọn mô hình phù hợp với loại dữ liệu:
- Không nên dùng MultinomialNB hay BernoulliNB với dữ liệu liên tục – kết quả sẽ không chính xác.
- GaussianNB có thể xử lý dữ liệu tần suất, nhưng cần cân nhắc vì giả định phân phối chuẩn có thể không đúng.
Chuẩn bị dữ liệu đúng cách:
- Nếu làm việc với văn bản, TF-IDF có thể giúp cải thiện hiệu suất.
- Nếu sử dụng GaussianNB, chuẩn hóa dữ liệu (
StandardScaler
,MinMaxScaler
) thường là một thói quen tốt.
Hiểu rõ giả định của từng mô hình:
- Mặc dù Naive Bayes giả định các đặc trưng độc lập, điều này không hoàn toàn đúng trong thực tế. Tuy nhiên, mô hình vẫn hoạt động rất tốt trong nhiều tình huống thực tế.
Chúc các bạn học tốt môn Học Máy!
Nguồn tham khảo
- Scikit-learn Documentation
- 3Blue1Brown - Bayes theorem, the geometry of changing beliefs
- Vikramkumar et al. - 2014 - Bayes and Naive Bayes Classifier
- Metsis et al. - 2006 - Spam Filtering with Naive Bayes - Which Naive Bayes?
- Sakkis et al. - 2003 - A Memory-Based Approach to Anti-Spam Filtering for Mailing Lists