Naive Bayes algoritmo įvadas

ML
ML algoritmas
klasifikacija
Naive Bayes algoritmo įvadas cover image

Lentelė:

Įvadas

Sąlyginė tikimybė

Naive Bayes klasifikacija

Šio algoritmo pranašumai ir apribojimai

Įvadas

Naive Bayes yra klasifikavimo mašininio mokymosi algoritmas, pagrįstas Bayes teorema. Tai labai efektyvu, ypač dirbant su tekstiniais duomenimis, tokiais kaip: Sentimentų analizė, Šlamšto aptikimas ir teksto klasifikavimas.

Šis algoritmas vadinamas „naiviu“, nes daroma prielaida, kad visi duomenų rinkinio kintamieji yra nepriklausomi, o tai ne visada.

Prieš toliau aiškindami, kaip veikia Naive Bayes, įsitikinkime, kad suprantame šiuos dalykus:

Sąlyginė tikimybė

Naivus Bayes algoritmas remiasi Bajeso teorema, pagrįsta sąlygine tikimybe: tai įvykio A tikimybė, atsižvelgiant į tai, kad įvykis B jau įvyko.

Pavyzdys:

Turime du stiklainius, kuriuose yra spalvoti rutuliukai:

  • 1 stiklainyje yra 3 mėlyni, 2 raudoni ir 4 žali rutuliai.

  • 2 stiklainyje yra 1 mėlynas rutuliukas, 4 raudoni rutuliai ir 3 žali rutuliai.

Norime apskaičiuoti tikimybę atsitiktinai pasirinkti mėlyną rutulį iš vieno iš stiklainių

equations

Tai ne kas kita, kaip mėlyno kamuoliuko pasirinkimo iš Jar1 arba Jar2 tikimybių suma.

Dabar norime apskaičiuoti mėlyno rutulio pasirinkimo tikimybę, atsižvelgiant į tai, kad pasirinkome Jar1:

equations

Galiausiai norime apskaičiuoti Jar1 pasirinkimo tikimybę, atsižvelgiant į tai, kad nupiešėme mėlyną rutulį. Čia mes naudojame Bayes teoremą, kuri yra tokia:

equations

equations

Naivi Bayes klasifikacija

Naive Bayes klasifikatoriuje norime rasti klasę, kuri maksimaliai padidina sąlyginę tikimybę, atsižvelgiant į įvesties vektorių X; Taigi Naive Bayes galima suformuluoti taip:

equations

Naudojant Bayes teoremą, funkcija tampa:

equations

Šioje formuluotėje nesunku apskaičiuoti P(Ci), kuris yra ne kas kita, kaip Ci klasės tikimybė, ir lengva apskaičiuoti P(x), kuris yra įvykio x tikimybė.

Sunku apskaičiuoti P(x|Ci); įvykio x tikimybė, duota klasei Ci. Norėdami tai dar labiau supaprastinti, turime daryti prielaidą, kad visi įvesties kintamieji yra nepriklausomi; taigi galime rašyti:

equations

Ir iš tikrųjų dėl šios prielaidos šį klasifikatorių vadiname „naivu“, nes ne visada galime garantuoti įvesties kintamųjų nepriklausomumą. Naive Bayes klasifikatorius tampa:

equations

Tiesą sakant, mes galime dar labiau supaprastinti šią formuluotę, pašalindami P (x), nes ji yra vienoda visoms klasėms:

equations

Dabar pažvelkime į pavyzdį:

| Orai | Laikas | Savaitės diena | Vakarienė |

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

| Išvalyti | Vakaras | Savaitgalis | Virėjai |

| Debesuota | Naktis | Savaitės diena | Užsakymai |

| Lietingas | Naktis | Savaitės diena | Užsakymai |

| Lietingas | Vidurdienis | Savaitės diena | Užsakymai |

| Debesuota | Vidurdienis | Savaitgalis | Virėjai |

| Išvalyti | Naktis | Savaitgalis | Virėjai |

| Snieguotas | Vakaras | Savaitgalis | Užsakymai |

| Išvalyti | Naktis | Savaitės diena | Virėjai |

| Išvalyti | Vidurnaktis | Savaitgalis | Užsakymai |

Čia turime nedidelį duomenų rinkinį, kuriame yra 3 įvesties kintamieji: oras, laikas ir savaitės diena bei vienas tikslinis kintamasis: „Vakarienė“, nurodantis, ar asmuo gamina ar užsisako vakarienę . Norėtume rasti įvesties x={Clear, Evening, Weekend} klasę:

equations

Turime apskaičiuoti sąlyginę tikimybę klasei „Virėjai“ ir klasei „Užsakymai“, gavus įvestį x={Clear, Evening, Weekend}. Numatoma klasė yra ta, kuri turi didžiausią sąlyginę tikimybę.

Pradedame apskaičiuodami sąlyginę klasės „Virėjai“ tikimybę:

equations

Dabar apskaičiuojame kiekvieną sąlyginę tikimybę atskirai:

Oro tikimybė = „Aišku“, atsižvelgiant į tai, kad klasė yra „Virėjai“ yra eilučių su oru „Giedru“ ir klase „Virėjai“ skaičius per bendrą eilučių skaičių su klase „Virėjai“

equations

Tas pats pasakytina ir apie kitas sąlygines tikimybes:

equations

Dabar tikimybei P (Cooks) tai yra eilučių su klase „Cooks“ skaičius per bendrą eilučių skaičių:

equations

Dabar apskaičiuojame šių tikimybių sandaugą:

equations

Tai buvo skirta klasei „Virėjai“, dabar tą patį turime padaryti ir „Užsakymų“ klasei:

equations

Skaičiuojame individualias tikimybes:

equations

Ir galiausiai apskaičiuojame tikimybių sandaugą:

equations

Galiausiai paimame klasę su didžiausia tikimybe, kuri yra „Virėjai“:

equations

equations

equations

equations

equations

equations

Šio algoritmo privalumai ir apribojimai

Privalumai:

– Tai labai greitas klasifikatorius.

– Tai lengva įgyvendinti.

  • Treniruočių etapo nėra, tai tik išvados.

  • Norint padaryti išvadas, nereikia daug duomenų.

Apribojimai:

  • Naive Bayes daro prielaidą, kad įvesties kintamieji yra nepriklausomi, o tai ne visada tiesa.

  • Naive Bayes kenčia nuo nulinio dažnio problemos: kai jis įvesties kintamajam priskiria nulinę tikimybę. Tai pašalins visą sąlyginę tikimybę P(C|x). Vienas iš gudrybių, kaip to išvengti, yra naudoti minimalų dažnį 1 (vietoj 0) visiems kintamiesiems.

Pratimas

Čia yra to paties duomenų rinkinio, kurį matėme pavyzdyje, duomenų rėmelis.

Jūsų užduotis yra pačiam įdiegti Naive Bayes naudojant 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

Sprendimas


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

Karjeros paslaugos

Contact Section background image

Palaikykime ryšį

Code Labs Academy © 2024 Visos teisės saugomos.