Menu
CoddyTech

Introducción a Naive Bayes

Lección 12 de 19 del curso Introducción al aprendizaje automático de Coddy.

Naive Bayes es un algoritmo simple pero potente utilizado para tareas de clasificación en el aprendizaje automático (machine learning).

El algoritmo Naive Bayes se basa en el teorema de Bayes, que nos indica cómo calcular la probabilidad de un evento (como que un correo electrónico sea spam) basándose en el conocimiento previo de las condiciones que podrían estar relacionadas con el evento. La parte "naive" (ingenuo) proviene de la suposición de que todas las características (como las palabras en el correo electrónico) son independientes entre sí, lo que simplifica los cálculos. Ser independiente significa que el hecho de que ocurra una cosa no cambia las probabilidades de que ocurra otra.

Fuente: Wikipedia, un clasificador Naive Bayes actualizando su estimación mientras se le suministran más datos.
Así es como funciona:

  1. Contar ocurrencias: Primero, cuenta cuántas veces aparece cada punto de datos en diferentes clases. En la detección de spam de correo electrónico, contaremos cuántas veces apareció cada palabra en correos electrónicos de spam o no spam; en el diagnóstico médico, podríamos contar cuántas veces (o durante cuánto tiempo) aparece cada síntoma.
  2. Calcular probabilidades: Para un nuevo punto de datos, calcula la probabilidad de pertenecer a cada clase (cuál es la probabilidad de que un nuevo correo electrónico sea spam y cuál es la probabilidad de que no sea spam). 
  3. Decisión: Finalmente, el algoritmo combina todas estas probabilidades utilizando el teorema de Bayes y decide si es más probable que el correo electrónico sea spam o no spam. Cuanto mayor sea la probabilidad, más probable es que pertenezca a esa clase.

Lo genial de Naive Bayes es su implementación rápida y sencilla. Funciona bien con datos de alta dimensión (como el texto) y puede manejar valores faltantes. Sin embargo, la suposición de independencia no siempre es cierta en la vida real, lo que a veces puede llevar a resultados menos precisos en comparación con algoritmos más complejos.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

challenge icon

Desafío

Intermedio

En este desafío, aprenderemos cómo calcular la probabilidad de pertenecer a una clase en particular. El conjunto de datos play_outside.csv contiene las siguientes columnas: temperature, mood, motivation, windy, play. Cada fila representa a la misma persona y si decidió jugar afuera o no basándose en las características (temperature, mood, motivation, windy). Nuestro objetivo es predecir si saldrá a jugar afuera basándonos en las características (temperature, mood, motivation, windy).

Aquí hay un ejemplo de un conjunto de datos:

temperaturemoodmotivationwindyplay
lowgoodhighnoyes
moderategoodhighnoyes
lowlowmediumyesno

Las siguientes ecuaciones pueden parecer intimidantes, pero las desglosaremos.
Fórmula de Naive Bayes: P(Class|Feature) = P(Feature|Class) * P(Class) / P(Feature)

  • P(Feature|Class) - Verosimilitud (Likelihood)
  • P(Class) - Probabilidad a priori de la clase
  • P(Feature) - Probabilidad a priori del predictor
  • P(Class|Feature) - En otras palabras, ¿cuál es la probabilidad de que la fila no vista sea clasificada en la clase <strong>x</strong>? 

Para resolver esto, necesitaremos calcular cada uno de los componentes de la fórmula (P(B|Class) * P(Class) / P(B))

  • P(Class) - Probabilidad a priori de la clase
    Esto equivale al número de ocurrencias de cada clase, dividido por el número total de clases. Por ejemplo, en nuestro ejemplo de 3 filas, hay 2/3 yes y 1/3 no.
    P(yes) = 2/3
    P(no) = 1/3 
  •  P(Feature|Class) - Verosimilitud (Likelihood)
    Esto equivale al número de ocurrencias de cada característica de una clase dada. Por ejemplo:
    P(temperature = <strong>low</strong>|play = <strong>yes</strong>) - Hay dos filas donde play = yes, y una fila donde temperature = low (solo de las filas donde play = yes), por lo que esto equivale a 1/2.
  • P(Feature)
    Esto equivale al número de ocurrencias de cada característica dividido por el número total de filas. Por ejemplo:
    p(motivation=high) = 2/3 porque hay dos filas con motivación alta divididas por el número total de filas (3)

El desafío

Se te dan dos diccionarios probability_features, probability_target y el dataset_name

Calcula para cada característica (columna) la probabilidad de cada atributo.
Por ejemplo, aquí está el valor de probability_target:

probability_target = {
    "yes": 0.66667, # (2/3)
    "no": 0.33333 # (1/3)   
}

Aquí está el valor de probability_features:

probability_features = {
	"temperature": {
		"low": {
			"yes": 0.5, # (1/2)
			"no": 0.5, # (1/2)
		},
		"moderate": {
			"yes": 1, # (1/1)
			"no": 0, # (0/1)
		}
	}
}

Ten en cuenta que los nombres de las características y los nombres de los atributos no son constantes. Cada conjunto de datos tiene diferentes características y diferentes nombres.

Recomendaría usar el módulo pandas para facilitar los cálculos.

Pruébalo tú mismo

import pandas as pd
probability_features = {}
probability_target = {}
dataset_path = input()
target_variable = input()
df = pd.read_csv(dataset_path)
# Escribe tu código aquí


# -------------------- Ordenar e imprimir --------------------
# No cambies nada debajo de esta línea
sort_features = {q: {k: v for k, v in sorted(a.items() if a != None else {}, key=lambda item: item[0])} for q, a in sorted(probability_features.items(), key=lambda item: item[0])}
sort_target = {k: v for k, v in sorted(probability_target.items(), key=lambda item: item[0])}
print(sort_features)
print(sort_target)

Todas las lecciones de Introducción al aprendizaje automático

Practica por tu cuenta: Compilador de Python online