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
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:
Lopuksi haluamme laskea todennäköisyyden valita Jar1, koska piirrettiin sininen pallo. Tässä käytämme Bayesin lausetta, joka esitetään seuraavasti:
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:
Bayesin lausetta käytettäessä funktiosta tulee:
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:
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:
Itse asiassa voimme yksinkertaistaa tätä muotoilua edelleen poistamalla P(x), koska se on sama kaikille luokille:
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:
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:
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ä.
Sama koskee muita ehdollisia todennäköisyyksiä:
Nyt todennäköisyydellä P(Cooks) se on niiden rivien lukumäärä, joiden luokka on "Cooks" rivien kokonaismäärästä:
Nyt laskemme näiden todennäköisyyksien tulon:
Se oli "Kokkien" luokalle, nyt meidän on tehtävä sama luokalle "Tilaukset":
Laskemme yksilölliset todennäköisyydet:
Ja lopuksi laskemme todennäköisyyksien tulon:
Lopuksi otetaan luokka, jolla on suurin todennäköisyys, joka on luokka "Kokit":
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