Aplicación Práctica: Naive Bayes (Aprendizaje Supervisado)

Introducción al teorema de Bayes y el enfoque "Naive".

La clasificación es una tarea fundamental en el ámbito del aprendizaje supervisado, donde se busca asignar una etiqueta o categoría a un conjunto de datos basándose en características específicas. En este contexto, el algoritmo Naive Bayes emerge como una herramienta poderosa y eficiente. Naive Bayes es un clasificador probabilístico que se basa en el teorema de Bayes para realizar predicciones. Su simplicidad y eficacia lo convierten en una elección popular, especialmente en aplicaciones donde la interpretación y explicación de las decisiones del modelo son cruciales.

La característica distintiva de Naive Bayes radica en la asunción "ingenua" o "naive" de independencia condicional entre las características, lo que significa que se supone que cada característica contribuye de manera independiente a la probabilidad de pertenencia a una clase. Aunque esta suposición puede parecer simplista, Naive Bayes ha demostrado su utilidad en una variedad de contextos, como el procesamiento del lenguaje natural y la clasificación de documentos.

En este enfoque, se calculan las probabilidades condicionales de que un dato pertenezca a una clase específica dado su conjunto de características. El clasificador utiliza estas probabilidades para asignar la etiqueta más probable a cada instancia de datos. A pesar de su simplicidad, Naive Bayes ha demostrado ser robusto en la práctica y es especialmente efectivo cuando se trata de conjuntos de datos grandes con dimensiones significativas. En resumen, Naive Bayes es un método valioso y accesible en el repertorio del aprendizaje supervisado, proporcionando una base sólida para la clasificación precisa y eficiente de datos.


Naive Bayes es un algoritmo de aprendizaje supervisado que se utiliza comúnmente para la clasificación. Su funcionamiento se basa en el teorema de Bayes, que es una fórmula probabilística que describe la probabilidad condicional de un evento dado el conocimiento de otro evento relacionado. Aquí hay una explicación paso a paso de cómo funciona Naive Bayes en el contexto de la clasificación:

Introducción al teorema de Bayes y el enfoque "Naive".

El teorema de Bayes se expresa de la siguiente manera:

[ P(A|B) = frac{P(B|A)cdot P(A)}{P(B)}]

Donde:

(P(A|B) ) es la probabilidad condicional de A dado B.

(P(B|A) ) es la probabilidad condicional de B dado A.

(P(A) ) y( P(B) ) son las probabilidades marginales de A y B, respectivamente.

 2. Aplicación en Clasificación:

En el contexto de clasificación con Naive Bayes, consideramos que A es la clase a la que pertenece un conjunto de características (atributos), y B es la observación de esos atributos. La fórmula se reescribe como:

 (Clase|Atributos) = frac{P(Atributos|Clase)cdot P(Clase)}{P(Atributos)}]

Donde:

(P(Clase|Atributos) ) es la probabilidad de pertenecer a una clase dada las observaciones de atributos.

(P(Atributos|Clase) ) es la probabilidad de observar los atributos dados pertenecer a esa clase.

(P(Clase) ) es la probabilidad a priori de pertenecer a esa clase.

(P(Atributos) ) es la probabilidad marginal de los atributos, que actúa como un factor de normalización.

 3. Suposición de Independencia Condicional:

La característica clave de Naive Bayes es la suposición "naive" de independencia condicional entre los atributos. Esto significa que asume que la presencia o ausencia de un atributo no está relacionada con la presencia o ausencia de otro atributo, dado la clase. Esta suposición simplifica el cálculo de (P(Atributos|Clase), ya que se puede expresar como el producto de las probabilidades individuales de cada atributo.

P(Atributos|Clase) = P(Atributo_1|Clase)cdot P(Atributo_2Clase)cdotldots cdot P(Atributo_n|Clase) ]

 4. Clasificación:

Para realizar una clasificación, Naive Bayes calcula la probabilidad de pertenencia a cada clase para un conjunto dado de atributos y asigna la clase con la probabilidad más alta como la etiqueta predicha.

 Clase_predicha = argmax_{i} P(Clase_i|Atributos) ]

 5. Entrenamiento:

Durante la fase de entrenamiento, Naive Bayes estima las probabilidades ( P(Atributo|Clase)) y ( P(Clase) ) a partir de los datos de entrenamiento.

 6. Tipos de Naive Bayes:

Existen diferentes variantes de Naive Bayes, como el Naive Bayes Gaussiano (para datos continuos), el Naive Bayes Multinomial (para datos discretos), y el Naive Bayes Bernoulli (para datos binarios).

En resumen, Naive Bayes es un algoritmo simple pero efectivo que aprovecha el teorema de Bayes y la suposición de independencia condicional para realizar tareas de clasificación en conjuntos de datos, siendo especialmente útil en problemas con dimensiones significativas y asumiendo la independencia condicional de las características.

Representación gráfica de las probabilidades de pertenecer a la clase "Spam" o "No Spam" para el correo electrónico. Simple

import matplotlib.pyplot as plt

# Probabilidades a priori
P_spam = 0.4
P_no_spam = 0.6

# Probabilidades condicionales para las palabras "oferta" e "increíble"
P_oferta_spam = 0.8
P_increible_spam = 0.7

P_oferta_no_spam = 0.2
P_increible_no_spam = 0.3

# Palabras del correo de ejemplo
palabras = ["oferta", "increíble"]

# Cálculo de probabilidades condicionales dadas las palabras
P_spam_dado_palabras = P_spam * P_oferta_spam * P_increible_spam
P_no_spam_dado_palabras = P_no_spam * P_oferta_no_spam * P_increible_no_spam

# Visualización en un gráfico de dispersión
plt.figure(figsize=(8, 6))
plt.scatter(P_spam_dado_palabras, P_no_spam_dado_palabras, color='red', marker='o', label='Correo Spam')
plt.scatter(1 - P_spam_dado_palabras, 1 - P_no_spam_dado_palabras, color='blue', marker='x', label='No Spam')

plt.title('Clasificación de Correo Electrónico')
plt.xlabel('Probabilidad de ser Spam')
plt.ylabel('Probabilidad de ser No Spam')
plt.legend()
plt.show()



En este ejemplo, los puntos rojos representarían correos electrónicos clasificados como spam, mientras que los puntos azules representarían correos clasificados como no spam. Cada punto en el gráfico representa un conjunto de probabilidades condicionales dadas las palabras "oferta" e "increíble". El eje x representa la probabilidad de ser spam, y el eje y representa la probabilidad de ser no spam.


Representación grafica con un vocabulario más extenso

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

# Definimos las palabras clave
vocabulario = ["oferta", "increíble", "productos electrónicos", "compre", "descuento", "50%", "oferta limitada", "saludos", "nombre empresa", "spam"]

# Creamos un conjunto de datos de ejemplo con valores de probabilidad
# Aquí, asumimos valores aleatorios para ilustrar el concepto
datos = np.random.rand(100, len(vocabulario))

# Creamos un DataFrame para facilitar el manejo de los datos
df = pd.DataFrame(data=datos, columns=vocabulario)

# Aplicamos PCA para reducir la dimensionalidad a 2 componentes principales
pca = PCA(n_components=2)
componentes_principales = pca.fit_transform(df)

# Visualizamos los resultados en un gráfico de dispersión
plt.figure(figsize=(10, 8))
plt.scatter(componentes_principales[:, 0], componentes_principales[:, 1], c='blue', alpha=0.5)

# Etiquetamos algunos puntos para representar correos clasificados como spam
etiquetas_spam = ["oferta", "increíble", "descuento", "spam"]
indices_spam = [vocabulario.index(palabra) for palabra in etiquetas_spam]
plt.scatter(componentes_principales[0, 0], componentes_principales[0, 1], c='red', marker='x', label='Correo Spam')
plt.scatter(componentes_principales[1, 0], componentes_principales[1, 1], c='red', marker='x')
plt.scatter(componentes_principales[2, 0], componentes_principales[2, 1], c='red', marker='x')
plt.scatter(componentes_principales[3, 0], componentes_principales[3, 1], c='red', marker='x')

# Etiquetamos algunos puntos para representar correos clasificados como no spam
etiquetas_no_spam = ["productos electrónicos", "saludos", "nombre empresa"]
indices_no_spam = [vocabulario.index(palabra) for palabra in etiquetas_no_spam]
plt.scatter(componentes_principales[4, 0], componentes_principales[4, 1], c='green', marker='o', label='No Spam')
plt.scatter(componentes_principales[5, 0], componentes_principales[5, 1], c='green', marker='o')
plt.scatter(componentes_principales[6, 0], componentes_principales[6, 1], c='green', marker='o')

# Etiquetas de las palabras
for i, palabra in enumerate(vocabulario):
    plt.annotate(palabra, (componentes_principales[i, 0], componentes_principales[i, 1]))

# Configuración del gráfico
plt.title('Visualización PCA de Correos Electrónicos')
plt.xlabel('Componente Principal 1')
plt.ylabel('Componente Principal 2')
plt.legend()
plt.show()

Representación grafica con un vocabulario más extenso



El anterior  ejemplo con un  vocabulario más extenso y consideramos un total de 10 palabras clave. Además, para simplificar, asumamos que utilizamos PCA para reducir la dimensionalidad a dos componentes principales.
Este código utiliza valores aleatorios para ilustrar el concepto y no representa una aplicación realista del algoritmo Naive Bayes. La técnica de PCA aquí se utiliza solo con fines de visualización. En un escenario real, los valores de probabilidad se derivarían del entrenamiento del modelo Naive Bayes con datos etiquetados






Comentarios

Entradas populares de este blog

Aplicación Práctica: Árboles de Decisión (Aprendizaje Supervisado)

Aplicación Práctica: K-Means (Aprendizaje No Supervisado)