Johdatus Naive Bayes -algoritmiin

ML
ML-algoritmi
luokitus
Johdatus Naive Bayes -algoritmiin cover image

Pöytä:

Johdanto

Naive Bayes on luokittelukoneoppimisalgoritmi, joka perustuu Bayesin lauseeseen. Se on erittäin tehokas varsinkin käsiteltäessä tekstitietoja, kuten tunteiden analyysi, roskapostin tunnistus ja tekstin luokittelu.

Tätä algoritmia kutsutaan "Naiiviksi", koska oletetaan, että kaikki tietojoukon muuttujat ovat riippumattomia, mikä ei aina pidä paikkaansa.

Ennen kuin jatkamme Naive Bayesin toiminnan selittämistä, varmista, että ymmärrämme seuraavat asiat:

Ehdollinen todennäköisyys

Naiivi Bayes-algoritmi perustuu Bayesin lauseeseen, joka perustuu ehdolliseen todennäköisyyteen: se on tapahtuman A esiintymistodennäköisyys, jos tapahtuma B on jo tapahtunut.

Esimerkki:

Otetaan kaksi purkkia, joissa on värillisiä palloja:

  • Purkissa 1 on 3 sinistä palloa, 2 punaista palloa ja 4 vihreää palloa.

  • Purkissa 2 on 1 sininen pallo, 4 punaista palloa ja 3 vihreää palloa.

Haluamme laskea todennäköisyyden valita satunnaisesti sininen pallo yhdestä purkista

equations

Se ei ole mikään muu kuin todennäköisyyksien summa valita sininen pallo Jar1:stä tai Jar2:sta.

Nyt haluamme laskea sinisen pallon valitsemisen todennäköisyyden, koska valitsimme Jar1:

equations

Lopuksi haluamme laskea todennäköisyyden valita Jar1, koska piirrettiin sininen pallo. Tässä käytämme Bayesin lausetta, joka esitetään seuraavasti:

equations

equations

Naiivi Bayes-luokitus

Naive Bayes -luokittimessa haluamme löytää luokan, joka maksimoi ehdollisen todennäköisyyden syötevektorilla X; Siten Naive Bayes voidaan muotoilla seuraavasti:

equations

Bayesin lausetta käytettäessä funktiosta tulee:

equations

Tässä formulaatiossa on helppo laskea P(Ci), joka ei ole mikään muu kuin luokan Ci todennäköisyys, ja on helppo laskea P(x), joka on tapahtuman x toteutumisen todennäköisyys.

Vaikea laskea on P(x|Ci); tapahtuman x todennäköisyys luokassa Ci. Tämän yksinkertaistamiseksi on oletettava, että kaikki syötemuuttujat ovat riippumattomia; joten voimme kirjoittaa:

equations

Ja itse asiassa tämän oletuksen takia kutsumme tätä luokittelijaa "Naiiviksi", koska emme voi aina taata syötemuuttujien riippumattomuutta. Naive Bayes -luokittajasta tulee:

equations

Itse asiassa voimme yksinkertaistaa tätä muotoilua edelleen poistamalla P(x), koska se on sama kaikille luokille:

equations

Katsotaanpa nyt esimerkkiä:

| Sää | Aika | Viikonpäivä | Illallinen |

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

| Tyhjennä | Ilta | Viikonloppu | Kokit |

| Pilvistä | Yö | Arkipäivä | Tilaukset |

| Sateinen | Yö | Arkipäivä | Tilaukset |

| Sateinen | Keskipäivä | Arkipäivä | Tilaukset |

| Pilvistä | Keskipäivä | Viikonloppu | Kokit |

| Tyhjennä | Yö | Viikonloppu | Kokit |

| Luminen | Ilta | Viikonloppu | Tilaukset |

| Tyhjennä | Yö | Arkipäivä | Kokit |

| Tyhjennä | Keskiyö | Viikonloppu | Tilaukset |

Tässä meillä on pieni tietojoukko, joka sisältää kolme syöttömuuttujaa: sää, aika ja viikonpäivä sekä yksi kohdemuuttuja: "Dinner", joka osoittaa, valmistaako henkilö vai tilaako hän illallisen . Haluamme löytää syötteen x={Clear, Evening, Weekend} luokan:

equations

Meidän on laskettava ehdollinen todennäköisyys luokalle "Kokit" ja luokille "Tilaukset" syötteellä x={Telkeä, ilta, viikonloppu}. Ennustettu luokka on se, jolla on suurin ehdollinen todennäköisyys.

Aloitamme laskemalla luokan "Kokit" ehdollisen todennäköisyyden:

equations

Nyt laskemme jokaisen ehdollisen todennäköisyyden erikseen:

Todennäköisyys, että sää = ”Selkeä” ottaen huomioon, että luokka on ”Kokit”, on niiden rivien lukumäärä, joissa sää on ”Clear” ja luokka ”Kokit” luokan ”Kokit” rivien kokonaismäärästä.

equations

Sama koskee muita ehdollisia todennäköisyyksiä:

equations

Nyt todennäköisyydellä P(Cooks) se on niiden rivien lukumäärä, joiden luokka on "Cooks" rivien kokonaismäärästä:

equations

Nyt laskemme näiden todennäköisyyksien tulon:

equations

Se oli "Kokkien" luokalle, nyt meidän on tehtävä sama luokalle "Tilaukset":

equations

Laskemme yksilölliset todennäköisyydet:

equations

Ja lopuksi laskemme todennäköisyyksien tulon:

equations

Lopuksi otetaan luokka, jolla on suurin todennäköisyys, joka on luokka "Kokit":

equations

equations

equations

equations

equations

equations

Tämän algoritmin edut ja rajoitukset

Edut:

– Se on erittäin nopea luokitin.

– Se on helppo toteuttaa.

  • Ei ole harjoitusvaihetta, vaan se on vain päättely.

  • Se ei vaadi paljon dataa johtopäätösten tekemiseen.

Rajoitukset:

  • Naive Bayes olettaa, että syötemuuttujat ovat riippumattomia, mikä ei aina pidä paikkaansa.

  • Naive Bayes kärsii nollataajuuden ongelmasta: se on silloin, kun se määrittää syötemuuttujalle nollatodennäköisyyden. Tämä nollaa kaiken ehdollisen todennäköisyyden P(C|x). Yksi temppu tämän välttämiseksi on käyttää minimitaajuutta 1 (0 sijasta) kaikille muuttujille.

Harjoittelu

Tässä on saman tietojoukon datakehys, jonka olemme nähneet esimerkissä.

Sinun tehtäväsi on toteuttaa Naive Bayes itse pythonilla:

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

Ratkaisu


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

Urapalvelut

Contact Section background image

Pidetään yhteyttä

Code Labs Academy © 2024 Kaikki oikeudet pidätetään.