Introducción al algoritmo Naive Bayes

ML
algoritmo ML
clasificación
Introducción al algoritmo Naive Bayes cover image

Mesa:

Introducción

Naive Bayes es un algoritmo de aprendizaje automático de clasificación que se basa en el teorema de Bayes. Es muy eficiente, especialmente cuando se trata de datos textuales como: análisis de sentimiento, detección de spam y clasificación de texto.

Este algoritmo se denomina "Ingenuo" debido a la suposición de que todas las variables del conjunto de datos son independientes, lo que no siempre es así.

Antes de continuar explicando cómo funciona Naive bayes, asegurémonos de entender lo siguiente:

La probabilidad condicional

El algoritmo Naive Bayes se basa en el teorema de Bayes, que se basa en la probabilidad condicional: es la probabilidad de que ocurra un evento A dado que un evento B ya ha ocurrido.

Ejemplo:

Tengamos dos frascos que contengan bolas de colores:

  • El tarro 1 tiene 3 bolas azules, 2 bolas rojas y 4 bolas verdes.

  • El tarro 2 tiene 1 bola azul, 4 bolas rojas y 3 bolas verdes.

Queremos calcular la probabilidad de seleccionar al azar una bola azul de uno de los frascos

ecuaciones

No es otra cosa que la suma de las probabilidades de sacar una bola azul de Jar1 o Jar2.

Ahora, queremos calcular la probabilidad de seleccionar una bola azul dado que seleccionamos Jar1:

ecuaciones

Finalmente, queremos calcular la probabilidad de seleccionar Jar1 dado que sacamos una bola azul. Aquí usamos el Teorema de Bayes que se expresa de la siguiente manera:

ecuaciones

ecuaciones

Clasificación bayesiana ingenua

En el clasificador Naive Bayes, queremos encontrar la clase que maximiza la probabilidad condicional dado el vector de entrada X; por lo tanto, Naive Bayes se puede formular de la siguiente manera:

ecuaciones

Con el uso del Teorema de Bayes, la función se convierte en:

ecuaciones

En esta formulación, es fácil calcular P(Ci) que no es otra cosa que la probabilidad de la clase Ci, y es fácil calcular P(x) que es la probabilidad de que ocurra el evento x.

Lo que es difícil de calcular es P(x|Ci); la probabilidad del evento x dada la clase Ci. Para simplificar aún más esto, debemos suponer que todas las variables de entrada son independientes; así, podemos escribir:

ecuaciones

Y es en realidad debido a esta suposición que llamamos a este clasificador "Ingenuo", porque no siempre podemos garantizar la independencia de las variables de entrada. El clasificador Naive Bayes se convierte en:

ecuaciones

De hecho, podemos simplificar aún más esta formulación eliminando P(x), porque es igual para todas las clases:

ecuaciones

Ahora, echemos un vistazo a un ejemplo:

| Tiempo | Tiempo | Día de la semana | Cena |

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

| Borrar | Tarde | Fin de semana | cocineros |

| Nublado | Noche | Día de la semana | Pedidos |

| lluvioso | Noche | Día de la semana | Pedidos |

| lluvioso | mediodía | Día de la semana | Pedidos |

| Nublado | mediodía | Fin de semana | cocineros |

| Borrar | Noche | Fin de semana | cocineros |

| Nevado | Tarde | Fin de semana | Pedidos |

| Borrar | Noche | Día de la semana | cocineros |

| Borrar | Medianoche | Fin de semana | Pedidos |

Aquí, tenemos un pequeño conjunto de datos que contiene 3 variables de entrada: clima, hora y día de la semana, y una variable objetivo: "Cena" que indica si una persona cocina u ordena su cena. Nos gustaría encontrar la clase de la entrada x={Clear, Evening, Weekend}:

ecuaciones

Necesitamos calcular la probabilidad condicional para la clase "Cocineros" y la clase "Pedidos" dada la entrada x={Clear, Evening, Weekend}. La clase predicha es la que tiene la probabilidad condicional más alta.

Empezamos calculando la probabilidad condicional de la clase “Cocineros”:

ecuaciones

Ahora calculamos cada probabilidad condicional por sí sola:

La probabilidad de weather=”Clear” dado que la clase es “Cooks” es el número de líneas con tiempo “Clear” y clase “Cooks” sobre el número total de líneas con clase “Cooks”

ecuaciones

Lo mismo ocurre con las otras probabilidades condicionales:

ecuaciones

Ahora, para la probabilidad P(Cocineros) es el número de líneas con la clase "Cocineros" sobre el número total de líneas:

ecuaciones

Ahora calculamos el producto de estas probabilidades:

ecuaciones

Eso fue para la clase “Cocineros”, ahora debemos hacer lo mismo para la clase “Pedidos”:

ecuaciones

Calculamos las probabilidades individuales:

ecuaciones

Y finalmente calculamos el producto de las probabilidades:

ecuaciones

Finalmente, tomamos la clase con mayor probabilidad que es la clase “Cocineros”:

ecuaciones

ecuaciones

ecuaciones

ecuaciones

ecuaciones

ecuaciones

Ventajas y limitaciones de este algoritmo

Ventajas:

  • Es un clasificador muy rápido.

  • Es fácil de implementar.

  • No hay fase de entrenamiento, solo es inferencia.

  • No requiere muchos datos para hacer inferencias.

Limitaciones:

  • Naive Bayes asume que las variables de entrada son independientes, lo que no siempre es cierto.

  • Naive Bayes sufre el problema de la frecuencia cero: es cuando asigna probabilidad cero a una variable de entrada. Esto pondrá a cero toda la probabilidad condicional P(C|x). Un truco para evitar esto es usar una frecuencia mínima de 1 (en lugar de 0) para todas las variables.

Ejercicio

Aquí está el marco de datos del mismo conjunto de datos que hemos visto en el ejemplo.

Su tarea es implementar Naive Bayes usted mismo 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

Servicios profesionales

Contact Section background image

Mantengámonos en contacto

Code Labs Academy © 2024 Todos los derechos reservados.