Úvod do naivného Bayesovho algoritmu

ML
ML algoritmus
klasifikácia
Úvod do naivného Bayesovho algoritmu cover image

Tabuľka:

Úvod

Naive Bayes je klasifikačný algoritmus strojového učenia, ktorý je založený na Bayesovej vete. Je veľmi efektívny najmä pri práci s textovými dátami ako: Analýza sentimentu, Detekcia spamu a klasifikácia textu.

Tento algoritmus sa nazýva „Naivný“ kvôli predpokladu, že všetky premenné súboru údajov sú nezávislé, čo nie je vždy pravda.

Skôr ako pôjdeme ďalej vysvetľovať, ako Naive bayes funguje, presvedčte sa, že rozumieme nasledovnému:

Podmienená pravdepodobnosť

Naivný Bayesov algoritmus je založený na Bayesovej vete, ktorá je založená na podmienenej pravdepodobnosti: je to pravdepodobnosť výskytu udalosti A za predpokladu, že udalosť B už nastala.

Príklad:

Dajme si dve nádoby, ktoré obsahujú farebné guľôčky:

  • Nádoba 1 má 3 modré gule, 2 červené gule a 4 zelené gule.

  • Nádoba 2 má 1 modrú guľu, 4 červené loptičky a 3 zelené loptičky.

Chceme vypočítať pravdepodobnosť náhodného výberu modrej gule z jednej z téglikov

equations

Nie je to nič iné ako súčet pravdepodobností výberu modrej gule z Jar1 alebo Jar2.

Teraz chceme vypočítať pravdepodobnosť výberu modrej gule za predpokladu, že sme vybrali Jar1:

equations

Nakoniec chceme vypočítať pravdepodobnosť výberu Jar1 vzhľadom na to, že sme nakreslili modrú guľu. Tu používame Bayesovu vetu, ktorá je uvedená nasledovne:

equations

equations

Klasifikácia Naive Bayes

V Naive Bayesovom klasifikátore chceme nájsť triedu, ktorá maximalizuje podmienenú pravdepodobnosť zadanú vstupným vektorom X; teda Naive Bayes možno formulovať takto:

equations

S použitím Bayesovej vety sa funkcia stáva:

equations

V tejto formulácii je ľahké vypočítať P(Ci), čo nie je nič iné ako pravdepodobnosť triedy Ci, a je ľahké vypočítať P(x), čo je pravdepodobnosť výskytu udalosti x.

Čo je ťažké vypočítať, je P(x|Ci); pravdepodobnosť udalosti x danej triedy Ci. Aby sme to ešte viac zjednodušili, musíme predpokladať, že všetky vstupné premenné sú nezávislé; teda môžeme napísať:

equations

A práve kvôli tomuto predpokladu nazývame tento klasifikátor „Naivný“, pretože nie vždy môžeme zaručiť nezávislosť vstupných premenných. Klasifikátor Naive Bayes sa stáva:

equations

V skutočnosti môžeme túto formuláciu ďalej zjednodušiť odstránením P(x), pretože je rovnaká pre všetky triedy:

equations

Teraz sa pozrime na príklad:

| Počasie | Čas | Deň v týždni | Večera |

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

| Jasné | Večer | Víkend | Kuchári |

| Zamračené | Noc | Pracovný deň | Objednávky |

| Daždivý | Noc | Pracovný deň | Objednávky |

| Daždivý | Poludnie | Pracovný deň | Objednávky |

| Zamračené | Poludnie | Víkend | Kuchári |

| Jasné | Noc | Víkend | Kuchári |

| Zasnežený | Večer | Víkend | Objednávky |

| Jasné | Noc | Pracovný deň | Kuchári |

| Jasné | Polnoc | Víkend | Objednávky |

Tu máme malý súbor údajov, ktorý obsahuje 3 vstupné premenné: Počasie, Čas a Deň v týždni a jednu cieľovú premennú: „Večera“, ktorá označuje, či osoba varí alebo si objednáva večeru. Chceli by sme nájsť triedu vstupu x={Clear, Evening, Weekend}:

equations

Musíme vypočítať podmienenú pravdepodobnosť pre triedu „Kuchári“ a triedu „Objednávky“ za predpokladu, že zadáme x={Jasno, Večer, Víkend}. Predpovedaná trieda je trieda s najvyššou podmienenou pravdepodobnosťou.

Začneme výpočtom podmienenej pravdepodobnosti triedy „Kuchári“:

equations

Teraz vypočítame každú podmienenú pravdepodobnosť samostatne:

Pravdepodobnosť počasia = „Jasné“ za predpokladu, že trieda je „Kuchári“ je počet riadkov s počasím „Jasné“ a triedou „Kuchári“ nad celkovým počtom riadkov s triedou „Kuchári“

equations

To isté platí pre ostatné podmienené pravdepodobnosti:

equations

Teraz pre pravdepodobnosť P(Cooks) je to počet riadkov s triedou „Cooks“ nad celkovým počtom riadkov:

equations

Teraz vypočítame súčin týchto pravdepodobností:

equations

To bolo pre triedu „Kuchári“, teraz musíme urobiť to isté pre triedu „Objednávky“:

equations

Vypočítame jednotlivé pravdepodobnosti:

equations

A nakoniec vypočítame súčin pravdepodobností:

equations

Nakoniec vezmeme triedu s najvyššou pravdepodobnosťou, ktorou je trieda „Kuchári“:

equations

equations

equations

equations

equations

equations

Výhody a obmedzenia tohto algoritmu

Výhody:

  • Je to veľmi rýchly klasifikátor.

  • Je ľahké ho implementovať.

  • Neexistuje žiadna tréningová fáza, ale je to len záver.

  • Na vyvodenie záverov nie je potrebné veľa údajov.

Obmedzenia:

  • Naive Bayes predpokladá, že vstupné premenné sú nezávislé, čo nie je vždy pravda.

  • Naivný Bayes trpí problémom s nulovou frekvenciou: je to vtedy, keď vstupnej premennej priraďuje nulovú pravdepodobnosť. Tým sa vynuluje všetka podmienená pravdepodobnosť P(C|x). Jeden trik, ako sa tomu vyhnúť, je použiť minimálnu frekvenciu 1 (namiesto 0) pre všetky premenné.

Cvičenie

Tu je dátový rámec toho istého súboru údajov, ktorý sme videli v príklade.

Vašou úlohou je implementovať Naive Bayes sami pomocou pythonu:

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

Riešenie


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

Kariérne služby

Contact Section background image

Ostaňme v kontakte

Code Labs Academy © 2024 Všetky práva vyhradené.