Lentelė:
– Įvadas
– Š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ų
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:
Galiausiai norime apskaičiuoti Jar1 pasirinkimo tikimybę, atsižvelgiant į tai, kad nupiešėme mėlyną rutulį. Čia mes naudojame Bayes teoremą, kuri yra tokia:
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:
Naudojant Bayes teoremą, funkcija tampa:
Š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:
Ir iš tikrųjų dėl šios prielaidos šį klasifikatorių vadiname „naivu“, nes ne visada galime garantuoti įvesties kintamųjų nepriklausomumą. Naive Bayes klasifikatorius tampa:
Tiesą sakant, mes galime dar labiau supaprastinti šią formuluotę, pašalindami P (x), nes ji yra vienoda visoms klasėms:
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ę:
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ę:
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“
Tas pats pasakytina ir apie kitas sąlygines tikimybes:
Dabar tikimybei P (Cooks) tai yra eilučių su klase „Cooks“ skaičius per bendrą eilučių skaičių:
Dabar apskaičiuojame šių tikimybių sandaugą:
Tai buvo skirta klasei „Virėjai“, dabar tą patį turime padaryti ir „Užsakymų“ klasei:
Skaičiuojame individualias tikimybes:
Ir galiausiai apskaičiuojame tikimybių sandaugą:
Galiausiai paimame klasę su didžiausia tikimybe, kuri yra „Virėjai“:
Š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