Naive Bayes
En simple: lee esto primero
Naive Bayes hace una simplificación «ingenua»: supone que cada dato aporta su pista por separado, sin influirse entre sí.
Para detectar spam, revisa palabra por palabra: «gratis» suma sospecha, «reunión» la resta… y junta todas las pistas como si fueran independientes. No es del todo cierto, pero funciona sorprendentemente bien.
- Al suponer independencia, basta con contar cada característica por separado: muy rápido y necesita pocos datos.
- Se trabaja con logaritmos para no multiplicar miles de números diminutos (la computadora los redondearía a 0).
- Suavizado de Laplace: sumar 1 a todos los conteos para que una palabra nunca vista no anule todo.
- independencia condicional
- dentro de cada clase, saber un dato no te dice nada de otro.
- suavizado de Laplace
- el «+1» a los conteos para evitar probabilidades cero.
- log-espacio
- sumar logaritmos en vez de multiplicar probabilidades.
Más abajo viene la versión completa, con fórmulas. Si una palabra aparece subrayada con puntos, pasa el mouse (o tócala) para ver qué significa.
La maldición de la conjunta
Sección titulada «La maldición de la conjunta»Para usar Bayes necesitamos , una densidad sobre todo el vector . En alta dimensión es imposible de estimar: con solo 20 features sí/no (palabras), la conjunta necesita 1 000 000 de probabilidades por clase.
Naive Bayes corta el nudo con una suposición audaz: independencia condicional de las features dada la clase:
Con eso bastan 20 números por clase (uno por palabra). «Naive» (ingenuo) porque finge que, sabiendo la clase, las features no llevan información conjunta.
¿Por qué hace falta ser «naive»?
Con d palabras (presente/ausente), la distribución conjunta p(x | y) tiene una probabilidad por cada combinación posible. Naive Bayes solo necesita una por palabra.
(barras en escala logarítmica, por clase)
Decidir en log-espacio
Sección titulada «Decidir en log-espacio»Multiplicar muchas probabilidades chicas se desborda a 0 (30 factores ≈ 0.1 dan ). Tomando logs, los productos se vuelven sumas y el ganador no cambia (el log es creciente):
La regla es la misma para todo Naive Bayes; solo cambia el modelo por feature:
| Tipo de feature | Variante | Estimación (MLE) | |
|---|---|---|---|
| continua | Gaussiano | media y varianza de en la clase | |
| presencia de palabra (0/1) | Bernoulli | fracción de docs de la clase con la palabra | contar |
| conteo de palabras | Multinomial | frecuencia de la palabra en la clase | contar |
Naive Bayes gaussiano
Sección titulada «Naive Bayes gaussiano»Cada feature continua es su propia campana 1-D (dos perillas: centro y dispersión ; el exponente es el z-score al cuadrado). Un producto de campanas por eje da elipses alineadas a los ejes (sin inclinación); aun así la frontera se puede curvar.
Parámetros totales: priors (con libres, porque ) números (media y varianza por clase y feature). Nada más.
Mira la elipse diagonal de NB frente a la inclinada de QDA (modo «Naive Bayes»):
Naive Bayes para texto
Sección titulada «Naive Bayes para texto»El texto no tiene ejes : primero se convierte en features. Bolsa de palabras: se fija un vocabulario y cada palabra es una feature (presencia en Bernoulli, conteo en Multinomial). Un filtro de spam no analiza gramática: pregunta palabra por palabra «¿aparece más en spam o en ham?» y multiplica los votos. Solo hay que estimar ≈ (vocabulario × clases) números, cada uno un conteo.
Spam a mano (los números de la slide)
Sección titulada «Spam a mano (los números de la slide)»Priors , . Mensaje: «free money now».
| free | money | now | |
|---|---|---|---|
| spam | 0.80 | 0.70 | 0.55 |
| ham | 0.10 | 0.08 | 0.30 |
¿Es spam? Naive Bayes a mano
Haz clic en las palabras para ponerlas o quitarlas del correo. Cada likelihood es solo una fracción contada: correos de la clase que contienen la palabra / correos de la clase.
| palabra | en el correo | p(w | spam) | p(w | ham) | voto |
|---|---|---|---|---|
| free | sí | (32+α)/(40+2α) = 0.800 | (6+α)/(60+2α) = 0.100 | spam |
| money | sí | (28+α)/(40+2α) = 0.700 | (5+α)/(60+2α) = 0.083 | spam |
| now | sí | (22+α)/(40+2α) = 0.550 | (18+α)/(60+2α) = 0.300 | spam |
| lottery | no | 1 − (12+α)/(40+2α) = 0.700 | 1 − (0+α)/(60+2α) = 1.000 | — |
| meeting | no | 1 − (4+α)/(40+2α) = 0.900 | 1 − (30+α)/(60+2α) = 0.500 | — |
| project | no | 1 − (2+α)/(40+2α) = 0.950 | 1 − (27+α)/(60+2α) = 0.550 | — |
| report | no | 1 − (3+α)/(40+2α) = 0.925 | 1 − (24+α)/(60+2α) = 0.600 | — |
Suavizado de Laplace, y una advertencia
Sección titulada «Suavizado de Laplace, y una advertencia»Si «lottery» nunca apareció en ningún ham, y ese solo cero anula todo el producto de ham, por muy «ham» que sean las otras palabras. Suavizado de Laplace (add-α):
con el tamaño del vocabulario (en Bernoulli, resultados por palabra) y típico. Es una estimación MAP: el actúa como un prior de conteos imaginados por palabra; ninguna probabilidad vuelve a ser 0.
Ejercicio
Sección titulada «Ejercicio»Con los datos de la tabla, el mensaje es solo «now». ¿Qué clase gana? ¿Y si el prior de spam fuera 0.2?
Ver solución
- : spam ; ham ⇒ spam ().
- : spam ; ham ⇒ ham. Con evidencia débil, el prior decide.
Autoevaluación
0/5 correctas · 0 respondidasEn código
Sección titulada «En código»from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.naive_bayes import MultinomialNB, BernoulliNB, GaussianNBfrom sklearn.pipeline import make_pipeline
spam = make_pipeline(CountVectorizer(), MultinomialNB(alpha=1.0)) # α = Laplacespam.fit(textos_tr, y_tr)spam.predict_proba(['free money now']) # [[P(ham), P(spam)]]
nb_bin = make_pipeline(CountVectorizer(binary=True), BernoulliNB(alpha=1.0)) # presencia 0/1
g = GaussianNB().fit(X_tr, y_tr) # features continuasg.theta_, g.var_, g.class_prior_ # μₖⱼ, σ²ₖⱼ y πₖ: contar y promediarPara profundizar
Sección titulada «Para profundizar»Fuente ·ML_Course_Generative_Probabilistic_Models.pdf (slides 16–23) · ML_Course/session-05a-gaussian-naive-bayes.ipynb