Naive Bayes và mô hình xác suất cho text
Bộ phân loại Bayes ngây thơ: định lý Bayes, luật nhân cộng xác suất, giả thiết độc lập và bài thi văn bản.
Trung bìnhThuật toán ~60 phút
Ôn lại trước khi học
Giới thiệu
Bài này học Naive Bayes đoán lớp bằng xác suất. Bộ này giúp lọc thư rác nhanh mà chuẩn.
Kiến thức cần nhớ
Định lý Bayes
- Hậu nghiệm = khả năng nhân tiên nghiệm chia bằng chứng.
- Tiên nghiệm là tỉ lệ chung, khả năng là dấu hiệu lớp.
- So tử số là đủ vì mẫu số chung mọi lớp.
- Ví dụ đời thường: thấy từ trúng thưởng thì ngờ thư rác.
Giả thiết ngây thơ
- Coi các từ độc lập khi đã biết lớp.
- Khả năng cả mail thành tích khả năng từng từ.
- Giả thiết sai nhưng chỉ cần lớp thắng đúng là đủ.
- Ví dụ đời thường: trăm bằng chứng yếu cộng lại thành mạnh.
Làm mịn và 3 biến thể
- Từ mới chưa thấy phải làm mịn cộng một kẻo tích về 0.
- Đa thức cho đếm từ, Bernoulli cho có/không, Gauss cho số.
- Chọn sai biến thể thì mô hình méo ngay.
- Ví dụ đời thường: từ lạ vẫn cho điểm nhỏ chứ không cho 0.
# So tử số hậu nghiệm 2 lớp
def chon_lop(tien_rac, tien_thuong, kha_rac, kha_thuong):
diem_rac = tien_rac * kha_rac # tử số lớp rác
diem_thuong = tien_thuong * kha_thuong # tử số lớp thường
return "rac" if diem_rac > diem_thuong else "thuong"
Ví dụ
- Input: mail toàn từ rác mạnh -> Output: phân rác với điểm áp đảo.
- Câu này cho thấy từ khóa quyết định rõ ràng.
- Input: gặp từ hoàn toàn mới -> Output: xác suất nhỏ dương, không sập tính toán.
- Câu này cho thấy làm mịn cứu cả tích.
💻 Bài tập
Ngôn ngữ: Python 3. Không dùng sklearn.naive_bayes trừ khi đối chiếu. Nộp vào day-054/.
Bài 1: Multinomial Naive Bayes cho thư rác
class MultinomialNB:
def __init__(self, alpha: float = 1.0): ... # làm mịn Laplace
def fit(self, docs: list[list[str]], labels: list[str]): ...
def predict_log_proba(self, doc: list[str]) -> dict[str, float]: ...
def predict(self, doc: list[str]) -> str: ...
Ràng buộc
- Tính bằng log xác suất để tránh tràn số dưới khi mail dài.
- Từ chưa gặp trong tập train thì bỏ qua (không có trong từ vựng).
- .
train: rác = ["trúng thưởng tiền", "tiền miễn phí"], thường = ["họp lúc 3 giờ", "gửi báo cáo"]
predict("nhận tiền miễn phí") -> rác
predict("báo cáo cuộc họp") -> thường
mail 5000 từ -> không ra -inf hay NaN
Bài 2: Dữ liệu thật
Dùng bộ SMS Spam Collection (5574 tin, công khai).
- Tách từ: chữ thường, bỏ dấu câu.
- Chia 80/20 có phân tầng. In accuracy, precision, recall của lớp spam.
- In 15 từ có lớn nhất.
- Thử
alpha = 0.01, 0.1, 1, 10. Chọn alpha tốt nhất bằng validation.
Bài 3: Gaussian và Bernoulli (nâng cao)
- Cài
GaussianNB: mỗi lớp mỗi đặc trưng có mean và variance. Cộng1e-9vào variance. Chạy trên Iris. - Cài
BernoulliNB: đặc trưng có/không có từ. Chạy lại SMS Spam. So với Multinomial. - Viết 3 câu: giả thiết độc lập sai ở đâu trong dữ liệu SMS, và vì sao mô hình vẫn tốt.
✅ Tiêu chí hoàn thành
- Test mẫu pass, mail dài không tràn số.
- Kết quả khớp
sklearnvới cùng alpha. - Bảng metric Bài 2 và bảng so sánh 3 biến thể có số thật.
- Giải thích được vai trò của làm mịn Laplace bằng ví dụ.
❓ Câu hỏi ôn tập
- Định lý Bayes gồm 3 thành phần nào?
- Giả thiết ngây thơ coi các từ thế nào?
- Làm mịn cộng một để làm gì?
- Khi nào dùng biến thể Gauss?
🌕 Bạn đã hoàn thành ngày 54. Làm hết bài tập phía trên rồi sang ngày tiếp theo.