- Naive Bayes: Clasificador probabilístico y filtrado de spam
Naive Bayes: Clasificador probabilístico y filtrado de spam
El clasificador Naive Bayes es uno de los algoritmos más elegantes y sorprendentemente robustos dentro del aprendizaje supervisado. Se fundamenta en el teorema de Bayes y en una suposición que, aunque ingenua, le otorga una eficiencia computacional y una interpretabilidad excepcionales: la independencia condicional entre las características dada la clase. Esta lección explora sus fundamentos matemáticos, sus variantes principales y su aplicación clásica al filtrado de spam, revelando tanto su potencia como sus límites.
1. Teorema de Bayes: el pilar probabilístico
El punto de partida del clasificador Naive Bayes es el teorema de Bayes, que describe la probabilidad de un evento basado en conocimiento previo de condiciones relacionadas. En el contexto de clasificación, calculamos la probabilidad a posteriori de que una instancia pertenezca a una clase y dadas sus características x:
P(y | x₁, x₂, ..., xₙ) = [P(y) * P(x₁, x₂, ..., xₙ | y)] / P(x₁, x₂, ..., xₙ)
Dado que el denominador es constante para todas las clases, la decisión se toma comparando el numerador. La regla de decisión se convierte en:
ŷ = argmax_y P(y) * P(x₁, x₂, ..., xₙ | y)
Aquí, P(y) es la probabilidad a priori de la clase (obtenida de la frecuencia en el conjunto de entrenamiento), y P(x₁,...,xₙ | y) es la verosimilitud de observar ese patrón de características dada la clase. Sin embargo, estimar esta verosimilitud conjunta es computacionalmente inviable cuando hay muchas características, porque requiere modelar todas las interacciones posibles.
2. Suposición de independencia condicional (el "ingenuo")
Para hacer factible el cálculo, Naive Bayes asume que, dada la clase, cada característica es independiente de las demás. Esto significa:
P(x₁, x₂, ..., xₙ | y) = P(x₁ | y) * P(x₂ | y) * ... * P(xₙ | y)
Esta suposición rara vez se cumple en la realidad (de ahí el nombre "naive" o ingenuo), pero simplifica enormemente el modelo. A cambio, introduce un sesgo fuerte. Sin embargo, en la práctica, el algoritmo funciona sorprendentemente bien, especialmente en problemas de texto y clasificación de documentos.
- Ventaja: Entrenamiento extremadamente rápido, incluso con grandes volúmenes de datos y muchas características.
- Desventaja: Puede estar mal calibrado si las características están altamente correlacionadas, aunque a menudo la decisión final sigue siendo correcta.
3. Variantes del clasificador Naive Bayes
La elección de la distribución de probabilidad para modelar P(xᵢ | y) da lugar a distintas variantes, adaptadas a diferentes tipos de datos:
| Variante | Tipo de datos | Distribución asumida | Uso típico |
|---|---|---|---|
| Gaussiano | Continuos | Normal (media y varianza por clase) | Características numéricas como temperatura, altura, precios |
| Multinomial | Discretos (conteos) | Multinomial (frecuencia de ocurrencia) | Clasificación de texto (conteo de palabras) |
| Bernoulli | Binarios (presencia/ausencia) | Bernoulli (0/1) | Detección de spam, presencia de términos |
Naive Bayes Gaussiano asume que cada característica sigue una distribución normal dentro de cada clase. Se estiman la media y la varianza a partir de los datos de entrenamiento. Es adecuado para variables como el pH, la longitud o puntuaciones estandarizadas.
Naive Bayes Multinomial modela la frecuencia de ocurrencia de cada característica (por ejemplo, cuántas veces aparece una palabra en un correo). Es la variante más utilizada en procesamiento de lenguaje natural cuando se dispone de vectores de conteo (bolsa de palabras).
Naive Bayes Bernoulli está diseñado para características binarias (1 si la palabra aparece, 0 si no). Ignora la frecuencia y solo considera la presencia o ausencia. Sorprendentemente, puede ser más robusto que el multinomial cuando el ruido por frecuencia alta es elevado.
4. Aplicación práctica: filtrado de spam
El filtrado de correo electrónico es el ejemplo canónico de Naive Bayes. Se trata de un problema de clasificación binaria (spam vs. no spam) donde las características son palabras clave o atributos del mensaje.
4.1 Preprocesamiento del texto
Antes de entrenar el modelo, el texto crudo debe limpiarse y transformarse en un formato numérico:
- Tokenización: separar el texto en palabras individuales.
- Eliminación de palabras vacías (stop words): palabras como "el", "la", "y", "de" que no aportan información discriminante. Se filtran para reducir ruido y dimensionalidad.
- Stemming: reducir cada palabra a su raíz (por ejemplo, "corriendo", "corría" → "corr"). Esto agrupa variantes morfológicas y mejora la generalización.
- Vectorización: convertir el conjunto de palabras en un vector de características (frecuencia o presencia binaria).
Ejemplo de preprocesamiento:
Texto original: "Gana dinero rápido, haz clic aquí ahora"
Tras stop words y stemming: "gan din rapid hac clic ahor"
4.2 Suavizado de Laplace
Un problema común es que una palabra no aparezca en el conjunto de entrenamiento para una clase determinada. Esto llevaría a una probabilidad condicional de cero, lo que anularía toda la evidencia. Para evitarlo, se aplica suavizado de Laplace (o add-one smoothing):
P(palabra | clase) = (conteo_palabra_clase + 1) / (conteo_total_palabras_clase + V)
donde V es el tamaño del vocabulario (número de palabras distintas). Este pequeño ajuste garantiza que nunca se asigne probabilidad cero a términos desconocidos, manteniendo la coherencia probabilística.
4.3 Predicción e interpretabilidad
Una vez entrenado el modelo, la clasificación de un nuevo correo se realiza calculando el logaritmo de las probabilidades para evitar problemas de desbordamiento numérico:
log P(spam | email) ∝ log P(spam) + Σ log P(palabra | spam)
log P(no_spam | email) ∝ log P(no_spam) + Σ log P(palabra | no_spam)
El modelo decide la clase con mayor probabilidad logarítmica. Además, el clasificador ofrece una interpretabilidad directa: las palabras con mayor cociente de probabilidad P(palabra|spam) / P(palabra|no_spam) son las que más peso tienen para decidir que un correo es spam. Por ejemplo, términos como "gane", "haga clic", "oferta" suelen tener puntuaciones altas en la clase spam.
5. Balance sesgo-varianza y limitaciones
Naive Bayes es un modelo de alto sesgo, ya que asume independencia condicional, una simplificación que rara vez es cierta. Esto significa que subestima la complejidad de las relaciones entre características. Sin embargo, su varianza es baja porque la estimación se basa en promedios de datos y no en modelos muy flexibles. Este equilibrio hace que Naive Bayes sea excelente cuando:
- El conjunto de datos es pequeño o moderado.
- Las características son débilmente dependientes o la estructura de dependencia no es crítica.
- Se necesita un modelo rápido y fácil de interpretar.
Por el contrario, puede fallar cuando las características están fuertemente correlacionadas (por ejemplo, sinónimos en texto) o cuando la suposición de independencia lleva a una mala calibración de las probabilidades. Aún así, en problemas de filtrado de spam, su simplicidad y efectividad lo han convertido en un estándar de referencia, incluso superando a métodos más complejos cuando se aplica correctamente el preprocesamiento.
6. Ejemplo ilustrativo (filtro de spam paso a paso)
Supongamos que tenemos un vocabulario de 5 palabras después del preprocesamiento: ["gana", "dinero", "reunión", "urgente", "oferta"]. Entrenamos con 4 correos:
Correo 1 (spam): "gana dinero oferta" → [1,1,0,0,1]
Correo 2 (spam): "oferta urgente gana" → [1,0,0,1,1]
Correo 3 (no spam): "reunión urgente" → [0,0,1,1,0]
Correo 4 (no spam): "dinero reunión" → [0,1,1,0,0]
Con suavizado de Laplace (α=1, V=5):
- P(spam) = 2/4 = 0.5, P(no_spam) = 0.5
- P("gana"|spam) = (2+1)/(6+5)=3/11 ≈ 0.2727
- P("dinero"|spam) = (1+1)/(6+5)=2/11 ≈ 0.1818
- P("reunión"|spam) = (0+1)/(6+5)=1/11 ≈ 0.0909
- P("urgente"|spam) = (1+1)/(6+5)=2/11 ≈ 0.1818
- P("oferta"|spam) = (2+1)/(6+5)=3/11 ≈ 0.2727
Para un nuevo correo: "gana oferta urgente" (vector [1,0,0,1,1]):
log P(spam|email) ∝ log(0.5) + log(0.2727) + log(0.0909) + log(0.1818) + log(0.2727) ≈ -0.693 -1.299 -2.398 -1.704 -1.299 = -7.393
log P(no_spam|email) ∝ log(0.5) + log(0.1111) + log(0.2222) + log(0.2222) + log(0.1111) ≈ -0.693 -2.197 -1.504 -1.504 -2.197 = -8.095
Dado que -7.393 > -8.095, el modelo clasifica el correo como spam, lo que es coherente con el contenido.
7. Consideraciones finales
Naive Bayes no solo es un clasificador; es una filosofía de modelado que prioriza la eficiencia y la transparencia. Su capacidad para trabajar con datos de alta dimensionalidad (como texto) y proporcionar explicaciones directas a través de las probabilidades condicionales lo convierte en una herramienta indispensable. Aunque su sesgo por independencia pueda parecer una limitación, en la práctica, y con un preprocesamiento cuidadoso, ofrece resultados competitivos y, a menudo, más robustos que modelos de caja negra. Comprenderlo a fondo es el primer paso para avanzar hacia métodos bayesianos más complejos y redes de creencias.
Lección diseñada para la formación en fundamentos de machine learning. Todos los ejemplos son ilustrativos y pueden adaptarse a conjuntos de datos reales.
No hay comentarios por ahora.
Compartir este contenido
Compartir enlace
Compartir en redes sociales
Compartir por correo electrónico
Please iniciar sesión para compartir esto Artículo por correo electrónico.