Uvod v naivni Bayesov algoritem

ML
algoritem ML
klasifikacija
Uvod v naivni Bayesov algoritem cover image

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

equations

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:

equations

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:

equations

equations

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:

equations

Z uporabo Bayesovega izreka funkcija postane:

equations

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:

equations

Pravzaprav zaradi te predpostavke ta klasifikator imenujemo "naiven", ker ne moremo vedno zagotoviti neodvisnosti vhodnih spremenljivk. Naivni Bayesov klasifikator postane:

equations

Pravzaprav lahko to formulacijo dodatno poenostavimo tako, da odstranimo P(x), ker je enak za vse razrede:

equations

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

equations

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

equations

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«

equations

Enako velja za druge pogojne verjetnosti:

equations

Zdaj je verjetnost P(Cooks) število vrstic z razredom "Cooks" glede na skupno število vrstic:

equations

Zdaj izračunamo produkt teh verjetnosti:

equations

To je bilo za razred "Kuharji", zdaj moramo storiti enako za razred "Naročila":

equations

Izračunamo posamezne verjetnosti:

equations

In končno izračunamo produkt verjetnosti:

equations

Končno vzamemo razred z največjo verjetnostjo, to je razred "Kuharji":

equations

equations

equations

equations

equations

equations

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



Career Services background pattern

Karierne storitve

Contact Section background image

Ostanimo v stiku

Code Labs Academy © 2024 Vse pravice pridržane.