Giới thiệu về thuật toán Naive Bayes

ML
thuật toán ML
phân loại
Giới thiệu về thuật toán Naive Bayes cover image

Bàn:

##Giới thiệu

Naive Bayes là một thuật toán học máy phân loại dựa trên định lý Bayes. Nó rất hiệu quả, đặc biệt khi xử lý dữ liệu văn bản như: Phân tích tình cảm, phát hiện thư rác và phân loại văn bản.

Thuật toán này được gọi là “Naive” vì giả định rằng tất cả các biến của tập dữ liệu là độc lập, điều này không phải lúc nào cũng đúng.

Trước khi đi sâu hơn vào việc giải thích cách hoạt động của Naive bayes, hãy đảm bảo rằng chúng ta hiểu những điều sau:

Xác suất có điều kiện

Thuật toán Naive Bayes dựa trên định lý Bayes được thành lập dựa trên xác suất có điều kiện: đó là xác suất xảy ra sự kiện A cho rằng sự kiện B đã xảy ra.

Ví dụ:

Hãy có hai lọ chứa quả bóng màu:

  • Hũ 1 có 3 bi xanh, 2 bi đỏ và 4 bi xanh.

  • Bình 2 có 1 bi xanh, 4 bi đỏ và 3 bi xanh.

Chúng tôi muốn tính xác suất chọn ngẫu nhiên một quả bóng màu xanh từ một trong các lọ

equations

Nó không khác gì tổng xác suất chọn được quả bóng xanh từ Jar1 hoặc Jar2.

Bây giờ, chúng tôi muốn tính xác suất chọn được quả bóng màu xanh lam khi chúng tôi đã chọn Jar1:

equations

Cuối cùng, chúng tôi muốn tính xác suất chọn Jar1 vì chúng tôi đã vẽ được một quả bóng màu xanh. Ở đây chúng tôi sử dụng Định lý Bayes được phát biểu như sau:

equations

equations

Phân loại Naive Bayes

Trong bộ phân loại Naive Bayes, chúng tôi muốn tìm lớp tối đa hóa xác suất có điều kiện cho vectơ đầu vào X; do đó, Naive Bayes có thể được xây dựng như sau:

equations

Với việc sử dụng Định lý Bayes, hàm số trở thành:

equations

Trong công thức này, thật dễ dàng tính được P(Ci) không khác gì xác suất của lớp Ci và thật dễ dàng tính được P(x) là xác suất xảy ra sự kiện x.

Điều khó tính là P(x|Ci); xác suất của sự kiện x với lớp Ci. Để đơn giản hóa hơn nữa, chúng ta cần giả sử rằng tất cả các biến đầu vào là độc lập; do đó, chúng ta có thể viết:

equations

Và thực ra chính vì giả định này mà chúng tôi gọi bộ phân loại này là “Ngây thơ”, bởi vì không phải lúc nào chúng tôi cũng có thể đảm bảo tính độc lập của các biến đầu vào. Trình phân loại Naive Bayes trở thành:

equations

Trên thực tế, chúng ta có thể đơn giản hóa công thức này hơn nữa bằng cách loại bỏ P(x), vì nó giống nhau cho tất cả các lớp:

equations

Bây giờ, chúng ta hãy xem một ví dụ:

| Thời tiết | Thời gian | Ngày trong tuần | Bữa tối |

| ------- | -------- | --------------- | ------ |

| Xóa | Buổi tối | Cuối tuần | Đầu bếp |

| Nhiều mây | Đêm | Ngày trong tuần | Đơn hàng |

| Mưa | Đêm | Ngày trong tuần | Đơn hàng |

| Mưa | Giữa trưa | Ngày trong tuần | Đơn hàng |

| Nhiều mây | Giữa trưa | Cuối tuần | Đầu bếp |

| Xóa | Đêm | Cuối tuần | Đầu bếp |

| Tuyết | Buổi tối | Cuối tuần | Đơn hàng |

| Xóa | Đêm | Ngày trong tuần | Đầu bếp |

| Xóa | Nửa đêm | Cuối tuần | Đơn hàng |

Ở đây, chúng tôi có một tập dữ liệu nhỏ chứa 3 biến đầu vào: Thời tiết, Thời gian và Ngày trong tuần và một biến Mục tiêu: “Bữa tối” cho biết một người nấu hay đặt bữa tối của họ. Chúng tôi muốn tìm lớp của đầu vào x={Clear, Evening, Weekend}:

equations

Chúng ta cần tính xác suất có điều kiện cho lớp “Cooks” và lớp “Orders” với đầu vào x={Clear, Evening, Weekend}. Lớp được dự đoán là lớp có xác suất có điều kiện cao nhất.

Chúng tôi bắt đầu bằng cách tính xác suất có điều kiện của lớp “Cooks”:

equations

Bây giờ chúng tôi tự tính toán từng xác suất có điều kiện:

Xác suất của thời tiết=”Clear” cho rằng lớp là “Cooks” là số dòng có thời tiết “Clear” và lớp “Cooks” trên tổng số dòng có lớp “Cooks”

equations

Điều tương tự cũng xảy ra với các xác suất có điều kiện khác:

equations

Bây giờ đối với xác suất P(Cooks) là số dòng có lớp “Cooks” trên tổng số dòng:

equations

Bây giờ chúng ta tính tích của các xác suất này:

equations

Đó là đối với lớp “Cooks”, bây giờ chúng ta cần làm tương tự với lớp “Orders”:

equations

Chúng tôi tính toán xác suất riêng lẻ:

equations

Và cuối cùng chúng tôi tính toán tích của các xác suất:

equations

Cuối cùng, chúng ta chọn lớp có xác suất cao nhất là lớp “Đầu bếp”:

equations

equations

equations

equations

equations

equations

Ưu điểm và hạn chế của thuật toán này

Thuận lợi:

  • Nó là một máy phân loại rất nhanh.

  • Thật dễ dàng để thực hiện.

  • Không có giai đoạn huấn luyện mà chỉ có giai đoạn suy luận.

  • Không cần nhiều dữ liệu để đưa ra suy luận.

Hạn chế:

  • Naive Bayes giả định rằng các biến đầu vào là độc lập, điều này không phải lúc nào cũng đúng.

  • Naive Bayes gặp phải vấn đề tần số bằng 0: đó là khi nó gán xác suất bằng 0 cho một biến đầu vào. Điều này sẽ loại bỏ tất cả xác suất có điều kiện P(C|x). Một mẹo để tránh điều này là sử dụng tần số tối thiểu là 1 ( thay vì 0 ) cho tất cả các biến.

Tập thể dục

Đây là khung dữ liệu của cùng một tập dữ liệu mà chúng ta đã thấy trong ví dụ.

Nhiệm vụ của bạn là tự mình triển khai Naive Bayes bằng python:

import pandas as pd
dataset = pd.DataFrame()
dataset['Weather'] = ['Clear', 'Cloudy', 'Rainy', 'Rainy', 'Cloudy', 'Clear', 'Snowy', 'Clear', 'Clear']
dataset['Time'] = ['Evening', 'Night', 'Night', 'Midday', 'Midday', 'Night', 'Evening', 'Night', 'Midnight']
dataset['Day'] = ['Weekend', 'Weekday', 'Weekday', 'Weekday', 'Weekend', 'Weekend', 'Weekend', 'Weekday', 'Weekend']
dataset['Class'] = ['Cooks', 'Orders', 'Orders', 'Orders', 'Cooks', 'Cooks', 'Orders', 'Cooks', 'Orders']

def naive_bayes(weather, time, day):

# res_dict = {class1: probability of class 1, class1: probability of class 1
return res_dict

Giải pháp


def naive_bayes(x_weather, x_time, x_day):
  TARGET = 'Dinner' # The name of the target variable
  CLASSES = list(dataset['Dinner'].unique()) # The classes of the target variable
len_dataset = len(dataset) # The length of the dataset
res_dict = {} # res_dict = {class1:probability1, ..., class_n:probability_n}

# for each class of the target classes, we calculate the it's conditional probability
for class_name in CLASSES:
# the number of lines that belong to the class "class_name"
len_c  = len(dataset[ (dataset[TARGET] == class_name) ])

# the number of lines that belong to the class "class_name" and have weather="x_weather"
n_weather = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Weather'] == x_weather) ])
# the number of lines that belong to the class "class_name" and have time="x_time"
n_time = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Time'] == x_time) ])

# the number of lines that belong to the class "class_name" and have day="x_day"
n_day  = len(dataset[ (dataset[TARGET] == class_name) & (dataset['Day'] == x_day) ])

# We calculate the conditional probability:
# P(class|x) = P(weather|class) x P(time|class) x P(day|class) x P(class)
p = (n_weather / len_c) * (n_time / len_c) * (n_day / len_c) * (len_c / len_dataset)        res_dict[class_name] = p
return res_dict



Career Services background pattern

Dịch vụ nghề nghiệp

Contact Section background image

Hãy giữ liên lạc

Code Labs Academy © 2024 Đã đăng ký Bản quyền.