Trong các phần trước ta đã tìm hiểu qua một trong những mô hình có sử dụng xác suất là Hồi quy logistic (logistic regression). Ở phần này ta cũng tìm hiểu một mô hình có lẽ được sử dụng rộng rãi nhất là Naive Bayes.
Naive Bayes là một thuật toán phân loại các vấn đề nhị phân (hai lớp) hoặc nhiều lớp. Nó được gọi là Naive Bayes hoặc idiot Bayes vì các tính toán xác suất cho mỗi lớp được đơn giản hóa để làm cho phép tính có thể thực hiện được.
Thay vì cố gắng tính toán xác suất của từng giá trị thuộc tính, Naive Bayes giả định là các đặc trưng của dữ liệu độc lập có điều kiện với giá trị của từng lớp.
Đây là một giả định rất mạnh mà hầu như không có trong dữ liệu thực, tức là các thuộc tính không phụ thuộc với nhau ( independent variable ). Tuy nhiên, cách tiếp cận này lại mang lại hiệu quả đáng kinh ngạc. Giả thiết về sự độc lập của các chiều dữ liệu này được gọi là Naive Bayes. Cách xác định lớp của dữ liệu dựa trên giả thiết này có tên là Naive Bayes Classifier.
Nó hoạt động khá tốt trong nhiều bài toán thực tế, đặc biệt là trong các bài toán phân loại văn bản.
Xét bài toán phân loại với $C$ lớp $c_1,c_2,..$ giả sử có một điểm dữ liệu $x \in \mathbb{R}^d$. Tính xác suất để điểm dữ liệu này rơi vào vào lớp $c$. Chính xác là tính: $$p(y=c|x) \quad (1)$$
Biểu thức này, nếu tính được, sẽ giúp chúng ta xác định được xác suất để điểm dữ liệu rơi vào mỗi lớp. Từ đó có thể giúp xác định lớp của điểm dữ liệu đó bằng cách chọn ra lớp có xác suất cao nhất: $$c=arg \max_{c\in \{c_1,c_2,..\}}p(c|x) \quad (2)$$ Biểu thức $(2)$ thường khó tính được trực tiếp.Thay vào đó ta sử dụng Định lý Bayes:
Từ $(3)$ sang $(4)$ ta sử dụng định lý Bayes.
Từ $(4)$ sang $(5)$ tại vì mẫu số $p(x)$ không phụ thuộc vào $c$.
$p(c)$ là xác suất rơi vào lớp $c$, được tính bằng tỉ lệ số điểm dữ liệu trong tập đào tạo rơi vào lớp này chia cho tổng số lượng dữ liệu trong tập đào tạo.
$p(x|c)$ phân phối của các điểm dữ liệu trong lớp $c$, thường rất khó tính toán vì $x$ là một biến ngẫu nhiên nhiều chiều. Để tính toán được đơn giản, giả sử rằng các thành phần của biến ngẫu nhiên $x$ là độc lập với nhau, nếu biết $c$.
Bước training , các phân phối $p(c)$ và $p(x_i|c)$ sẽ được xác định dựa vào dữ liệu đào tạo.
Việc tính $p(x_i|c)$ phụ thuộc vào loại dữ liệu, có ba loại được sử dụng phổ biến là: Gaussian Naive Bayes, Multinomial Naive Bayes, và Bernoulli Naive .
Bước thử nghiệm, lớp $c$ của điểm dữ liệu $x$ sẽ được xác định bằng: $$c=arc \max_{c \in \{c_1,c_2,..\}}p(c)\prod_{i=1}^dp(x_i|c) \quad (7)$$
Khi $d$ lớn và các xác suất nhỏ thì biểu thức $(7)$ sẽ rất nhỏ, khi tính toán dễ xảy ra sai số. Để giải quyết vấn đề này người ta thường lấy $\log$ của vế phải: $$c=arc \max_{c \in \{c_1,c_2,..\}}\bigg[\log\big(p(c)\big)+\sum_{i=1}^d \log\big(p(x_i|c)\big)\bigg] \quad (7.1)$$
Lưu ý: bước quan trọng nhất của thuật toán Naive Bayes là ước lượng $p(x_i|c)$:
Nếu $x_i$ là biến liên tục : giả định biến $x_i$ tuân theo phân bố Gaussian và dùng tập train để ước lượng các tham số của phân bố này ($\mu$ và $\sigma$)
Nếu $x_i$ là biến rời rạc (biến phân loại) dùng tần số (số lần $x_i$ nhận giá trị $x_i$ có nhãn $c$) để ước lượng xác suất $p(x_i| c)$. Để tránh tần số bằng 0 làm cho xác suất bằng 0 thì áp dụng thêm phép làm trơn ( smoothing ) như Laplacian smoothing .
Mô hình này được sử dụng chủ yếu trong loại dữ liệu mà các thành phần là các biến liên tục.
Với mỗi chiều dữ liệu $i$ và một lớp $c$, $x_i$ tuân theo một phân phối chuẩn có kỳ vọng $\mu_{ci}$ và phương sai $\sigma_{ci}^2$: $$p(x_i|c)=p(x_i|\mu_{ci},\sigma_{ci}^2)=\frac{1}{\sqrt{2\pi\sigma_{ci}^2}}\exp\bigg(-\frac{(x_i-\mu_{ci})^2}{2\sigma_{ci}^2}\bigg) \quad (8)$$
Mô hình này chủ yếu được sử dụng trong phân loại văn bản mà vectơ đặc trưng được tính bằng Bags of Words. Lúc này mỗi văn bản sẽ được biểu diễn bằng một vectơ có độ dài $d$ là số từ trong Bags of Words. Giá trị của thành phần thứ $i$ trong mỗi vectơ chính là số lần từ thứ $i$ xuất hiện trong văn bản đó.
Khi đó, $p(x_i|c)$ tỉ lệ với tần suất từ thứ $i$ xuất hiện trong văn bản của class $c$. Giá trị này được tính bằng cách: $$\lambda_{ci}=p(x_i|c)=\frac{N_{ci}}{N_c} \quad (9)$$
Với:
$N_{ci}$ là số lần từ thứ $i$ xuất hiện trong văn bản của lớp $c$. Được tính bằng tổng của tất cả các thành phần thứ $i$ của vectơ đặc trưng ứng với lớp $c$.
$N_c$ là tổng số từ xuất hiện trong lớp $c$, bằng tổng độ dài của toàn bộ văn bản thuộc lớp $c$. $N_c=\sum_{i=1}^dN_{ci} \implies \sum_{i=1}^d\lambda_{ci}=1$
Nhược điểm là nếu một từ chưa bao giờ xuất hiện trong lớp $c$ thì biếu thức $(9)$ sẽ bằng $0$ làm cho biểu thức $(7)$ bằng $0$. Việc này dẫn đến kết quả không chính xác. Để giải quyết việc này, ta sử dụng kỹ thuật Laplace smoothing : $$\hat \lambda_{ci}=\frac{N_{ci}+\alpha}{N_c+d\alpha} \quad (10)$$ Với $\alpha$ là một số dương, thường bằng 1 để tránh trường hợp tử số bằng 0. Mẫu được cộng với $d\alpha$ để đảm bảo $\sum_{i=1}^d\hat \lambda_{ci}=1$.
Mô hình này được áp dụng cho các loại dữ liệu mà mỗi thành phần là một giá trị nhị phân bằng 0 hoặc 1. Ví dụ: cũng với loại văn bản nhưng thay vì đếm tổng số lần xuất hiện của 1 từ trong văn bản, ta chỉ cần quan tâm từ đó có xuất hiện hay không.
Khi đó $p(x_i|c)$ được tính bằng: $$p(x_i|c)=p(i|c)^{x_i}(1-p(i|c))^{1-x_i}$$ Với $p(i|c)$ là xác xuất từ thứ $i$ xuất hiện trong văn bản của lớp $c$.
# Chuẩn bị dữ liệu
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
# Chia dữ liệu thành tập train và tập test
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=1)
X[:10]
Như ta thấy thì dữ liệu của hoa Iris là dữ liệu liên tục, vì thế ta sẽ sử dụng phân phối Gaussian Naive Bayes
# Training
from sklearn.naive_bayes import GaussianNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)
# Dự đoán xác suất nhãn của từng điểm dữ liệu (hàng)
gnb.predict_proba(X_test[:4,:])
# Dự đoán nhãn thuộc lớp 0 hay lớp 1
gnb.predict(X_test[:4, :])
# độ chính xác của mô hình trên toàn bộ dữ liệu test
y_pred = gnb.predict(X_test)
print("Mô hình Gaussian Naive Bayes chính xác :", gnb.score(X_test,y_test)*100," %")
Dễ sử dụng và nhanh khi cần dự đoán nhãn của dữ liệu test. Thực hiện khá tốt trong multiclass prediction.
Có thể hoạt động với các vectơ đặc trưng mà một phần là liên tục (sử dụng Gaussian Naive Bayes ), phần còn lại ở dạng rời rạc (sử dụng Multinomial hoặc Bernoulli ).
Khi giả định rằng các đặc trưng của dữ liệu là độc lập với nhau thì Naive Bayes chạy tốt hơn các thuật toán khác như logistic regression khi có ít dữ liệu đào tạo.
Độ chính xác của Naive Bayes nếu so với các thuật toán khác thì không được cao.
Trong thế giới thực, hầu như bất khả thi khi các đặc trưng của dữ liệu là độc lập với nhau.
Real time prediction: Là 1 thuật toán dễ học và khá nhanh. Nó có thể được dùng để dự đoán trong thế giới thực.
Multiclass prediction: Có thể dự đoán xác suất của nhiều loại lớp.
Text classification/ Spam Filtering/ Sentiment Analysis: Naive Bayes được dùng rất nhiều trong text classification. Tương tự nó cũng được dùng trong Spam filtering, sentiment analysis.
Recommendation System: Naive Bayes và Collaborative Filtering được sử dụng để xây dựng hệ thống gợi ý lọc các thông tin không được để ý và dự đoán các thông tin mà người dùng có thể quan tâm.
$^{[1]}$ Naive Bayes - gialuan1991
$^{[2]}$ Naive Bayes Classifiers - geeksforgeeks.org
$^{[3]}$ GaussianNB - scikit-learn.org
$^{[4]}$ Naive Bayes Classifier - machinelearningcoban.com
$^{[5]}$ Naive Bayes Classifier From Scratch in Python - machinelearningmastery.com
$^{[6]}$ Định lý Bayes - wikipedia.org