Masa:
Introducere
Naive Bayes este un algoritm de învățare automată de clasificare care se bazează pe teorema Bayes. Este foarte eficient mai ales atunci când se ocupă de date textuale precum: Analiza sentimentelor, Detectarea spamului și clasificarea textului.
Acest algoritm este numit „Naiv” din cauza presupunerii că toate variabilele setului de date sunt independente, ceea ce nu este întotdeauna cazul.
Înainte de a explica cum funcționează Naive bayes, să ne asigurăm că înțelegem următoarele:
Probabilitate condițională
Algoritmul naiv Bayes se bazează pe teorema Bayes care se bazează pe probabilitatea condiționată: este probabilitatea apariției unui eveniment A dat fiind că un eveniment B a avut deja loc.
Exemplu:
Să avem două borcane care conțin bile colorate:
-
Borcanul 1 are 3 bile albastre, 2 bile roșii și 4 bile verzi.
-
Borcanul 2 are 1 bile albastră, 4 bile roșii și 3 bile verzi.
Vrem să calculăm probabilitatea de a selecta aleatoriu o minge albastră dintr-unul dintre borcane
Nu este altceva decât suma probabilităților de a selecta o minge albastră din Jar1 sau Jar2.
Acum, dorim să calculăm probabilitatea de a selecta o minge albastră, având în vedere că am selectat Jar1:
În cele din urmă, dorim să calculăm probabilitatea de a selecta Jar1, având în vedere că am tras o bilă albastră. Aici folosim teorema Bayes care este formulată după cum urmează:
Clasificare Bayes naiv
În clasificatorul Naive Bayes, dorim să găsim clasa care maximizează probabilitatea condiționată având în vedere vectorul de intrare X; astfel, Naive Bayes poate fi formulat după cum urmează:
Cu ajutorul teoremei Bayes, funcția devine:
În această formulare, este ușor de calculat P(Ci), care nu este altceva decât probabilitatea clasei Ci și este ușor de calculat P(x) care este probabilitatea ca evenimentul x să se producă.
Ceea ce este greu de calculat este P(x|Ci); probabilitatea evenimentului x dată de clasa Ci. Pentru a simplifica mai mult acest lucru, trebuie să presupunem că toate variabilele de intrare sunt independente; astfel, putem scrie:
Și, de fapt, din cauza acestei presupuneri, numim acest clasificator „Naiv”, deoarece nu putem garanta întotdeauna independența variabilelor de intrare. Clasificatorul Naive Bayes devine:
De fapt, putem simplifica și mai mult această formulare eliminând P(x), deoarece este același pentru toate clasele:
Acum, să aruncăm o privire la un exemplu:
| Vremea | Timp | Ziua săptămânii | Cina |
| ------- | -------- | --------------- | ------ |
| Clar | Seara | Weekend | Bucătari |
| Înnorat | Noapte | Ziua săptămânii | Comenzi |
| ploios | Noapte | Ziua săptămânii | Comenzi |
| ploios | amiază | Ziua săptămânii | Comenzi |
| Înnorat | amiază | Weekend | Bucătari |
| Clar | Noapte | Weekend | Bucătari |
| Zăpadă | Seara | Weekend | Comenzi |
| Clar | Noapte | Ziua săptămânii | Bucătari |
| Clar | Miezul nopții | Weekend | Comenzi |
Aici, avem un mic set de date care conține 3 variabile de intrare: Vremea, Ora și Ziua săptămânii și o variabilă țintă: „Cina” care indică dacă o persoană își gătește sau își comandă cina . Am dori să găsim clasa intrării x={Clear, Evening, Weekend}:
Trebuie să calculăm probabilitatea condiționată pentru clasa „Bucătari” și clasa „Comenzi” având în vedere intrarea x={Clear, Evening, Weekend}. Clasa prezisă este cea care are cea mai mare probabilitate condiționată.
Începem prin a calcula probabilitatea condiționată a clasei „Bucătari”:
Acum calculăm fiecare probabilitate condiționată pe cont propriu:
Probabilitatea de vreme=”Clear” dat fiind că clasa este “Cooks” este numărul de linii cu vremea “Clear” și clasa “Cooks” peste numărul total de linii cu clasa “Cooks”
Același lucru este valabil și pentru celelalte probabilități condiționate:
Acum, pentru probabilitatea P(Cooks) este numărul de linii cu clasa „Cooks” peste numărul total de linii:
Acum calculăm produsul acestor probabilități:
Asta a fost pentru clasa „Bucătari”, acum trebuie să facem același lucru pentru clasa „Comenzi”:
Calculăm probabilitățile individuale:
Și în final calculăm produsul probabilităților:
În cele din urmă, luăm clasa cu cea mai mare probabilitate care este clasa „Bucătari”:
Avantajele și limitările acestui algoritm
Avantaje:
-
Este un clasificator foarte rapid.
-
Este ușor de implementat.
-
Nu există nicio fază de antrenament, ci este doar inferență.
-
Nu necesită multe date pentru a face inferențe.
Limitări:
- Naive Bayes presupune că variabilele de intrare sunt independente, ceea ce nu este întotdeauna adevărat.
- Naive Bayes suferă de problema frecvenței zero: este atunci când atribuie probabilitate zero unei variabile de intrare. Aceasta va reduce la zero toată probabilitatea condiționată P(C|x). Un truc pentru a evita acest lucru este să folosiți o frecvență minimă de 1 (în loc de 0) pentru toate variabilele.
Exercițiu
Iată cadrul de date al aceluiași set de date pe care l-am văzut în exemplu.
Sarcina ta este să implementezi Naive Bayes folosind 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
Soluție
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