1. Trang chủ
  2. » Giáo án - Bài giảng

ỨNG DỤNG THỰC tế của THUẬT TOÁN NAIVE BAYES

16 1,2K 8

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 16
Dung lượng 1,01 MB

Nội dung

MỤC LỤC I. CƠ SỞ LÝ THUYẾT ....................................................3 1.1. Công thức Bayes ..................................................3 1.2. Naïve Bayes Classifier ...........................................3 1.3. Mô hình Gaussian Naïve Bayes .....................................5 1.4. Mô hình Multinomial Naïve Bayes (MultinomialNB) ..................5 1.5. Mô hình Bernoulli Naïve Bayes (BernoulliNB) ......................6 II. ỨNG DỤNG CỦA THUẬT TOÁN ...........................................7 2.1. Bài toán phân loại thư rác .......................................7 2.1.1 Mô tả dữ liệu ...................................................7 2.1.2 Cài đặt thuật toán ..............................................8 2.1.3 Nhận xét kết quả ............................................... 10 2.2. Bài toán chuẩn đoán bệnh tiểu đường ............................. 11 2.2.1 Mô tả dữ liệu và yêu cầu ....................................... 11 2.2.2 Cài đặt thuật toán ............................................. 12 2.2.3 Nhận xét kết quả ............................................... 14 III. KẾT LUẬN ........................................................ 15 1. Ưu điểm ........................................................... 15 2. Nhược điểm ........................................................ 15 TÀI LIỆU THAM KHẢO ................................................... 16

Trang 1

BÁO CÁO

BÀI TẬP LỚN MƠN HỌC

HỌC PHẦN: KHAI PHÁ DỮ LIỆU VÀ ỨNG DỤNG

TP HỒ CHÍ MINH, THÁNG 10 NĂM 2019

ĐỀ TÀI:

NGHIÊN CỨU, TÌM HIỂU ỨNG DỤNG THỰC

TẾ CỦA THUẬT TỐN NẠVE BAYES

Trang 2

MỤC LỤC

I CƠ SỞ LÝ THUYẾT 3

1.1 Cơng thức Bayes 3

1.2 Nạve Bayes Classifier 3

1.3 Mơ hình Gaussian Nạve Bayes 5

1.4 Mơ hình Multinomial Nạve Bayes (MultinomialNB) 5

1.5 Mơ hình Bernoulli Nạve Bayes (BernoulliNB) 6

II ỨNG DỤNG CỦA THUẬT TỐN 7

2.1 Bài tốn phân loại thư rác 7

2.1.1 Mơ tả dữ liệu 7

2.1.2 Cài đặt thuật tốn 8

2.1.3 Nhận xét kết quả 10

2.2 Bài tốn chuẩn đốn bệnh tiểu đường 11

2.2.1 Mơ tả dữ liệu và yêu cầu 11

2.2.2 Cài đặt thuật tốn 12

2.2.3 Nhận xét kết quả 14

III KẾT LUẬN 15

1 Ưu điểm 15

2 Nhược điểm 15

TÀI LIỆU THAM KHẢO 16

Trang 3

I CƠ SỞ LÝ THUYẾT

1.1 Cơng thức Bayes

- Ví dụ, một quả cĩ thể được coi là một quả cam nếu nĩ cĩ màu cam, trịn và đường kính khoảng 3 inch Ngay cả khi các tính năng này phụ thuộc vào nhau hoặc dựa trên sự tồn tại của các tính năng khác, một bộ phân loại Naive Bayes sẽ xem xét tất cả các đặc điểm này để đĩng gĩp độc lập vào xác suất rằng loại quả này là một quả cam

- Mơ hình Naive Bayesian rất dễ thực hiện và đặc biệt hữu ích cho các tập dữ liệu rất lớn Ngồi việc đơn giản Naive Bayes cịn được biết đến là vượt trội hơn cả các phương pháp phân loại rất tiên tiến

Cơng thức Nạve Bayes được định nghĩa: P(B|A) = 𝑃(𝐵).𝑃(𝐴|𝐵)

𝑃(𝐴) (0)

 P(B|A): là xác xuất của lớp mục tiêu được dự đốn

 P(B): xác xuất của lớp trước

 P(A|B): khả năng xác xuất lớp dự đốn đưa ra

 P(A): là xác xuất dự đốn trước

1.2 Nạve Bayes Classifier

Xét bài tốn classification với C classes 1,2, …, C1, 2, …, C Giả sử cĩ một điểm dữ

liệu x∈RdHãy tính xác suất để điểm dữ liệu này rơi vào class c Nĩi cách khác, hãy

tính:

p(y=c|x) (1)

hoặc viết gọn thành p(c|x)

- Nĩi cách khác là tính xác suất để đầu ra là class c biết rằng đầu vào là vector x

- 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 class Từ đĩ cĩ thể giúp xác định class của điểm dữ liệu đĩ

bằng cách chọn ra class cĩ xác suất cao nhất:

Từ đĩ cĩ thể giúp xác định class của điểm dữ liệu đĩ bằng cách chọn ra class cĩ xác suất cao nhất:

𝑐 = arg 𝑚𝑎𝑥𝑐 𝑝(𝑐|𝑥) (2)

𝑐 ∈ {1, … , 𝑐}

Áp dụng cơng thức Bayes từ (2) ta được: 𝑐 = arg 𝑚𝑎𝑥𝑐 𝑝(𝑥|𝑐).𝑝(𝑐)

Trang 4

Vì mẫu số p(x) khơng phụ thuộc vào c nên: 𝑐 = arg 𝑚𝑎𝑥𝑐 𝑝(𝑥|𝑐) 𝑝(𝑐) (4)

- Tiếp tục xét biểu thức (4) cĩ thể được hiểu là xác suất để một điểm rơi vào class c

Giá trị này cĩ thể được tính bằng cách lấy tỉ lệ số điểm dữ liệu trong tập training rơi vào class này chia cho tổng số lượng dữ liệu trong tập traing

- Thành phần cịn lại p(x|c), tức phân lớp của các điểm dữ liệu trong class c,

thường rất khĩ tính tốn vì x là một biến ngẫu nhiên nhiều chiều, cần rất rất nhiều

dữ liệu training để cĩ thể xây dựng được phân lớp đĩ Để giúp cho việc tính tốn được đơn giản, người ta thường giả sử một cách đơn giản nhất 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:

𝑝(𝑥|𝑐) = 𝑝(𝑥1, 𝑥2, … , 𝑥𝑑|𝑐) = ∏ 𝑝(𝑥𝑖|𝑐)

𝑑

𝑖=1

(5)

- Giả thiết các chiều của dữ liệu độc lập với nhau, nếu biết cc, là quá chặt và ít khi tìm được dữ liệu mà các thành phần hồn tồn độc lập với nhau Tuy nhiên, giả thiết này lại mang lại những kết quả tốt bất ngờ 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 class của dữ liệu dựa trên giả thiết này cĩ tên là Naive Bayes Classifier Do Nạve Bayes Classifier cĩ

tính đơn giản nên cĩ tốc độ training và test kết quả rất nhanh Điều này mang lại hiệu quả cao trong các bài tốn cĩ qui mơ lớn (large-scale)

- Ở bước training, các phân lớp của p(c) và 𝑝(𝑥𝑖|𝑐), i = 1,2, , d sẽ được xác định

dựa vào training data

- Ở bước test, với một điểm dữ liệu mới x, class của nĩ sẽ đượ xác định bởi:

𝑐 = arg max = log(𝑝(𝑐)) + ∑ log (𝑝(𝑥𝑖|𝑐))

𝑑

𝑖=1

(6)

- Mặt khác cĩ thể giả sử các thành phần trong dữ liệu là độc lập với nhau, nếu biết class, khiến cho việc tính tốn mỗi phân lớp p(𝑥𝑖|c) trở nên cực kỳ nhanh

- Mỗi giá trị p(c), c = 1, 2, …, C p(c), c= 1, 2, …, C cĩ thể được xác định như là tần suất xuất hiện của class cc trong training data

- Naive Bayes Classifier được sử dụng hiệu quả trong nhiều bài tốn thực tế, đặc

biệt là trong các bài tốn về phân loại văn bản, ví dụ như lọc tin nhắn rác hay lọc email spam, …

- Việc tính tốn p(𝑥𝑖 |c) phụ thuộc vào loại dữ liệu Gồm các phân lớp Gaussian Naive Bayes, Complement Nạve Bayes, Multinomial Naive Bayes và Bernoulli Naive

Trang 5

- Tuy nhiên cĩ ba loại được sử dụng phổ biến là: Gaussian Naive Bayes, Multinomial Naive Bayes và Bernoulli Nạve

1.3 Mơ hình Gaussian Nạve Bayes

- 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 class c, 𝑥𝑖 tuân theo một phân lớp chuẩn cĩ kỳ vọng 𝜇𝑐𝑖 và phương sai 𝜎𝑐𝑖2:

(7)

1.4 Mơ hình Multinomial Nạve Bayes (MultinomialNB)

- MultinomialNB thực hiện thuật tốn Bayes cho dữ liệu phân lớp đa phương thức

và là một trong hai biến thể Nạve Bayes cổ điển được sử dụng trong phân loại văn bản Phân lớp được tham số hĩa bởi các vectơ cho mỗi lớp, trong đĩ số lượng tính năng (trong phân loại văn bản, kích thước của từ vựng) và là xác suất của tính năng xuất hiện trong một mẫu thuộc về lớp

- Mỗi văn bản được biểu diễn bởi một vector cĩ độ dài d chính là số từ trong từ điển Giá trị của thành phần thứ i trong mỗi vector chính là số lần từ thứ i xuất

hiện trong văn bản đĩ

- Khi đĩ, 𝑝(𝑥𝑖|𝑐) sẽ tỉ lệ với tần suất từ thứ i hay feature thứ i theo dạng tổng quát xuất hiện trong các văn bản của class c Giá trị này được tính bằng:

𝑐𝑖 = 𝑝(𝑥𝑖|𝑐) = 𝑁𝑐𝑖

𝑁𝑐 (8) Trong đĩ:

o 𝑁𝑐𝑖 là tổng số lần từ thứ i xuất hiện trong các văn bản của class c, nĩ được tính

là tổng của tất cả các thành phần thứ i của các feature vectors ứng với các class

c

o 𝑁𝑐 là tổng số từ (kể cả từ lặp lại) xuất hiện trong class c Nĩ bằng tổng độ dài của tồn bộ văn bản thuộc class c 𝑁𝑐 = ∑𝑑𝑖=1𝑁𝑐𝑖 , từ đĩ ∑𝑑𝑖=1𝑐𝑖 = 1

Hạn chế của các tính này là nếu một từ khơng cĩ trong class c thì biểu thức (8)

sẽ trả về kết quả bằng 0, dẫn đến vế phải của (6) cũng bằng khơng làm cho kết quả khơng được chính xác

Trang 6

- Để giải quyết ta dùng kỹ thuật Laplace smoothing:

𝑐𝑖 = 𝑁𝑐𝑖 + 𝑎

𝑁𝑐+ 𝑑𝛼 (9) Với số dương α, thường bằng 1, để tránh trường hợp tử số bằng 0 Mẫu số sẽ được cộng với 𝑑𝛼 để đảm bảo tổng xác suất ∑𝑑𝑖=1𝑐𝑖 = 1

1.5 Mơ hình Bernoulli Nạve Bayes (BernoulliNB)

- BernoulliNB thực hiện các thuật tốn đào tạo và phân loại cho dữ liệu được phân lớp theo các bản phân lớp Bernoulli đa biến Tức là, cĩ thể cĩ nhiều tính năng nhưng mỗi tính năng được coi là một biến cĩ giá trị nhị phân (Bernoulli, boolean) 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ị binary – bằng 0 hoặc 1, nếu trao bất kỳ loại dữ liệu nào khác thì BernoulliNB cĩ thể nhị phân hĩa đầu vào của nĩ (tùy thuộc vào tham số binarize)

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 đĩ, ta tìm 𝑝(𝑥𝑖|𝑐) bằng cách:

𝑝(𝑥𝑖|𝑐) = 𝑝(𝑥𝑖|𝑐)xi(1 − 𝑝(𝑥𝑖|𝑐)1−xi) (10) Với 𝑝(𝑥𝑖|𝑐) cĩ thể được hiểu là xác xuất từ thứ I xuất hiện trong các văn bản

của class c

Trang 7

II ỨNG DỤNG CỦA THUẬT TOÁN

2.1 Bài toán phân loại thư rác

2.1.1 Mô tả dữ liệu

- Yêu cầu của bài toán là phân loại các thư thành SPAM hay NON-SPAM, hiệu quả phân loại phải khả quan và giảm thiểu lỗi phân loại sai NON-SPAM thành SPAM

- Phân loại thư rác là bài toán phân loại văn bản với hai lớp là SPAM và

NON-SPAM

- Dữ liệu trong ví dụ này được lấy trong http://openclassroom.stanford.edu

- Tập dữ liệu này bao gồm tổng cộng 960 emails tiếng Anh, được tách thành tập training và test theo tỉ lệ 700:260, 50% trong mỗi tập là các spam emails

- Để cho bài toán được đơn giản hơn thì dữ liệu đã được xử lý gồm các files:

 test-features.txt

 train-features-50.txt

 train-features-100.txt

 train-features-400.txt

 train-features.txt

 test-labels.txt

 train-labels-50.txt

 train-labels-100.txt

 train-labels-400.txt

 train-labels.txt

tương ứng với các file chứa dữ liệu của tập training và tập test File train-features-50.txt chứa dữ liệu của tập training thu gọn với chỉ có tổng cộng 50 training emails

- Mỗi file *labels*.txt chứa nhiều dòng, mỗi dòng là một ký tự 0 hoặc 1 thể hiện email là non-spam hoặc spam

- Mỗi file *features*.txt chứa nhiều dòng, mỗi dòng có 3 số, ví dụ:

1 564 1

1 19 2

- Trong đó số đầu tiên là chỉ số của email, bắt đầu từ 1; số thứ hai là thứ tự của từ trong

từ điển (tổng cộng 2500 từ); số thứ ba là số lượng của từ đó trong email đang xét Dòng đầu tiên nói rằng trong email thứ nhất, từ thứ 564 trong từ điển xuất hiện 1 lần Cách lưu dữ liệu như thế này giúp tiết kiệm bộ nhớ vì 1 email thường không chứa

Trang 8

hết tất cả các từ trong từ điển mà chỉ chứa một lượng nhỏ, ta chỉ cần lưu các giá trị khác khơng

- Nếu ta biểu diễn feature vector của mỗi email là một vector hàng cĩ độ dài bằng độ dài từ điển (2500) thì dịng thứ nhất nĩi rằng thành phần thứ 564 của vector này bằng

1 Tương tự, thành phần thứ 19 của vector này bằng 1 Nếu khơng xuất hiện, các thành phần khác được mặc định bằng 0

- Mơ hình phân loại thư rác cĩ thể được biểu diễn như sau

2.1.2 Cài đặt thuật tốn

- Thuật tốn bắt đầu bằng việc học nội dung dữ liệu của các thư hợp lệ và nội dung của những thư rác Khi nhận được một thư mới, dựa vào thơng tin cĩ sẵn từ tập mẫu, quá trình xử lý sẽ được áp dụng trên nội dung của thư đĩ

- Đầu tiên cần đọc dữ liệu từ file data_fn với labels tương ứng label_fn

- Dữ liệu sẽ được lưu trong một ma trận mà mỗi hàng thể hiện một email Ma trận này

là một ma trận thưa nên chúng ta sẽ sử dụng hàm scipy.sparse.coo_matrix

Sử dụng mơ hình MultinomialNB

1 ## packages

2 #from future import division, print_function, unicode_literals

3

4 import numpy as np

5 from scipy.sparse import coo_matrix # xay dung ma tran

6 from sklearn.naive_bayes import MultinomialNB

7 from sklearn.metrics import accuracy_score # danh gia do chinh xac cua ket qua

Tập dữ liệu thư đến

Phân loại thư với Nạve Bayes

Hình 2.1 Mơ hình phân loại thư

rác

Trang 9

8

9 path = 'data_mail/'

10 train_data_fn = 'train-features-50.txt'

11 train_label_fn = 'train-labels-50.txt'

12 test_data_fn = 'test-features.txt'

13 test_label_fn = 'test-labels.txt'

14

15 nwords = 2500

16

17 def read_data(data_fn, label_fn):

18 # doc label_fn

19 with open(path + label_fn) as f:

20 content = f.readlines()

21 label = [int(x.strip()) for x in content]

22

23 # doc data_fn

24 with open(path + data_fn) as f:

25 content = f.readlines()

26 content = [x.strip() for x in content]

27

28 dat = np.zeros((len(content), 3), dtype = int)

29

30 for i, line in enumerate(content):

31 a = line.split(' ')

32 dat[i, :] = np.array([int(a[0]), int(a[1]), int(a[2])])

33

34 data = coo_matrix((dat[:, 2], (dat[:, 0] - 1, dat[:, 1] - 1)),\

35 shape=(len(label), nwords))

36 return (data, label)

37

38 (train_data, train_label) = read_data(train_data_fn, train_label_fn)

39 (test_data, test_label) = read_data(test_data_fn, test_label_fn)

40 clf = MultinomialNB()

41

42 #training data

43 clf.fit(train_data, train_label)

44

Trang 10

45 #dua ra ket qua du doan

46 y_pred = clf.predict(test_data)

47 print('Quy mo du lieu dung de training = %d, do chinh xac = %.2f%%' % \

48 (train_data.shape[0],accuracy_score(test_label, y_pred)*100))

Quy mo du lieu dung de training = 50,

Do chinh xac = 97.31%

- Kết quả cho thấy tập training là rất nhỏ chỉ 50 emails tổng cộng nhưng kết quả đạt được thì rất cao

Sử dụng mô hình BernoulliNB

from sklearn.naive_bayes import BernoulliNB

””” Code body ”””

clf = BernoulliNB(binarize = 0.5)

#training data

clf.fit(train_data, train_label)

#dua ra ket qua du doan

y_pred = clf.predict(test_data)

print('Quy mo du lieu dung de training = %d, do chinh xac = %.2f%%' % \

(train_data.shape[0],accuracy_score(test_label, y_pred)*100))

Quy mo du lieu dung de training = 50, do chinh xac = 69.62%

2.1.3 Nhận xét kết quả

 Ta thấy rằng trong bài toán này, MultinomialNB hoạt động hiệu quả hơn BernoulliNB trên cùng một bộ dữ liệu training vì với BernoulliNB thì cũng với một 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, BernoulliNB chỉ quan tâm từ đó có xuất hiện hay không

 Thời gian thực hiện chương trình nhanh phù hợp với tập dữ liệu lớn

 Tuy nhiên nhược điểm của thuật toán là cần phải qua việc đào tạo thì độ chính xác của thuật toán mới được đảm bảo độ tin cậy

Trang 11

2.2 Bài tốn chuẩn đốn bệnh tiểu đường

2.2.1 Mơ tả dữ liệu và yêu cầu

- Tập dữ liệu benhtieuduong.csv (nguồn dữ liệu: techtalk.vn) bao gồm dữ liệu của

768 nữ tình nguyện viên từ 21 tuổi trở lên Bộ dữ liệu bao gồm những người bị tiểu đường và những người khơng bị tiểu đường Tập dữ liệu này gồm các thuộc tính như sau:

1 Số lần mang thai

2 Nồng độ glucose huyết tương 2 giờ trong xét nghiệm dung nạp glucose đường uống

3 Huyết áp tâm trương (mm Hg)

4 Triceps độ dày nếp gấp da (mm)

5 Insulin huyết thanh 2 giờ (mu U / ml)

6 Chỉ số khối cơ thể (cân nặng tính bằng kg / (chiều cao tính bằng m) ^ 2)

7 Chức năng phả hệ tiểu đường

8 Tuổi (năm)

9 Tình trạng bệnh (1 hoặc 0)

Mỗi bộ dữ liệu sẽ cho biết bệnh nhân cĩ bị bệnh tiểu đường trong vịng 5 năm hay khơng

Với mỗi tình nguyện viên, dữ liệu bao gồm tập hợp các chỉ số kể trên và tình trạng bị

BỆNH là CLASS 1 hay khơng bị BỆNH là CLASS 0

- Vì các giá trị của các chỉ số là một biến liên tục chứ khơng phải một giá trị rời

rạc nên ở bày tốn này sẽ áp dụng mơ hình Gaussian Nạve Bayes

Hình 2.2 – Bảng dữ liệu của tình nguyện viên

Trang 12

- Yêu cầu đặt ra là kiểm ra kiểm tra độ chính xác của thuật toán và dự đoán xác

suất BỆNH của các bộ giá trị

2.2.2 Cài đặt thuật toán

Ở bài toán này sẽ áp dụng thư viện sklearn và GaussianNB

- Đối với dữ liệu benhtieuduong.csv thì dữ liệu đã được chuẩn hóa, nên ta bỏ qua bước tiền xử lý

- Đầu tiên ta tiến hành phân tách dữ liệu thành 2 phần Phần thứ nhất là một ma trận chứa 8 chỉ số đầu của các tình nguyện viên, phần thứ 2 là một ma trận chưa

các class tương ứng

def get_data(dataset):

data = []

label = []

for x in dataset:

data.append(x[:8])

label.append(x[-1])

return data, label

- Kế tiếp là tạo mẫu training và mẫu test từ benhtieuduong.csv

o Cách 1: Dùng train_test_split của scikit-learn

trainingSet, testSet = train_test_split(dataset, test_size=, random_state=)

o Cách 2: Xây dựng thủ công một hàm dùng để tách dữ liệu split_data()

Chương trình:

1 from future import division, print_function, unicode_literals

2 import numpy as np

3 import csv

4 from sklearn.naive_bayes import GaussianNB

5 from sklearn.model_selection import train_test_split

6 from sklearn.metrics import accuracy_score

7

8 def load_data(filename):

9 with open('data/benhtieuduong.csv','rt')as f:

10 lines = csv.reader(f)

Ngày đăng: 31/05/2020, 03:50

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w