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
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:
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:
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:
Co uso do teorema de Bayes, a función pasa a ser:
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:
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:
De feito, podemos simplificar aínda máis esta formulación eliminando P(x), porque é o mesmo para todas as clases:
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}:
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":
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"
O mesmo ocorre coas outras probabilidades condicionais:
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:
Agora calculamos o produto destas probabilidades:
Iso foi para a clase "Cociñeiros", agora temos que facer o mesmo para a clase "Pedidos":
Calculamos as probabilidades individuais:
E finalmente calculamos o produto das probabilidades:
Finalmente, tomamos a clase con maior probabilidade que é a clase "Cociñeiros":
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