Phase 02 - Lesson 14
Naive Bayes
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
La suposición "ingenua" es incorrecta y funciona de todos modos. Esa es la belleza de esto.
Tipo: Construcción Idioma: Python Requisitos previos: Fase 2, Lecciones 01-07 (clasificación, teorema Bayes') Tiempo: ~75 minutos
Objetivos de aprendizaje
- Implementar Multinomial Naive Bayes desde cero con suavizado de Laplace para clasificación de texto
- Explicar por qué el ingenuo supuesto de independencia es matemáticamente incorrecto pero produce clasificaciones de clases correctas en la práctica.
- Compare las variantes multinomial, Bernoulli y gaussiana Naive Bayes y seleccione la correcta para un tipo de característica determinado
- Evalúe Naive Bayes frente a la regresión logística en datos dispersos de alta dimensión y explique la compensación entre sesgo y varianza en funcionamiento.
El problema
Necesitas clasificar el texto. Correos electrónicos como spam o no spam. Comentarios de los clientes en positivos o negativos. Tickets de soporte en categorías. Tienes miles de funciones (una por palabra) y datos de entrenamiento limitados.
La mayoría de los clasificadores se ahogan aquí. La regresión logística necesita suficientes muestras para estimar miles de pesos de manera confiable. Los árboles de decisión se dividen en una palabra a la vez y se sobreajustan enormemente. KNN en 10.000 dimensiones no tiene sentido porque cada punto está igualmente lejos de todos los demás puntos.
Naive Bayes maneja esto. Hace una suposición matemáticamente incorrecta (que cada característica es independiente de cualquier otra característica dada la clase) y aún supera a los modelos "más inteligentes" en clasificación de texto, especialmente con conjuntos de entrenamiento pequeños. Se entrena en un solo paso a través de los datos. Se adapta a millones de funciones. Produce estimaciones de probabilidad (aunque a menudo mal calibradas debido al supuesto de independencia).
Comprender por qué una suposición errónea conduce a buenas predicciones le enseña algo fundamental sobre el machine learning: el mejor modelo no es el más correcto, sino el que tiene la mejor compensación entre sesgo y varianza para sus datos.
El concepto
Teorema de Bayes' (revisión rápida)
El teorema de Bayes' invierte las probabilidades condicionales:
P(class | features) = P(features | class) * P(class) / P(features)
Queremos P(class | features): la probabilidad de que un documento pertenezca a una clase dadas las palabras que contiene. Podemos calcular esto a partir de:
P(features | class)-- la probabilidad de ver estas palabras en documentos de esta claseP(class)-- la probabilidad previa de la clase (¿qué tan común es el spam en general?)P(features)-- la evidencia, la misma para todas las clases, por lo que podemos ignorarla al comparar
La clase con el P(class | features) más alto gana.
La ingenua suposición de la independencia
Calcular P(features | class) exactamente requiere estimar la probabilidad conjunta de todas las características juntas. Con un vocabulario de 10.000 palabras, necesitarías estimar una distribución de más de 2^10.000 combinaciones posibles. Imposible.
La suposición ingenua: cada característica es condicionalmente independiente dada la clase.
P(w1, w2, ..., wn | class) = P(w1 | class) * P(w2 | class) * ... * P(wn | class)
En lugar de una distribución conjunta imposible, se estiman n distribuciones simples por característica. Cada uno necesita sólo un recuento.
Esta suposición es obviamente errónea. Las palabras "máquina" y "aprendizaje" no son independientes en ningún documento. Pero el clasificador no necesita estimaciones de probabilidad correctas. Necesita clasificaciones correctas: qué clase tiene la mayor probabilidad. El supuesto de independencia introduce errores sistemáticos, pero esos errores afectan a todas las clases de manera similar, por lo que la clasificación sigue siendo correcta.
Por qué todavía funciona
Tres razones:
Clasificación sobre calibración. La clasificación solo necesita que la clase mejor clasificada sea correcta. Incluso si P(spam) = 0,99999 cuando la probabilidad real es 0,7, el clasificador sigue seleccionando el spam correctamente. No necesitamos probabilidades correctas. Necesitamos el ganador correcto.
Alto sesgo, baja varianza. El supuesto de independencia es un fuerte precedente. Restringe fuertemente el modelo, lo que evita el sobreajuste. Con datos de entrenamiento limitados, un modelo que es ligeramente incorrecto pero estable supera a un modelo que es teóricamente correcto pero tremendamente inestable. Ésta es la compensación sesgo-varianza en acción.
La redundancia de funciones se cancela. Las funciones correlacionadas proporcionan evidencia redundante. El clasificador cuenta dos veces esta evidencia, pero también la cuenta dos veces para la clase correcta. Si "máquina" y "aprendizaje" siempre aparecen juntos, ambos proporcionan evidencia para la clase "tecnología". NB los cuenta dos veces, pero los cuenta dos veces para la clase correcta.
Una cuarta razón práctica: Naive Bayes es extremadamente rápido. El entrenamiento es un solo paso a través de las frecuencias de conteo de datos. La predicción es una multiplicación de matrices. Puedes entrenar con un millón de documentos en segundos. Esta velocidad significa que puede iterar más rápido, probar más conjuntos de funciones y ejecutar más experimentos que con modelos más lentos.
Las Matemáticas Paso a Paso
Sigamos un ejemplo concreto. Supongamos que tenemos dos clases: spam y no spam. Nuestro vocabulario tiene tres palabras: "gratis", "dinero", "reunión".
Datos de entrenamiento:
- Los correos electrónicos no deseados mencionan "gratis" 80 veces, "dinero" 60 veces y "reunión" 10 veces (150 palabras en total).
- Los correos electrónicos que no son spam mencionan "gratis" 5 veces, "dinero" 10 veces y "reunión" 100 veces (115 palabras en total).
- El 40% de los correos electrónicos son spam, el 60% no son spam.
Con suavizado de Laplace (alfa=1):
P(free | spam) = (80 + 1) / (150 + 3) = 81/153 = 0.529
P(money | spam) = (60 + 1) / (150 + 3) = 61/153 = 0.399
P(meeting | spam) = (10 + 1) / (150 + 3) = 11/153 = 0.072
P(free | not-spam) = (5 + 1) / (115 + 3) = 6/118 = 0.051
P(money | not-spam) = (10 + 1) / (115 + 3) = 11/118 = 0.093
P(meeting | not-spam) = (100 + 1) / (115 + 3) = 101/118 = 0.856
El nuevo correo electrónico contiene: "gratis" (2 veces), "dinero" (1 vez), "reunión" (0 veces).
log P(spam | email) = log(0.4) + 2*log(0.529) + 1*log(0.399) + 0*log(0.072)
= -0.916 + 2*(-0.637) + (-0.919) + 0
= -3.109
log P(not-spam | email) = log(0.6) + 2*log(0.051) + 1*log(0.093) + 0*log(0.856)
= -0.511 + 2*(-2.976) + (-2.375) + 0
= -8.838
El spam gana por un amplio margen. La palabra "gratis" que aparece dos veces es una fuerte evidencia de spam. Tenga en cuenta que la "reunión" que no aparece contribuye con cero a ambas sumas logarítmicas (0 * log(P)); en Multinomial NB, las palabras ausentes no tienen ningún efecto. Es Bernoulli NB quien modela explícitamente la ausencia de palabras.
Tres variantes
Naive Bayes viene en tres sabores. Cada uno modela P(feature | class) de manera diferente.
Multinomial Naive Bayes
Modela cada característica como un recuento. Lo mejor para datos de texto donde las características son frecuencias de palabras o valores TF-IDF.
P(word_i | class) = (count of word_i in class + alpha) / (total words in class + alpha * vocab_size)
El alpha es el suavizado de Laplace (explicado a continuación). Esta variante es el caballo de batalla para la clasificación de textos.
Gaussiano Naive Bayes
Modela cada característica como una distribución normal. Lo mejor para funciones continuas.
P(x_i | class) = (1 / sqrt(2 * pi * var)) * exp(-(x_i - mean)^2 / (2 * var))
Cada clase tiene su propia media y varianza por característica. Esto funciona bien cuando las características realmente siguen una curva de campana dentro de cada clase.
Bernoulli Naive Bayes
Modela cada característica como binaria (presente o ausente). Lo mejor para textos cortos o vectores de características binarias.
P(word_i | class) = (docs in class containing word_i + alpha) / (total docs in class + 2 * alpha)
A diferencia de Multinomial, Bernoulli penaliza explícitamente la ausencia de una palabra. Si "gratis" suele aparecer en el spam pero no aparece en este correo electrónico, Bernoulli lo considera prueba contra el spam.
Cuándo utilizar cada variante
| Variante | Tipo de característica | Mejor para | Ejemplo |
|---|---|---|---|
| Multinomial | Conteos o frecuencias | Clasificación de textos, bolsa de palabras | Correo no deseado, clasificación de temas |
| gaussiano | Valores continuos | Datos tabulares con características normales | Clasificación del iris, datos de sensores |
| bernoulli | Binario (0/1) | Texto breve, vectores de características binarias | SMS spam, funciones de presencia/ausencia |
Suavizado de Laplace
¿Qué sucede cuando una palabra aparece en los datos de la prueba pero nunca apareció en los datos de entrenamiento de una clase en particular?
Sin alisar: P(word | class) = 0/N = 0. Un cero multiplicado por todo el producto da P(class | features) = 0, independientemente de cualquier otra evidencia. Una sola palabra invisible destruye toda la predicción, sin importar cuánta evidencia la respalde.
El suavizado de Laplace agrega un pequeño recuento alpha (normalmente 1) a cada recuento de funciones:
P(word_i | class) = (count(word_i, class) + alpha) / (total_words_in_class + alpha * vocab_size)
Con alfa=1, cada palabra tiene al menos una pequeña probabilidad. La palabra "discombobulate" que aparece en un correo electrónico de prueba ya no elimina la probabilidad de spam. El suavizado tiene una interpretación bayesiana: equivale a colocar un Dirichlet uniforme antes de las distribuciones de palabras.
Un alfa más alto significa un suavizado más fuerte (distribuciones más uniformes). Un alfa más bajo significa que el modelo confía más en los datos. Alfa es un hiperparámetro que usted ajusta.
El efecto de alfa:
| Alfa | Efecto | Cuándo utilizar |
|---|---|---|
| 0,001 | Casi no hay suavizado, confíe en los datos | Conjunto de entrenamiento muy grande, no se esperan características invisibles |
| 0,1 | Suavizado ligero | Gran conjunto de entrenamiento |
| 1.0 | Alisado de Laplace estándar | Punto de partida predeterminado |
| 10.0 | Suavizado intenso, aplana las distribuciones | Conjunto de entrenamiento muy pequeño, se esperan muchas características invisibles |
Cálculo del espacio de registro
Multiplicar cientos de probabilidades (cada una menor que 1) provoca un desbordamiento insuficiente de punto flotante. El producto se vuelve cero en coma flotante aunque el valor real sea un número positivo muy pequeño.
La solución: trabajar en el espacio de registro. En lugar de multiplicar probabilidades, suma sus logaritmos:
log P(class | x1, x2, ..., xn) = log P(class) + sum_i log P(xi | class)
Esto convierte la predicción en un producto escalar:
log_scores = X @ log_feature_probs.T + log_class_priors
prediction = argmax(log_scores)
Multiplicación de matrices. Por eso la predicción Naive Bayes es tan rápida: es la misma operación que un modelo lineal de una sola capa.
Naive Bayes vs Regresión Logística
Ambos son clasificadores lineales de texto. La diferencia está en lo que modelan.
| Aspecto | Naive Bayes | Regresión logística |
|---|---|---|
| Tipo | Generativo (modelos P(X|Y)) | Discriminativo (modelos P(Y|X)) |
| Entrenamiento | Contar frecuencias | Optimizar la función de pérdida |
| Pequeños datos | Mejor (fuerte ayuda previa) | Peor (no es suficiente para estimar los pesos) |
| Grandes datos | Peor (la suposición equivocada duele) | Mejor (límites flexibles) |
| Características | Asume la independencia | Maneja correlaciones |
| Velocidad | Una sola pasada, muy rápida | Optimización iterativa |
| Calibración | Pocas probabilidades | Mejores probabilidades |
Regla general: comience con Naive Bayes. Si tiene suficientes datos y mesetas de NB, cambie a la regresión logística.
Clasificación Pipeline
flowchart LR
A[Raw Text] --> B[Tokenize]
B --> C[Build Vocabulary]
C --> D[Count Word Frequencies]
D --> E[Apply Smoothing]
E --> F[Compute Log Probabilities]
F --> G[Predict: argmax P class given words]
style A fill:#f9f,stroke:#333
style G fill:#9f9,stroke:#333
En la práctica, trabajamos en el espacio de registro para evitar el desbordamiento de punto flotante. En lugar de multiplicar muchas probabilidades pequeñas, sumamos sus logaritmos:
log P(class | features) = log P(class) + sum_i log P(feature_i | class)
Constrúyelo
El código en code/naive_bayes.py implementa tanto MultinomialNB como GaussianNB desde cero.
MultinomialNB
La implementación desde cero:
fit(X, y): Para cada clase, cuente la frecuencia de cada característica. Añadir alisado de Laplace. Calcule las probabilidades de registro. Almacenar clases anteriores (registro de frecuencias de clases).
predict_log_proba(X): Para cada muestra, calcule el log P(clase) + la suma del log P(feature_i | clase) para todas las clases. Esta es una multiplicación de matrices: X @ log_probs.T + log_priors.
predecir(X): Devuelve la clase con mayor probabilidad logarítmica.
class MultinomialNB:
def __init__(self, alpha=1.0):
self.alpha = alpha
def fit(self, X, y):
classes = np.unique(y)
n_classes = len(classes)
n_features = X.shape[1]
self.classes_ = classes
self.class_log_prior_ = np.zeros(n_classes)
self.feature_log_prob_ = np.zeros((n_classes, n_features))
for i, c in enumerate(classes):
X_c = X[y == c]
self.class_log_prior_[i] = np.log(X_c.shape[0] / X.shape[0])
counts = X_c.sum(axis=0) + self.alpha
self.feature_log_prob_[i] = np.log(counts / counts.sum())
return self
La idea clave: después del ajuste, la predicción es simplemente una multiplicación de matrices más un sesgo. Por eso Naive Bayes es tan rápido.
GaussianNB
Para características continuas, estimamos la media y la varianza por clase por característica:
class GaussianNB:
def __init__(self):
pass
def fit(self, X, y):
classes = np.unique(y)
self.classes_ = classes
self.means_ = np.zeros((len(classes), X.shape[1]))
self.vars_ = np.zeros((len(classes), X.shape[1]))
self.priors_ = np.zeros(len(classes))
for i, c in enumerate(classes):
X_c = X[y == c]
self.means_[i] = X_c.mean(axis=0)
self.vars_[i] = X_c.var(axis=0) + 1e-9
self.priors_[i] = X_c.shape[0] / X.shape[0]
return self
La predicción utiliza el PDF gaussiano por característica, multiplicado entre las características (agregado en el espacio de registro).
Demostración: clasificación de texto
El código genera datos sintéticos de una bolsa de palabras que simulan dos clases (artículos tecnológicos frente a artículos deportivos). Cada clase tiene una distribución de frecuencia de palabras diferente. MultinomialNB los clasifica usando recuentos de palabras.
Los datos sintéticos funcionan así: creamos 200 "palabras" (columnas de funciones). Las palabras del 0 al 39 tienen alta frecuencia en artículos de tecnología y baja en deportes. Las palabras 80-119 tienen alta frecuencia en deportes y poca en tecnología. Las palabras 40-79 tienen una frecuencia media en ambos. Esto crea un escenario realista en el que algunas palabras son fuertes indicadores de clase y otras son ruido.
Demostración: funciones continuas
El código genera datos similares a Iris (3 clases, 4 características, grupos gaussianos). GaussianNB clasifica utilizando la media y la varianza por clase. Cada clase tiene un centro diferente (vector medio) y una dispersión (varianza) diferente, imitando datos del mundo real donde las mediciones difieren sistemáticamente entre categorías.
El código también demuestra:
- Comparación de suavizado: Entrenamiento MultinomialNB con diferentes valores alfa para mostrar el efecto de la fuerza de suavizado en la precisión.
- Experimento de tamaño de entrenamiento: Cómo mejora la precisión de NB a medida que los datos de entrenamiento aumentan de 20 a 1600 muestras. NB alcanza una precisión decente incluso con muy pocas muestras; esta es su principal ventaja.
- Matriz de confusión: Precisión por clase, recuperación y score F1 para mostrar dónde comete errores NB.
Velocidad de predicción
Naive Bayes la predicción es una multiplicación de matrices. Para n muestras con d características y k clases:
- MultinomialNB: una matriz multiplicada (n x d) @ (d x k) = O(n * d * k)
- GaussianNB: n * k evaluaciones PDF gaussianas, cada una sobre d características = O(n * d * k)
Ambos son lineales en todas las dimensiones. Compare esto con KNN (que requiere cálculo de distancia a todos los puntos de entrenamiento) o SVM con el kernel RBF (que requiere la evaluación del kernel contra todos los vectores de soporte). NB es más rápido en órdenes de magnitud en el momento de la predicción.
Úsalo
Con sklearn, ambas variantes son ingeniosas:
from sklearn.naive_bayes import GaussianNB, MultinomialNB
gnb = GaussianNB()
gnb.fit(X_train, y_train)
print(f"GaussianNB accuracy: {gnb.score(X_test, y_test):.3f}")
mnb = MultinomialNB(alpha=1.0)
mnb.fit(X_train_counts, y_train)
print(f"MultinomialNB accuracy: {mnb.score(X_test_counts, y_test):.3f}")
Para clasificación de texto con sklearn:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline
text_clf = Pipeline([
("vectorizer", CountVectorizer()),
("classifier", MultinomialNB(alpha=1.0)),
])
text_clf.fit(train_texts, train_labels)
accuracy = text_clf.score(test_texts, test_labels)
El código en naive_bayes.py compara implementaciones desde cero con sklearn con los mismos datos para verificar la corrección.
TF-IDF con Naive Bayes
El recuento de palabras sin procesar le da a cada palabra el mismo peso por aparición. Pero palabras comunes como "el" y "es" aparecen con frecuencia en todas las clases y no contienen inentrenamiento. TF-IDF (Frecuencia de términos - Frecuencia de documentos inversa) reduce el peso de las palabras comunes y aumenta el peso de las palabras raras y discriminativas.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline
text_clf = Pipeline([
("tfidf", TfidfVectorizer()),
("classifier", MultinomialNB(alpha=0.1)),
])
Los valores TF-IDF no son negativos, por lo que funcionan con MultinomialNB. La combinación de TF-IDF + MultinomialNB es una de las bases más sólidas para la clasificación de texto. Con frecuencia supera a modelos más complejos en conjuntos de datos con menos de 10.000 muestras de entrenamiento.
BernoulliNB para texto corto
Para textos cortos (tweets, SMS, mensajes de chat), BernoulliNB puede superar a MultinomialNB. Los textos cortos tienen un número bajo de palabras, por lo que la inentrenamiento de frecuencia en la que se basa MultinomialNB es ruidosa. BernoulliNB solo se preocupa por la presencia o ausencia, lo cual es más confiable con texto breve.
from sklearn.naive_bayes import BernoulliNB
from sklearn.feature_extraction.text import CountVectorizer
text_clf = Pipeline([
("vectorizer", CountVectorizer(binary=True)),
("classifier", BernoulliNB(alpha=1.0)),
])
El indicador binary=True en CountVectorizer convierte todos los recuentos a 0/1. Sin él, BernoulliNB todavía funciona, pero registra recuentos para los que no fue diseñado.
Calibración de probabilidades NB
NB Las probabilidades están mal calibradas. Cuando NB dice P(spam) = 0,95, la probabilidad real podría ser 0,7. Si necesita estimaciones de probabilidad confiables (por ejemplo, para establecer un umbral o combinarlos con otros modelos), use CalibratedClassifierCV de sklearn:
from sklearn.calibration import CalibratedClassifierCV
calibrated_nb = CalibratedClassifierCV(MultinomialNB(), cv=5, method="sigmoid")
calibrated_nb.fit(X_train, y_train)
proba = calibrated_nb.predict_proba(X_test)
Esto se ajusta a una regresión logística además de las puntuaciones brutas de NB mediante validación cruzada. Las probabilidades resultantes están mucho más cerca de las verdaderas frecuencias de clase.
Errores comunes
Valores de características negativos. MultinomialNB requiere características no negativas. Si tiene valores negativos (como TF-IDF con ciertas configuraciones o características estandarizadas), use GaussianNB en su lugar o cambie las características para que sean positivas.
Características de variación cero. GaussianNB divide por variación. Si una característica tiene una varianza cero para una clase (todos los valores son idénticos), el cálculo de probabilidad falla. El código agrega un pequeño término de suavizado (1e-9) a todas las variaciones para evitar esto.
Desequilibrio de clases. Si el 99% de los correos electrónicos no son spam, el P(no spam) = 0,99 anterior es tan fuerte que supera la evidencia de probabilidad. Puede configurar las clases anteriores manualmente o usar el parámetro class_prior en sklearn.
Escalado de funciones. MultinomialNB no necesita escalado (funciona con recuentos). GaussianNB tampoco necesita escalamiento (estima estadísticas por función). Esta es una ventaja sobre la regresión logística y SVM, que son sensibles a las escalas de características.
Envíalo
Esta lección produce:
outputs/skill-naive-bayes-chooser.md-- una habilidad de decisión para elegir la variante NB correctacode/naive_bayes.py-- MultinomialNB y GaussianNB desde cero, con comparación de sklearn
Cuando Naive Bayes falla
NB falla cuando el supuesto de independencia provoca clasificaciones incorrectas (no sólo probabilidades incorrectas). Esto sucede cuando:
Fuertes interacciones entre características. Si la clase depende de la combinación de dos características pero no de ninguna de ellas sola (patrones tipo XOR), NB la perderá por completo. Cada característica por sí sola no proporciona evidencia y NB no puede combinarlas de manera no lineal.
Características altamente correlacionadas con evidencia contraria. Si la característica A dice "spam" y la característica B dice "no spam", pero A y B están perfectamente correlacionados (en realidad siempre coinciden), NB verá evidencia contradictoria donde no la hay.
Conjuntos de entrenamiento muy grandes. Con suficientes datos, los modelos discriminativos como la regresión logística aprenden el verdadero límite de decisión y superan a NB. El supuesto de independencia que ayudó con los datos pequeños ahora frena el modelo.
En la práctica, estos modos de falla son raros en la clasificación de textos. Las características del texto son numerosas, individualmente débiles y los errores del supuesto de independencia tienden a anularse. Para datos tabulares con pocas características fuertemente correlacionadas, considere primero la regresión logística o los modelos basados en árboles.
Ejercicios
Experimento de suavizado. Entrene MultinomialNB con datos de texto con valores alfa de 0,01, 0,1, 1,0, 10,0 y 100,0. Precisión del gráfico frente a alfa. ¿Dónde alcanza su punto máximo el rendimiento? ¿Por qué duele un alfa muy alto?
Prueba de independencia de funciones. Tome un conjunto de datos de texto real. Elija dos palabras que estén obviamente correlacionadas ("máquina" y "aprendizaje"). Calcule P (palabra1 | clase) * P (palabra2 | clase) y compárelo con P (palabra1 Y palabra2 | clase). ¿Qué tan equivocado es el supuesto de independencia? ¿Afecta la precisión de la clasificación?
Implementación de Bernoulli. Amplíe el código con una clase BernoulliNB. Convierta una bolsa de palabras a binario (presente/ausente) y compare la precisión con MultinomialNB en datos de texto. ¿Cuándo gana Bernoulli?
NB versus regresión logística. Entrene ambos con datos de texto. Comience con 100 muestras de entrenamiento y aumente a 10 000. Trazar la precisión frente al tamaño del conjunto de entrenamiento para ambos. ¿En qué punto la regresión logística supera a Naive Bayes?
Filtro de spam. Cree un clasificador de spam completo: tokenice el texto sin formato del correo electrónico, desarrolle vocabulario, cree funciones de bolsa de palabras, entrene MultinomialNB, evalúe con precisión y recuerde (no solo precisión, ¿por qué?).
Términos clave
| Término | Lo que dice la gente | Lo que realmente significa |
|---|---|---|
| Naive Bayes | "Clasificador probabilístico simple" | Un clasificador que aplica el teorema Bayes' con el supuesto de que las características son condicionalmente independientes dada la clase |
| Independencia condicional | "Las funciones no se afectan entre sí" | P(A, B | C) = P(A | C) * P(B | C) - conocer B no te dice nada nuevo sobre A una vez que conoces C |
| Alisado de Laplace | "Suavizado adicional" | Agregar un pequeño recuento a cada característica para evitar que las probabilidades cero dominen la predicción |
| Anterior | "Lo que creías antes de ver los datos" | P(clase): la probabilidad de cada clase antes de observar cualquier característica |
| Probabilidad | "Qué tan bien encajan los datos" | P(características | clase): la probabilidad de observar estas características si se conoce la clase |
| Posterior | "Lo que crees después de ver los datos" | P(clase | características): la probabilidad actualizada de la clase después de observar las características |
| Modelo generativo | "Modelos de cómo se generan los datos" | Un modelo que aprende P(X | Y) y P(Y), luego usa el teorema Bayes' para obtener P(Y | X) |
| Modelo discriminativo | "Modela el límite de decisión" | Un modelo que aprende directamente P(Y | X) sin modelar cómo se genera X |
| Probabilidad logarítmica | "Evitar el desbordamiento" | Trabajar con log P en lugar de P para evitar que el producto de muchos números pequeños se convierta en cero en punto flotante |
Lectura adicional
- scikit-learn Naive Bayes docs -- las tres variantes con detalles matemáticos
- McCallum y Nigam, Una comparación de modelos de eventos para Naive Bayes Clasificación de texto (1998) -- la comparación clásica de Multinomial vs Bernoulli para texto
- Rennie et al., Tackling the Poor Assumptions of Naive Bayes Text Classifiers (2003) -- mejoras en NB para texto
- Ng y Jordan, On Discriminative vs. Generative Classifiers (2001) -- demuestra que NB converge más rápido que LR con menos datos