ĐỊNH LÝ BAYES – VÀ ỨNG DỤNG VÀO BÀI TOÁN LỌC THƯ RÁC

Ngày đăng: 10/05/2023

Ứng dụng Định lý Bayes và học máy (machine learning) kết quả đã xác định định Email 11 là một Email Spam


  1. Đặt vấn đề:

Với sự nổi lên nhanh chóng của trí tuệ nhân tạo hiện nay, việc tiếp cận bằng học máy (machine learning) đã trở thành một thuật ngữ rất quen thuộc với mọi người. Học máy đã đang và sẽ được ứng dụng trong vô số ứng dụng hiện nay trong nhiều lĩnh vực như việc dự đoán rủi ro trong kinh tế, phân loại tin nhắn trong các công cụ như Gmail hay Yahoo hay gần đây là ứng dụng chẩn đoán bệnh trong y tế ,... Vậy với những người quan tâm về cách máy tính có thể dự đoán được ra kết quả, dựa vào từ 1 tập dữ liệu đầu vào. Bài viết này tác giả sử dụng Định lý Bayes trong Xác suất thống kê cùng với phương pháp học máy (Machine learning) để phân loại mail Spam hay Not Spam và demo bằng ngôn ngữ Python. 

ĐỊNH LÝ BAYES – VÀ ỨNG DỤNG VÀO BÀI TOÁN LỌC THƯ RÁC


  1. Phương pháp:

Suy diễn Bayesian là một kiểu suy diễn đơn giản mà máy tính dựa vào các xác suất của dữ liệu đã có trước của bài toán để tìm ra xác suất của đầu ra cho những đầu vào tiếp theo. 

Công thức Bayes: 

P(A|B) = P(A).P(B|A)/P(B)

- P(A): Xác suất của sự kiện A xảy ra
- P(B ): Xác suất của sự kiện B xảy ra
- P(B|A): Xác suất (có điều kiện) của sự kiện B xảy ra, nếu biết rằng sự kiện A đã xảy ra
- P(A|B): Xác suất (có điều kiện) của sự kiện A xảy ra, nếu biết rằng sự kiện B đã xảy ra
Các phương pháp suy diễn dựa trên xác suất sẽ sử dụng xác suất có điều kiện. 

Cụ thể hơn, Baysian được xây dựng và dựa vào công thức dưới đây để tính rồi so sánh các kết quả lại với nhau để biết xác suất nào là cao hơn


y = cMAP = argmaxP(cj|x1,x2,…,xn) với cj thuộc C

C là tập nhãn có thể nhận được của y (trong trường hợp này C là tập gồm 2 giá trị Spam và Not Spam)

Nhìn lại một chút, công thức trên của Bayesian có nghĩa là chúng ta sẽ tính tất cả các xác suất của từng nhãn khi đã biết sự xảy ra hoặc không xảy ra các thuộc tính cho trước (x1, x2, ..) rồi chọn lấy giá trị lớn nhất (argmax) và đó cũng chính là kết quả dự đoán của chúng ta.

Vấn đề ở chỗ, xác suất xảy ra của nhãn khi biết các điều kiện khác (Xác suất mail là Spam khi biết x1 = vay tiền, x2 = Tour du lịch, x3 = Samsung Electronics… ) là điều mà ta đang cần biết, vậy nên công thức trên có thể được viết lại:

y =  argmaxP(x1,x2,…,xn|cj)P(cj)

P(cj) ở đây được tính là tần suất xuất hiện của nhãn trên toàn bộ tập dữ liệu và có thể được tính rất dễ dàng, ví dụ ở trong bài toán của chúng ta đang nói P(Spam) = P(Not Spam)=50/100


Vấn đề khó khăn hơn ở việc tính xác suất P(x1,x2,…,xn|cj)P(cj)

- Xác suất xảy ra đồng thời các điều kiện x1,x2,…,xn khi nhãn cj xảy ra. Thông thường việc tính này là bất khả thi (nhất là khi số lượng điều kiện n là lớn). Vậy nên thông thường, chúng ta sẽ coi các xác suất x1,x2,..xn là độc lập với nhau, từ đó

P(x1,x2,…,xn|cj) = P(x1|cj).P(x2|cj)…P(xn|cj)

P(x1|cj) được tính dựa trên tập dữ liệu có trước đó bằng số lần xi xuất hiện cùng với cj chia cho tổng số lần xi xuất hiện

Tóm lại bộ phân loại Bayes đơn giản sẽ được viết như sau:

y = argmaxP(cj)TichP(xi|cj)

  1. Thuật toán:

Ta có training data gồm 10 email đánh dấu 2 nhãn (Label): Spam (S) và Not Spam (N)

Bảng từ vựng như sau:

X = [x1, x2, x3, x4, x5]

Trong đó: w1 = vay tiền, w2 = Tour du lịch, w3 = Samsung Electronics, w4 = Đang tuyển dụng, w5 = Bán hàng.

ĐỊNH LÝ BAYES – VÀ ỨNG DỤNG VÀO BÀI TOÁN LỌC THƯ RÁC

Vấn đề đặt ra: Cho biết email 11 là Spam hay Not Spam?

import math #pip install scikit-learn
from sklearn.naive_bayes import BernoulliNB #thư viện hàm Bayes
import numpy as np #train data –huan luyen du lieu;
e1 = [1, 1, 0, 1, 0]
e2 = [0, 1, 1, 0, 0]
e3 = [1, 0, 1, 0, 1]
e4 = [1, 1, 1, 1, 0]
e5 = [0, 1, 0, 1, 0]
e6 = [0, 0, 0, 1, 1]
e7 = [0, 1, 0, 0, 0]
e8 = [1, 1, 0, 1, 0]
e9 = [0, 0, 1, 1, 1]
e10 = [1, 0, 1, 0, 1]
train_data = np.array([e1, e2, e3, e4, e5,
e6, e7, e8, e9, e10]) 

label = np.array(['N', 'N', 'S', 'S', 'S', 'N',
'S', 'S', 'N', 'S'])
e11 = np.array([[1, 0, 0, 1, 1]])
#test data –du lieu can test
clf1 = BernoulliNB(alpha=1e-10)
clf1.fit(train_data, label)
BernoulliNB(alpha=1e-10, binarize=0.0,
class_prior=None, fit_prior=True)
#Huấn luyện (phân tích, xử lý ..)
print('Probability of e11 in each class:',
clf1.predict_proba(e11))
Probability of e11 in each class: [[0.45762712
0.54237288]]
#tính xác suất
print('Predicting class of e11:',
str(clf1.predict(e11)[0]))
Predicting class of e11: S 


  1. Kết luận:

Ứng dụng Định lý Bayes và học máy (machine learning) kết quả đã xác định định Email 11 là một Email Spam

ĐỊNH LÝ BAYES – VÀ ỨNG DỤNG VÀO BÀI TOÁN LỌC THƯ RÁC



ThS. Nguyễn Công Nhựt _K.CNTT

Các tin khác