Tabula:
Ievads
Naive Bayes ir klasifikācijas mašīnmācīšanās algoritms, kura pamatā ir Beijesa teorēma. Tas ir ļoti efektīvs, jo īpaši, strādājot ar teksta datiem, piemēram: sentimenta analīzi, surogātpasta atklāšanu un teksta klasifikāciju.
Šo algoritmu sauc par “naivu”, jo tiek pieņemts, ka visi datu kopas mainīgie ir neatkarīgi, kas ne vienmēr tā ir.
Pirms turpināt skaidrot, kā darbojas Naive bayes, pārliecinieties, vai mēs saprotam tālāk norādīto.
Nosacītā varbūtība
Naivai Beijesa algoritma pamatā ir Beijesa teorēma, kas balstās uz nosacīto varbūtību: tā ir notikuma A iestāšanās varbūtība, ja notikums B jau ir noticis.
Piemērs:
Ņemsim divas burkas, kurās ir krāsainas bumbiņas:
-
- burkā ir 3 zilas bumbiņas, 2 sarkanas bumbiņas un 4 zaļas bumbiņas.
-
- burkā ir 1 zila bumbiņa, 4 sarkanas bumbiņas un 3 zaļas bumbiņas.
Mēs vēlamies aprēķināt varbūtību, ka no vienas burkas nejauši izvēlēsies zilu bumbiņu
Tā nav nekas cits kā zilas bumbiņas atlases varbūtību summa no Jar1 vai Jar2.
Tagad mēs vēlamies aprēķināt zilās bumbiņas atlases varbūtību, ņemot vērā, ka mēs izvēlējāmies Jar1:
Visbeidzot, mēs vēlamies aprēķināt Jar1 atlases varbūtību, ņemot vērā, ka mēs uzzīmējām zilu bumbiņu. Šeit mēs izmantojam Bayes teorēmu, kas ir norādīta šādi:
Naivai Beijesa klasifikācija
Naivajā Bayes klasifikatorā mēs vēlamies atrast klasi, kas maksimāli palielina nosacīto varbūtību, ņemot vērā ievades vektoru X; tādējādi Naive Bayes var formulēt šādi:
Izmantojot Bayes teorēmu, funkcija kļūst:
Šajā formulējumā ir viegli aprēķināt P(Ci), kas nav nekas cits kā klases Ci varbūtība, un ir viegli aprēķināt P(x), kas ir notikuma x varbūtība.
Grūti aprēķināt ir P(x|Ci); notikuma x varbūtība, kas dota klasei Ci. Lai to vēl vairāk vienkāršotu, jāpieņem, ka visi ievades mainīgie ir neatkarīgi; tātad mēs varam rakstīt:
Un patiesībā šī pieņēmuma dēļ mēs šo klasifikatoru saucam par "naivu", jo mēs ne vienmēr varam garantēt ievades mainīgo neatkarību. Naive Bayes klasifikators kļūst:
Faktiski mēs varam vēl vairāk vienkāršot šo formulējumu, izslēdzot P(x), jo tas ir vienāds visām klasēm:
Tagad apskatīsim piemēru:
| Laikapstākļi | Laiks | Nedēļas diena | Vakariņas |
| ------- | -------- | ---------------- | ------ |
| Notīrīt | Vakars | Nedēļas nogale | Pavāri |
| Mākoņains | Nakts | Darba diena | Pasūtījumi |
| Lietains | Nakts | Darba diena | Pasūtījumi |
| Lietains | Pusdienas | Darba diena | Pasūtījumi |
| Mākoņains | Pusdienas | Nedēļas nogale | Pavāri |
| Notīrīt | Nakts | Nedēļas nogale | Pavāri |
| Sniega | Vakars | Nedēļas nogale | Pasūtījumi |
| Notīrīt | Nakts | Darba diena | Pavāri |
| Notīrīt | Pusnakts | Nedēļas nogale | Pasūtījumi |
Šeit ir neliela datu kopa, kurā ir 3 ievades mainīgie: laikapstākļi, laiks un nedēļas diena, kā arī viens mērķa mainīgais: “Vakariņas”, kas norāda, vai persona gatavo vai pasūta vakariņas . Mēs vēlamies atrast ievades x={Clear, Evening, Weekend} klasi:
Mums ir jāaprēķina nosacītā varbūtība klasei “Pavāri” un klasei “Pasūtījumi”, ņemot vērā ievadi x={Clear, Evening, Weekend}. Paredzētā klase ir tā, kurai ir vislielākā nosacītā varbūtība.
Mēs sākam, aprēķinot klases “Pavāri” nosacīto varbūtību:
Tagad mēs aprēķinām katru nosacīto varbūtību atsevišķi:
Laikapstākļu varbūtība =” Skaidrs”, ņemot vērā, ka klase ir “Pavāri”, ir rindu skaits ar laikapstākļiem “Clear” un klasi “Pavāri” no kopējā rindu skaita ar klasi “Pavāri”
Tas pats attiecas uz citām nosacītajām varbūtībām:
Tagad attiecībā uz varbūtību P (Pavāri) tas ir rindu skaits ar klasi “Pavāri” no kopējā rindu skaita:
Tagad mēs aprēķinām šo varbūtību reizinājumu:
Tas bija klasei “Pavāri”, tagad tas pats jādara klasei “Pasūtījumi”:
Mēs aprēķinām individuālās varbūtības:
Un visbeidzot mēs aprēķinām varbūtību reizinājumu:
Visbeidzot, mēs ņemam klasi ar vislielāko varbūtību, kas ir klase “Pavāri”:
Šī algoritma priekšrocības un ierobežojumi
Priekšrocības:
- Tas ir ļoti ātrs klasifikators.
– To ir viegli īstenot.
-
Nav apmācības fāzes, bet tas ir tikai secinājums.
-
Lai izdarītu secinājumus, nav nepieciešams daudz datu.
Ierobežojumi:
- Naive Bayes pieņem, ka ievades mainīgie ir neatkarīgi, kas ne vienmēr ir taisnība.
- Naive Bayes cieš no nulles frekvences problēmas: tas ir tad, kad tas ievades mainīgajam piešķir nulles varbūtību. Tas nullēs visu nosacīto varbūtību P(C|x). Viens triks, lai no tā izvairītos, ir izmantot minimālo frekvenci 1 (nevis 0) visiem mainīgajiem.
Vingrinājums
Šeit ir tās pašas datu kopas datu rāmis, ko mēs redzējām piemērā.
Tavs uzdevums ir pašam ieviest Naive Bayes, izmantojot 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
Risinājums
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