Phân lớp với Navie Bayes Classification – Mô hình và ứng dụng

Giới thiệu

Thuật toán phân lớp là một phương pháp quan trọng trong Machine Learning. Trong bài viết này, chúng ta sẽ tìm hiểu về một thuật toán phân lớp mang lại hiệu quả tốt trong các bài toán dự đoán. Đó chính là Naive Bayes – một thuật toán phân loại dựa trên lý thuyết xác suất.

Lý thuyết về Naive Bayes

Naive Bayes Classification (NBC) là một thuật toán phân loại dựa trên tính toán xác suất áp dụng định lý Bayes. Thuật toán này thuộc nhóm Supervised Learning (Học có giám sát).

Theo định lý Bayes, ta có công thức tính xác suất như sau:

bayes_formula Định lý Bayes

Công thức trên cho phép tính toán xác suất của một sự kiện chưa biết dựa trên các xác suất có điều kiện khác. Thuật toán Naive Bayes dựa trên việc tính toán các xác suất có điều kiện này.

Naive Bayes Classifier

Cách xác định thành phần (class) của một dữ liệu dựa trên giả thiết các thành phần độc lập với nhau được gọi là Naive Bayes Classifier. Mặc dù thực tế không phải lúc nào cũng có dữ liệu hoàn toàn độc lập, giả thiết này giúp tính toán trở nên đơn giản và training data nhanh chóng.

Ứng dụng trong phân loại text

Một trong các bài toán phổ biến khi sử dụng NBC là phân loại văn bản. Trong bài toán này, mỗi văn bản được biểu diễn dưới dạng bag of words, tức là chỉ xem xét số từ và tần suất xuất hiện của chúng trong văn bản, bỏ qua thứ tự các từ.

Mô hình Multinomial

Có hai mô hình NBC thường được sử dụng: mô hình Bernoulli và mô hình Multinomial. Trong bài toán phân loại văn bản, chúng ta sử dụng mô hình Multinomial.

Mô hình Multinomial chủ yếu được sử dụng trong phân loại văn bản khi feature vectors được tính bằng Bags of Words. Mỗi văn bản được biểu diễn bởi một vector có độ dài d, tương ứng với số từ trong từ điển. Giá trị của thành phần thứ i trong mỗi vector là số lần từ thứ i xuất hiện trong văn bản đó.

Tính xác suất sử dụng Laplace Smoothing

Để tính xác suất từ xuất hiện trong văn bản, chúng ta có công thức sau:
probability_formula Công thức tính xác suất từ xuất hiện trong văn bản

Tuy nhiên, công thức này gặp phải một vấn đề khi từ không xuất hiện trong văn bản, tức Ni=0. Điều này dẫn đến P(xi|y)=0.

Để khắc phục vấn đề này, người ta sử dụng kỹ thuật gọi là Laplace Smoothing bằng cách cộng thêm α vào cả tử và mẫu để giá trị luôn khác 0.

Sử dụng NBC trong Python

Dưới đây là ví dụ cách sử dụng NBC trong Python để phân loại email vào hai nhãn “spam” và “non-spam”.

from sklearn.naive_bayes import MultinomialNB
import numpy as np

e1 = [1, 2, 1, 0, 1, 0, 0]
e2 = [0, 2, 0, 0, 1, 1, 1]
e3 = [1, 0, 1, 1, 0, 2, 0]
train_data = np.array([e1, e2, e3])
label = np.array(['N', 'N', 'S'])

e4 = np.array([[1, 0, 0, 0, 0, 0, 1]])

clf1 = MultinomialNB(alpha=1)
clf1.fit(train_data, label)

print(clf1.predict_proba(e4)) #Xác suất của e4 thuộc từng nhãn
print(str(clf1.predict(e4)[0])) #Dự đoán nhãn của e4

Kết luận

Naive Bayes là một thuật toán phân loại mạnh mẽ và dễ dùng, đặc biệt phù hợp với các bài toán phân loại văn bản. Thông qua ví dụ trên, chúng ta có thể thấy cách sử dụng NBC trong Python rất đơn giản và hiệu quả.

Hy vọng bài viết đã giúp bạn hiểu về thuật toán Naive Bayes và cách áp dụng nó vào các bài toán phân loại khác nhau. Hãy thử áp dụng mã nguồn trên để xem kết quả trong các trường hợp khác nhau.

Tài liệu tham khảo

FEATURED TOPIC