Tabela:
– Prednosti in omejitve tega algoritma
Uvod
Naive Bayes je klasifikacijski algoritem strojnega učenja, ki temelji na Bayesovem izreku. Je zelo učinkovit, zlasti pri delu z besedilnimi podatki, kot so: analiza razpoloženja, zaznavanje neželene pošte in klasifikacija besedila.
Ta algoritem se imenuje "naiven" zaradi predpostavke, da so vse spremenljivke nabora podatkov neodvisne, kar ni vedno tako.
Preden nadaljujemo z razlago, kako deluje Naive bayes, poskrbimo, da razumemo naslednje:
Pogojna verjetnost
Naivni Bayesov algoritem temelji na Bayesovem izreku, ki temelji na pogojni verjetnosti: to je verjetnost pojava dogodka A glede na to, da se je dogodek B že zgodil.
Primer:
Imejmo dva kozarca z barvnimi kroglicami:
-
Kozarec 1 ima 3 modre kroglice, 2 rdeči krogli in 4 zelene kroglice.
-
Jar 2 ima 1 modro kroglo, 4 rdeče krogle in 3 zelene krogle.
Izračunati želimo verjetnost, da naključno izberemo modro kroglico iz enega od kozarcev
Ni nič drugega kot vsota verjetnosti izbire modre krogle iz Jar1 ali Jar2.
Zdaj želimo izračunati verjetnost, da izberemo modro kroglico, glede na to, da smo izbrali Jar1:
Nazadnje želimo izračunati verjetnost, da izberemo Jar1, glede na to, da smo izvlekli modro kroglico. Tukaj uporabljamo Bayesov izrek, ki je naveden kot naslednji:
Naivna Bayesova klasifikacija
V naivnem Bayesovem klasifikatorju želimo najti razred, ki maksimira pogojno verjetnost glede na vhodni vektor X; tako lahko Naive Bayes formuliramo takole:
Z uporabo Bayesovega izreka funkcija postane:
V tej formulaciji je enostavno izračunati P(Ci), ki ni nič drugega kot verjetnost razreda Ci, in enostavno je izračunati P(x), ki je verjetnost, da se zgodi dogodek x.
Težko je izračunati P(x|Ci); verjetnost dogodka x glede na razred Ci. Da bi to dodatno poenostavili, moramo predpostaviti, da so vse vhodne spremenljivke neodvisne; tako lahko zapišemo:
Pravzaprav zaradi te predpostavke ta klasifikator imenujemo "naiven", ker ne moremo vedno zagotoviti neodvisnosti vhodnih spremenljivk. Naivni Bayesov klasifikator postane:
Pravzaprav lahko to formulacijo dodatno poenostavimo tako, da odstranimo P(x), ker je enak za vse razrede:
Zdaj pa si oglejmo primer:
| Vreme | Čas | Dan v tednu | Večerja |
| ------- | -------- | --------------- | ------ |
| Počisti | Večer | Vikend | Kuharji |
| Oblačno | Noč | Delovni dan | Naročila |
| Deževno | Noč | Delovni dan | Naročila |
| Deževno | Opoldne | Delovni dan | Naročila |
| Oblačno | Opoldne | Vikend | Kuharji |
| Počisti | Noč | Vikend | Kuharji |
| zasneženo | Večer | Vikend | Naročila |
| Počisti | Noč | Delovni dan | Kuharji |
| Počisti | Polnoč | Vikend | Naročila |
Tukaj imamo majhen nabor podatkov, ki vsebuje 3 vhodne spremenljivke: vreme, čas in dan v tednu ter eno ciljno spremenljivko: »Večerja«, ki označuje, ali oseba kuha ali naroči večerjo. Radi bi našli razred vnosa x={Jasno, Večer, Vikend}:
Izračunati moramo pogojno verjetnost za razred »Kuharji« in razred »Naročila« glede na vnos x={Jasno, Večer, Vikend}. Napovedani razred je tisti, ki ima največjo pogojno verjetnost.
Začnemo z izračunom pogojne verjetnosti razreda "Kuharji":
Zdaj izračunamo vsako pogojno verjetnost zase:
Verjetnost weather=»Clear« glede na to, da je razred »Cooks«, je število vrstic z vremenom »Clear« in razredom »Cooks« glede na skupno število vrstic z razredom »Cooks«
Enako velja za druge pogojne verjetnosti:
Zdaj je verjetnost P(Cooks) število vrstic z razredom "Cooks" glede na skupno število vrstic:
Zdaj izračunamo produkt teh verjetnosti:
To je bilo za razred "Kuharji", zdaj moramo storiti enako za razred "Naročila":
Izračunamo posamezne verjetnosti:
In končno izračunamo produkt verjetnosti:
Končno vzamemo razred z največjo verjetnostjo, to je razred "Kuharji":
Prednosti in omejitve tega algoritma
Prednosti:
-
Je zelo hiter klasifikator.
-
Je enostaven za izvedbo.
-
Ni faze usposabljanja, ampak je samo sklepanje.
-
Za sklepanje ne potrebuje veliko podatkov.
Omejitve:
- Naivni Bayes predpostavlja, da so vhodne spremenljivke neodvisne, kar ni vedno res.
- Naivni Bayes trpi za problemom ničelne frekvence: to je, ko vhodni spremenljivki dodeli ničelno verjetnost. To bo izničilo vso pogojno verjetnost P(C|x). En trik, da se temu izognete, je uporaba minimalne frekvence 1 (namesto 0) za vse spremenljivke.
Vaja
Tukaj je podatkovni okvir istega nabora podatkov, kot smo ga videli v primeru.
Vaša naloga je, da sami implementirate Naive Bayes z uporabo pythona:
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
Rešitev
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