Ievads Naive Bayes algoritmā

ML
ML algoritms
klasifikācija
Ievads Naive Bayes algoritmā cover image

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:

    1. burkā ir 3 zilas bumbiņas, 2 sarkanas bumbiņas un 4 zaļas bumbiņas.
    1. 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

equations

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:

equations

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:

equations

equations

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:

equations

Izmantojot Bayes teorēmu, funkcija kļūst:

equations

Š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:

equations

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:

equations

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:

equations

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:

equations

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:

equations

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”

equations

Tas pats attiecas uz citām nosacītajām varbūtībām:

equations

Tagad attiecībā uz varbūtību P (Pavāri) tas ir rindu skaits ar klasi “Pavāri” no kopējā rindu skaita:

equations

Tagad mēs aprēķinām šo varbūtību reizinājumu:

equations

Tas bija klasei “Pavāri”, tagad tas pats jādara klasei “Pasūtījumi”:

equations

Mēs aprēķinām individuālās varbūtības:

equations

Un visbeidzot mēs aprēķinām varbūtību reizinājumu:

equations

Visbeidzot, mēs ņemam klasi ar vislielāko varbūtību, kas ir klase “Pavāri”:

equations

equations

equations

equations

equations

equations

Šī 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



Career Services background pattern

Karjeras pakalpojumi

Contact Section background image

Sazināsimies

Code Labs Academy © 2024 Visas tiesības paturētas.