Introdución ao Algoritmo Naive Bayes

ML
ML algoritmo
clasificación
Introdución ao Algoritmo Naive Bayes cover image

Táboa:

##Intro

Naive Bayes é un algoritmo de aprendizaxe automática de clasificación baseado no teorema de Bayes. É moi eficiente, especialmente cando se trata de datos textuais como: análise de sentimentos, detección de spam e clasificación de texto.

Este algoritmo chámase "Inxenuo" pola suposición de que todas as variables do conxunto de datos son independentes, o que non sempre é o caso.

Antes de seguir explicando como funciona Naive bayes, asegúrese de que entendemos o seguinte:

Probabilidade condicional

O algoritmo de Bayes inxenuo baséase no teorema de Bayes que se basea na probabilidade condicional: é a probabilidade de que ocorra un evento A dado que xa ocorreu un evento B.

Exemplo:

Temos dous frascos que conteñan bolas de cores:

  • O bote 1 ten 3 bólas azuis, 2 vermellas e 4 verdes.

  • O bote 2 ten 1 bóla azul, 4 bólas vermellas e 3 bólas verdes.

Queremos calcular a probabilidade de seleccionar aleatoriamente unha bola azul dun dos frascos

equations

Non é outra que a suma das probabilidades de seleccionar unha bola azul de Jar1 ou Jar2.

Agora, queremos calcular a probabilidade de seleccionar unha bola azul dado que seleccionamos Jar1:

equations

Por último, queremos calcular a probabilidade de seleccionar o Jar1 dado que extraemos unha bola azul. Aquí usamos o teorema de Bayes que se enuncia como segue:

equations

equations

Clasificación naive Bayes

No clasificador Naive Bayes, queremos atopar a clase que maximiza a probabilidade condicional dado o vector de entrada X; así, Naive Bayes pódese formular do seguinte xeito:

equations

Co uso do teorema de Bayes, a función pasa a ser:

equations

Nesta formulación, é fácil calcular P(Ci) que non é outra que a probabilidade da clase Ci, e é fácil calcular P(x) que é a probabilidade de que o evento x ocorra.

O que é difícil de calcular é P(x|Ci); a probabilidade do evento x dada a clase Ci. Para simplificar aínda máis isto, necesitamos asumir que todas as variables de entrada son independentes; así, podemos escribir:

equations

E en realidade é por esta suposición que chamamos a este clasificador "Inxenuo", porque non sempre podemos garantir a independencia das variables de entrada. O clasificador de Naive Bayes pasa a ser:

equations

De feito, podemos simplificar aínda máis esta formulación eliminando P(x), porque é o mesmo para todas as clases:

equations

Agora, vexamos un exemplo:

| Tempo | Tempo | Día da semana | Cea |

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

| Limpar | Noite | Fin de semana | Cociñeiras |

| Nubrado | Noite | Día laborable | Pedidos |

| Chuvioso | Noite | Día laborable | Pedidos |

| Chuvioso | Mediodía | Día laborable | Pedidos |

| Nubrado | Mediodía | Fin de semana | Cociñeiras |

| Limpar | Noite | Fin de semana | Cociñeiras |

| Nevado | Noite | Fin de semana | Pedidos |

| Limpar | Noite | Día laborable | Cociñeiras |

| Limpar | Medianoite | Fin de semana | Pedidos |

Aquí, temos un pequeno conxunto de datos que contén 3 variables de entrada: o tempo, a hora e o día da semana, e unha variable de destino: "Cena" que indica se unha persoa cociña ou encarga a súa cea . Gustaríanos atopar a clase da entrada x={Clear, Evening, Weekend}:

equations

Necesitamos calcular a probabilidade condicional para a clase "Cociñeiros" e a clase "Pedidos" dada a entrada x={Clear, Evening, Weekend}. A clase prevista é a que ten maior probabilidade condicional.

Comezamos calculando a probabilidade condicional da clase "Cociñeiros":

equations

Agora calculamos cada probabilidade condicional por si mesma:

A probabilidade de tempo="Clear" dado que a clase é "Cociñeiros" é o número de liñas con tempo "Clear" e clase "Cociñeiros" sobre o número total de liñas coa clase "Cociñeiros"

equations

O mesmo ocorre coas outras probabilidades condicionais:

equations

Agora, para a probabilidade P(Cociñeiros) é o número de liñas coa clase "Cociñeiros" sobre o número total de liñas:

equations

Agora calculamos o produto destas probabilidades:

equations

Iso foi para a clase "Cociñeiros", agora temos que facer o mesmo para a clase "Pedidos":

equations

Calculamos as probabilidades individuais:

equations

E finalmente calculamos o produto das probabilidades:

equations

Finalmente, tomamos a clase con maior probabilidade que é a clase "Cociñeiros":

equations

equations

equations

equations

equations

equations

Vantaxes e limitacións deste algoritmo

Vantaxes:

  • É un clasificador moi rápido.

  • É doado de implementar.

  • Non hai fase de adestramento, pero só é inferencia.

  • Non precisa de moitos datos para facer inferencias.

Limitacións:

  • Naive Bayes asume que as variables de entrada son independentes, o que non sempre é certo.

  • Naive Bayes sofre o problema da frecuencia cero: é cando lle asigna unha probabilidade cero a unha variable de entrada. Isto eliminará a cero toda a probabilidade condicional P(C|x). Un truco para evitar isto é usar unha frecuencia mínima de 1 (en lugar de 0) para todas as variables.

Exercicio

Aquí está o marco de datos do mesmo conxunto de datos que vimos no exemplo.

A súa tarefa é implementar Naive Bayes vostede mesmo usando 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ón


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

Servizos de Carreira

Contact Section background image

Mantémonos en contacto

Code Labs Academy © 2024 Todos os dereitos reservados.