Asztal:
Intro
A Naive Bayes egy osztályozó gépi tanulási algoritmus, amely a Bayes-tételen alapul. Nagyon hatékony, különösen akkor, ha olyan szöveges adatokkal foglalkozik, mint például: érzelmek elemzése, spamészlelés és szövegosztályozás.
Ezt az algoritmust „naivnak” nevezik, mert feltételezik, hogy az összes adatkészlet-változó független, ami nem mindig van így.
Mielőtt tovább magyaráznánk a Naive bayes működését, győződjünk meg arról, hogy megértjük a következőket:
Feltételes valószínűség
A naiv Bayes-algoritmus a Bayes-tételen alapul, amely a feltételes valószínűségen alapul: ez egy A esemény bekövetkezésének valószínűsége, feltéve, hogy egy B esemény már megtörtént.
Példa:
Legyen két üvegünk, amelyek színes golyókat tartalmaznak:
-
Az 1. tégelyben 3 kék, 2 piros és 4 zöld golyó található.
-
A 2-es üvegben 1 kék, 4 piros és 3 zöld golyó található.
Ki akarjuk számítani annak a valószínűségét, hogy véletlenszerűen kiválasztunk egy kék golyót az egyik üvegből
Ez nem más, mint a Jar1 vagy Jar2 kék golyó kiválasztásának valószínűségeinek összege.
Most ki akarjuk számítani a kék golyó kiválasztásának valószínűségét, mivel az 1-et választottuk:
Végül ki akarjuk számítani a Jar1 kiválasztásának valószínűségét, mivel kék golyót húztunk. Itt a Bayes-tételt használjuk, amely a következőképpen van megfogalmazva:
Naiv Bayes besorolás
A Naive Bayes osztályozóban meg akarjuk találni azt az osztályt, amely maximalizálja a feltételes valószínűséget az X bemeneti vektor mellett; így a Naive Bayes a következőképpen fogalmazható meg:
A Bayes-tétel használatával a függvény a következő lesz:
Ebben a megfogalmazásban könnyen kiszámítható P(Ci), amely nem más, mint a Ci osztály valószínűsége, és könnyen kiszámítható P(x), amely az x esemény bekövetkezésének valószínűsége.
Amit nehéz kiszámítani, az a P(x|Ci); az x esemény valószínűsége a Ci osztályban. Ennek további egyszerűsítésére fel kell tételeznünk, hogy az összes bemeneti változó független; így írhatjuk:
Valójában ennek a feltevésnek köszönhető, hogy ezt az osztályozót „naivnak” nevezzük, mert nem mindig tudjuk garantálni a bemeneti változók függetlenségét. A Naive Bayes osztályozó a következőképpen alakul:
Valójában tovább egyszerűsíthetjük ezt a megfogalmazást a P(x) kiiktatásával, mert az minden osztályra ugyanaz:
Most pedig nézzünk egy példát:
| Időjárás | Idő | A hét napja | Vacsora |
| ------- | -------- | --------------- | ------ |
| Tiszta | Este | Hétvége | Szakácsok |
| Felhős | Éjszaka | Hétköznap | Megrendelések |
| Esős | Éjszaka | Hétköznap | Megrendelések |
| Esős | dél | Hétköznap | Megrendelések |
| Felhős | dél | Hétvége | Szakácsok |
| Tiszta | Éjszaka | Hétvége | Szakácsok |
| Havas | Este | Hétvége | Megrendelések |
| Tiszta | Éjszaka | Hétköznap | Szakácsok |
| Tiszta | Éjfél | Hétvége | Megrendelések |
Itt van egy kis adatkészletünk, amely 3 bemeneti változót tartalmaz: időjárás, idő és hét napja, valamint egy célváltozó: „Vacsora”, amely jelzi, hogy egy személy főz-e vagy megrendeli-e a vacsoráját . Szeretnénk megtalálni az x={Tiszta, Este, Hétvége} bemenet osztályát:
Ki kell számolnunk a „Főzők” és a „Rendelések” osztály feltételes valószínűségét az x={Tiszta, este, hétvége} bemenet mellett. Az előrejelzett osztály az, amelyik a legnagyobb feltételes valószínűséggel rendelkezik.
Kezdjük a „Szakácsok” osztály feltételes valószínűségének kiszámításával:
Most mindegyik feltételes valószínűséget külön számítjuk ki:
Az időjárás valószínűsége = „Tiszta”, tekintettel arra, hogy az osztály „Szakácsok”, a „Tiszta” időjárással és a „Szakácsok” osztályú sorok száma a „Cooks” osztályú sorok teljes számához képest.
Ugyanez vonatkozik a többi feltételes valószínűségre is:
Most pedig a P(Cooks) valószínűséghez a „Cooks” osztályú sorok száma az összes sorszámhoz képest:
Most kiszámítjuk ezeknek a valószínűségeknek a szorzatát:
Ez a „Szakácsok” osztálynál volt, most ugyanezt kell tennünk a „Rendelések” osztálynál is:
Kiszámoljuk az egyéni valószínűségeket:
És végül kiszámítjuk a valószínűségek szorzatát:
Végül a legnagyobb valószínűségű osztályt vesszük, amely a „Szakácsok” osztály:
Ennek az algoritmusnak az előnyei és korlátai
Előnyök:
-
Ez egy nagyon gyors osztályozó.
-
Könnyen megvalósítható.
-
Nincs edzési szakasz, de ez csak következtetés.
-
Nincs szükség sok adatra a következtetések levonásához.
Korlátozások:
- Naive Bayes feltételezi, hogy a bemeneti változók függetlenek, ami nem mindig igaz.
- A naiv Bayes a nulla frekvencia problémájától szenved: ez az, amikor nulla valószínűséget rendel egy bemeneti változóhoz. Ez nullázza az összes P(C|x) feltételes valószínűséget. Ennek elkerülésére az egyik trükk az, hogy az összes változóhoz 1-es minimális gyakoriságot (0 helyett) használunk.
Gyakorlat
Itt látható ugyanannak az adathalmaznak az adatkerete, amelyet a példában láttunk.
Az Ön feladata, hogy saját maga implementálja a Naive Bayest a python segítségével:
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
Megoldás
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