Series bài dịch các thuật toán đơn giản dễ hiểu
Chào mừng bạn đến với Supervied Learning (Học có giám sát), chúng ta sẽ bắt đầu với một ví dụ nho nhỏ, tạo cơ sở cho cuộc thảo luận về các vấn đề nêu ra trên tiêu đề. Tiếp đó chúng ta sẽ nói về một và khái niệm toán học như xác suất hậu nghiệm (posterior probability) hay còn được gọi là định lý Bayes (Bayes Thorem).
Chương này được chia thành 2 phần:
- Phần một: mô tả cách hoạt động của Bayes Classifier (Thuật toán phân loại áp dụng định lý Bayes).
- Phần hai: bao gồm một bài tập lập trình bằng Python sử dụng thư viện
sklearn
, thư viện này đã triển khai sẵn thuật toán Naive Nayes Classifier cho bạn rồi, không cần code lại thuật toán từ đầu. Sau đó chúng ta sẽ nói về độ chính xác của model (mô hình) đã train (học).
Hãy tưởng tượng 2 người Alice và Bob, mỗi người có cách sử dụng khác nhau mà bạn đã quen thuộc trước đó. Để cho ví dụ đơn giản nhất có thể thì Alice thường kết hợp 3 từ sau với nhau : love, great, wonderful
, trong khi đó Bob lại hay sử dụng: dog, ball, wonderful
.
Nếu bạn nhận được một email ẩn danh (anonymous email), người gửi ẩn danh ấy có thể là Bob hay Alice. Email có nội dung như sau: I love beach sand. Additionally the sunset at beach offers wonderful view
.
Bạn có thể đoán được người gửi là ai không ? Đoán thử xem !
Nếu bạn đoán Alice là người gửi thì bạn đúng rồi đó. Có lẽ là vì bạn thấy các từ như love, wonderful
, Alice thường sử dụng kết hợp các từ này.
Bây giờ chúng ta sẽ thêm vào tổ hợp xác suất cho các từ đó, giả sử xác suất mà Alice và Bod sử dụng các từ giống như hình minh họa bên dưới. Bạn có thể đoán ai là người gửi nếu nội dung email là Wonderful Love
Bạn đoán được không ?
Nếu bạn nghĩ đó là Bob, thì lại chính xác nữa rồi. Nếu bạn biết công thức toán học để tính ra được thì thật tuyệt vời. Nếu không, không sao cả, chúng ta sẽ cùng nói về nó trong phần sau đây, cách áp dụng định lý Bayes.
1. Định lý Bayes
Nó cho chúng ta biết tần suất của A xảy ra dựa trên điều kiện là B đã xảy ra, viết tắt là P(A|B)
, khi mà chúng ta biết tần suất B xảy ra với điều kiện A đã xảy ra P(B|A)
, xác suất A xảy ra P(A)
, B xảy ra P(B)
.
P(A|B)
is Probability of A given B, the probability of A given that B happensP(A)
is Probability of AP(B|A)
is Probability of B given A, the probability of B given that A happensP(B)
is Probability of B
Giả sử P(Fire) là xác suất cháy , P(Smoke) là xác suất có khói.
P(Fire|Smoke)
: Nếu có khỏi thì xác suất có lửa là bao nhiêu
P(Smoke|Fire)
: Nếu có lửa thì xác suất có khói là bao nhiêu
Ví dụ: Nếu đám chạy nguy hiểm hiếm gặp là 1%, khói thì khá là phổ biến tỉ lệ 10% do các nhà máy gây nên, 90% những đám cháy nguy hiểm đều có khói thì:
P(Smoke) = 10%, P(Fire) = 1%
P(Smoke|Fire) = 90%
Theo công thức ta có P(Fire|Smoke) = (0.9*0.01)/0.1 = 9%
Kết luận: Khi thấy nhà máy có khỏi thì 9% trong đó là đám cháy nguy hiểm.
Bây giờ bạn có thể áp dụng nguyên lý này cho Alice và Bob ? Hãy cùng mình đi đến các phần tiếp theo
2. Naive Bayes Classifier
Naive Bayes là một trong nhóm các thuật toán áp dụng định lý Bayes với một giả định khá ngây thơ - đúng nghĩa đen của từ Naive , rằng mọi features đầu vào đều độc lập với nhau. Bạn có thể hiểu features ở dây là danh sách các biến đầu vào: độ tuổi, giới tính, mức lương, tình trạng hôn nhân, ... Ví dụ 2 biến độc lập là: size giày và giới tính của bạn. Ví dụ 2 biến phụ thuộc là: số tiền quảng cáo bỏ ra và doanh số thu được.
Naive Bayes là bộ phân loại theo xác suất (probability classifier) nên chúng ta sẽ đi tính toán xác suất bằng cách sử dụng định lý Bayes. Ví dụ khi bạn nhận được một tấm ảnh chứa một chữ số bất kì từ 0-9 , bạn sẽ đi tính toán xác suất ảnh này với 10 con số từ 0-9 P(8| Ảnh)=x, P(7| Ảnh)=y, ...
, sau đó chọn ra cặp nào có xác suất cao nhất thì đấy chính là kết quả. Naive Bayes Classifier đã được áp dụng thành công trong nhiều lĩnh vực, một trong số đó là Xử lý ngôn ngữ tự nhiên (Natutal Language Processing).
2.1 Tại sao Naive Bayes lại hiệu quả ?
Chúng ta có các thuật toán thay thế như Suppory Vector Machine
(SVM) hay Neural Networks
khi gặp các vấn đề liên quan đên NLP. Khi đặt NBC (Naive Bayes Classifier) bên cạnh các thuật toán phức tạp, đòi hỏi nhiều thời gian và nguồn lực thì chúng lại trở nên lợi thế với thiết kế đơn giản cho các bài toán phân loại. Hơn nữa chúng còn được nhận xét là nhanh, đáng tin cậy và chính xác trong một số trường hợp của NLP.
2.2 Một ví dụ cụ thể
Trong ví dụ này người đối diện sẽ đưa cho bạn tập dữ liệu train (huấn luyện) như bảng bên dưới, đã được đánh nhãn (label) đầy đủ, trong trường hợp này là Sports và Not Sports, sau đó người đó sẽ hỏi bạn là câu nói A very close game thuộc category nào - Sports hay Not Sports ?
Text | Category |
---|---|
A Great Game | Sports |
The Election was over | Not Sports |
Very clean match | Sports |
A clean but forgettable game | Sports |
It was a close election | Not Sports |
Chắc các bạn đã đoán ra cách làm rồi đúng không nào , chúng ta sẽ đi tính toán xác suất P(Not Sports | a very close game), P(Sports | a very close game), cái nào cao hơn thì mình chọn category đó.
Bước 1: Feature Engineering
Ở bước này chúng ta sẽ tập trung vào chuyện trích xuất các features từ dữ liệu đầu vào (cột Text), chúng ta cần dữ liệu dạng số để truyền vào công thức xác suất Bayes như giới thiêu ở phía trên. Đơn giản nhất bạn có thể đếm tần suất xuất hiện của chúng. Ví dụ: Với category Sport ta thấy từ Game
xuất hiện 2 lần
Công thức tính xác suất của chúng ta sẽ là
Tương tự như vậy với P(Not Sports | a very close game), các bạn sẽ để ý thấy là phần mẫu số sẽ không đổi cho cả hai category đúng không, chúng đều là P(a very close game) nên chúng ta sẽ lượt bỏ luôn.
Để có được P(a very close game | Sports) chúng ta sẽ phải đếm số lượng câu nói A very close game trong Category Sports rồi chia cho tổng số dòng thuộc Category này. Và như các bạn đã thấy thì không có dòng nào đúng từng chữ như vậy được nên xác suất trả ra sẽ bằng không. Chúng ta sẽ làm gì để giải quyết vấn đề này ?
Bước 2: Chỉ cần ngây thơ
Theo cách không ngây thơ thì chúng ta đã thấy là xác suất bằng không, khi tìm kiếm cả câu nói trong tập train. Trong khi đó Naive Bayes giả định rằng các từ là độc lập với nhau, chúng ta sẽ câu nói như các từ riêng lẻ ghép lại.
Công thức tính xác suất được viết lại như sau:
Tương tự chúng ta sẽ có:
P(a very close game | Not Sports) = P(a | Not Sports) x P(very | Not Sports) x P(close | Not Sports) x P(game | Not Sports)
Bước 3: Tính toán xác suất
Ở bước cuối này bạn chỉ cần tính xác suất và so sánh xem P(a very close game | Sports), P(a very close game | Not Sports) thì cái nào lớn hơn.
Có một lưu ý là vì chữ close không xuất hiện trong tập train nên P(close)=0, dẫn đến P(a very close game | Sports)=0, điều này chắc sẽ làm cho những xác suất trước đó không còn ý nghĩa, vì nhân với 0 đều sẽ bằng 0, chúng ta cần tìm một giải pháp cho vấn đề này.
Một giải pháp trong số đó là Laplace smoothing, đây là một kỹ thuật làm mịn dữ liệu dạng phân loại (categorical data), một giá trị nhỏ gọi là pseudo-count sẽ được thêm vào để làm thay đổi xác suất đầu ra. Kết quả là sẽ không còn xác suất nào bằng không nữa, đây là một cách điều chỉnh Naive Bayes, khi pseudo-count (alpha) bằng không có nghĩa là không làm mịn gì cả.
Tham khảo thêm tại Wikipedia
Vậy làm sao chúng ta ứng dụng Laplace smoothing vào trường hợp này ?
Chúng ta sẽ cân nhắc sử dụng a = 1 và d=14, vì tử số được cộng thêm một nên xác suất của P(close | Sports ) sẽ không bao giờ bằng không, và 14 là tổng số từ khác nhau có thể xuất hiện ở cả hai Category: Sports và Not Sports, chắc các bạn sẽ thắc mắc là tại sao lại dùng con số 14, nhưng hôm nay mình sẽ không nói sâu ở đây, d chính là số chiều của vector đầu vào, và nó chính là số lượng từ unique có trong tập train bạn (ở trong trường hợp này).
P(close | Sports ) =(0+1)/(11+14)= 1/25
Như vậy, chúng ta có thể tính xác xuất của 2 Category như sau:
Từ kết quả ở bảng trên ta có thể thấy được P(a very close game | Sports) sẽ cho kết quả cao hơn, nên câu nói A very close game sẽ thuộc category Sports.
Quay trở lại bài toán của Alice và Bob, bạn có thể thấy nó sẽ được giải như sau:
P(Wonderful Love | Bob) = P(Wonderful | Bob) x P(Love | Bob) = 0.5x0.3 = 0.15
P(Wonderful Love | Alice) = P(Wonderful | Alice) x P(Love | Alice) = 0.1x0.1 = 0.01
Bạn thấy 0.15>0.01 nên Bod là người đã nói câu nói này
Một số những cách để cải thiện độ chính xác của Naive Bayes:
- Removing Stopwords: loại bỏ những từ xuất hiện nhiều lần nhưng không có nhiều ý nghĩ (thì, là, được, ...)
- Lemmatizing words: đưa các từ ở dạng số nhiều, qúa khứ, ... về đúng chuẩn của nó: election, elected, elections => election
- Sử dụng n-grams: thay vì đếm tần suất các từ riêng lẽ bạn có thể nhóm nó lại thành cụm 2 hay 3 từ đi chung với nhau, hay còn gọi là cụm từ, Ví dụ: Hồ Chí Minh, trường học, xe bus
- Sử dụng TF-IDF: Đây là một kỹ thuật được sử dụng khá phổ biến, các từ sẽ không có cùng một mức độ quan trọng hơn trong một ngữ cảnh nhất định, ví dụ trong Category là Báo thể thao, những từ như: cầu thủ, đá bóng, cổ động viên sẽ có trọng số lớn hơn các từ khác
Chúc bạn có thể áp dụng thành công Naive Bayes trong công việc, ngoài việc dịch lại của tác giả mình đã thêm vào các giải nghĩa để dễ hiểu hơn, nếu như bài dịch + viết của 200lab có sai sót vui lòng gửi mail về địa chỉ core@200lab.io để phản hồi, cám ơn bạn đã quan tâm.
Tham khảo:
Bạn có thể nhấn vào link này để tham gia vào nhóm và nhận thêm nhiều tài liệu hữu ích khác về Data nhé!
Bài viết liên quan
Database (Cơ sở dữ liệu) là gì? Những loại Database phổ biến nhất hiện nay
Sep 01, 2024 • 11 min read
Python là gì? Những đặc điểm nổi bật và Ứng dụng của Python
Aug 28, 2024 • 14 min read
Ứng dụng Hypothesis Testing - Kiểm định giả thuyết trong Y học
Jul 18, 2024 • 8 min read
Google Colab là gì? Hướng dẫn sử dụng Google Colab cho người mới
Jul 02, 2024 • 10 min read
Hướng dẫn cách lấy dữ liệu Facebook Ads Tự động Mỗi ngày Miễn phí - Phần 2
Jun 24, 2024 • 6 min read
Hướng dẫn cách lấy dữ liệu Facebook Ads Tự động Mỗi ngày Miễn phí- Phần 1
Jun 24, 2024 • 11 min read