Introducere în algoritmul naiv Bayes

ML
ML algoritm
clasificare
Introducere în algoritmul naiv Bayes cover image

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

equations

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:

equations

Î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ă:

equations

equations

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ă:

equations

Cu ajutorul teoremei Bayes, funcția devine:

equations

Î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:

equations

Ș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:

equations

De fapt, putem simplifica și mai mult această formulare eliminând P(x), deoarece este același pentru toate clasele:

equations

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}:

equations

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”:

equations

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”

equations

Același lucru este valabil și pentru celelalte probabilități condiționate:

equations

Acum, pentru probabilitatea P(Cooks) este numărul de linii cu clasa „Cooks” peste numărul total de linii:

equations

Acum calculăm produsul acestor probabilități:

equations

Asta a fost pentru clasa „Bucătari”, acum trebuie să facem același lucru pentru clasa „Comenzi”:

equations

Calculăm probabilitățile individuale:

equations

Și în final calculăm produsul probabilităților:

equations

În cele din urmă, luăm clasa cu cea mai mare probabilitate care este clasa „Bucătari”:

equations

equations

equations

equations

equations

equations

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



Career Services background pattern

Servicii de carieră

Contact Section background image

Să rămânem în legătură

Code Labs Academy © 2024 Toate drepturile rezervate.