Jelentkezzen az új Data Science & AI és Cybersecurity Részmunkaidős kohorszok

Bevezetés a naiv Bayes algoritmusba

ML
ML algoritmus
osztályozás
Bevezetés a naiv Bayes algoritmusba cover image

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

equations

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:

equations

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:

equations

equations

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:

equations

A Bayes-tétel használatával a függvény a következő lesz:

equations

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:

equations

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:

equations

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:

equations

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:

equations

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:

equations

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.

equations

Ugyanez vonatkozik a többi feltételes valószínűségre is:

equations

Most pedig a P(Cooks) valószínűséghez a „Cooks” osztályú sorok száma az összes sorszámhoz képest:

equations

Most kiszámítjuk ezeknek a valószínűségeknek a szorzatát:

equations

Ez a „Szakácsok” osztálynál volt, most ugyanezt kell tennünk a „Rendelések” osztálynál is:

equations

Kiszámoljuk az egyéni valószínűségeket:

equations

És végül kiszámítjuk a valószínűségek szorzatát:

equations

Végül a legnagyobb valószínűségű osztályt vesszük, amely a „Szakácsok” osztály:

equations

equations

equations

equations

equations

equations

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



Career Services background pattern

Karrier szolgáltatások

Contact Section background image

Maradjunk kapcsolatban

Code Labs Academy © 2024 Minden jog fenntartva.