Introducció a l'Algoritme Naive Bayes

ML
algorisme ML
classificació
Introducció a l'Algoritme Naive Bayes cover image

Taula:

Introducció

Naive Bayes és un algorisme d'aprenentatge automàtic de classificació que es basa en el teorema de Bayes. És molt eficient sobretot quan es tracta de dades textuals com: anàlisi de sentiments, detecció de correu brossa i classificació de text.

Aquest algorisme s'anomena "Naïf" a causa del supòsit que totes les variables del conjunt de dades són independents, cosa que no sempre és així.

Abans d'explicar com funciona Naive bayes, assegurem-nos que entenem el següent:

Probabilitat condicional

L'algorisme de Bayes ingenu es basa en el teorema de Bayes que es basa en la probabilitat condicional: és la probabilitat que es produeixi un esdeveniment A donat que ja s'ha produït un esdeveniment B.

Exemple:

Tinguem dos pots que contenen boles de colors:

  • El pot 1 té 3 boles blaves, 2 boles vermelles i 4 boles verdes.

  • El pot 2 té 1 bola blava, 4 boles vermelles i 3 boles verdes.

Volem calcular la probabilitat de seleccionar aleatòriament una bola blava d'un dels pots

equations

No és altre que la suma de les probabilitats de seleccionar una bola blava del Jar1 o Jar2.

Ara, volem calcular la probabilitat de seleccionar una bola blava donat que hem seleccionat Jar1:

equations

Finalment, volem calcular la probabilitat de seleccionar Jar1 donat que hem dibuixat una bola blava. Aquí fem servir el teorema de Bayes que s'enuncia de la següent manera:

equations

equations

Classificació Bayes ingenua

En el classificador Naive Bayes, volem trobar la classe que maximitza la probabilitat condicional donat el vector d'entrada X; per tant, Naive Bayes es pot formular de la següent manera:

equations

Amb l'ús del teorema de Bayes, la funció es converteix en:

equations

En aquesta formulació, és fàcil calcular P(Ci) que no és altra que la probabilitat de la classe Ci, i és fàcil calcular P(x) que és la probabilitat que es produeixi l'esdeveniment x.

El que és difícil de calcular és P(x|Ci); la probabilitat de l'esdeveniment x donada la classe Ci. Per simplificar encara més això, hem de suposar que totes les variables d'entrada són independents; així, podem escriure:

equations

I és en realitat per aquesta suposició que anomenem aquest classificador "Naïf", perquè no sempre podem garantir la independència de les variables d'entrada. El classificador Naive Bayes es converteix en:

equations

De fet, podem simplificar encara més aquesta formulació eliminant P(x), perquè és igual per a totes les classes:

equations

Ara, fem una ullada a un exemple:

| Temps | Temps | Dia de la setmana | sopar |

| ------- | -------- | --------------- | ------ |

| Clar | tarda | Cap de setmana | Cuiners |

| Ennuvolat | Nit | Dia laborable | Comandes |

| Pluviós | Nit | Dia laborable | Comandes |

| Pluviós | migdia | Dia laborable | Comandes |

| Ennuvolat | migdia | Cap de setmana | Cuiners |

| Clar | Nit | Cap de setmana | Cuiners |

| nevat | tarda | Cap de setmana | Comandes |

| Clar | Nit | Dia laborable | Cuiners |

| Clar | Mitjanit | Cap de setmana | Comandes |

Aquí, tenim un petit conjunt de dades que conté 3 variables d'entrada: el temps, l'hora i el dia de la setmana, i una variable objectiu: "Sopar" que indica si una persona cuina o demana el seu sopar . Ens agradaria trobar la classe de l'entrada x={Clear, Evening, Weekend}:

equations

Hem de calcular la probabilitat condicional per a la classe "Cuiners" i la classe "Comandes" donada l'entrada x={Clear, Evening, Weekend}. La classe predita és la que té la probabilitat condicional més alta.

Comencem calculant la probabilitat condicional de la classe "Cuiners":

equations

Ara calculem cada probabilitat condicional per si sola:

La probabilitat de temps = "Clear" donat que la classe és "Cuiners" és el nombre de línies amb el temps "Clear" i la classe "Cuiners" sobre el nombre total de línies amb la classe "Cuiners"

equations

El mateix passa amb les altres probabilitats condicionals:

equations

Ara, per a la probabilitat P(Cuiners), és el nombre de línies amb la classe "Cuiners" sobre el nombre total de línies:

equations

Ara calculem el producte d'aquestes probabilitats:

equations

Això era per a la classe "Cuiners", ara hem de fer el mateix per a la classe "Comandes":

equations

Calculem les probabilitats individuals:

equations

I finalment calculem el producte de les probabilitats:

equations

Finalment, agafem la classe amb més probabilitat que és la classe "Cuiners":

equations

equations

equations

equations

equations

equations

Avantatges i limitacions d'aquest algorisme

Avantatges:

  • És un classificador molt ràpid.

  • És fàcil d'implementar.

  • No hi ha fase d'entrenament, però només és inferència.

  • No requereix moltes dades per fer inferències.

Limitacions:

  • Naive Bayes assumeix que les variables d'entrada són independents, cosa que no sempre és certa.

  • Naive Bayes pateix el problema de la freqüència zero: és quan assigna una probabilitat zero a una variable d'entrada. Això eliminarà tota la probabilitat condicional P(C|x). Un truc per evitar-ho és utilitzar una freqüència mínima d'1 (en lloc de 0) a totes les variables.

Exercici

Aquí teniu el marc de dades del mateix conjunt de dades que hem vist a l'exemple.

La vostra tasca és implementar Naive Bayes vosaltres mateixos mitjançant 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

Solució


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

Serveis de carrera

Contact Section background image

Seguim en contacte

Code Labs Academy © 2024 Tots els drets reservats.