ML Atlas

Machine learning desde cero · Lección 5.4 · 29 de 33 lecciones listas · 12 min

Naive Bayes: un supuesto falso, buenas decisiones

En pocas palabras

Naive Bayes supone variables independientes. Con pétalos de iris (r = 0,80) acierta un 93,3%; en 171 tumores de validación declara un 98,3% y acierta un 88,3%.

Calentamiento Dos preguntas de lecciones anteriores. Un minuto, y no bloquea la lección.
De la lección 5.3: Gradient boosting: árboles que corrigen errores ¿Qué aprende el segundo árbol en el gradient boosting?

Ver la respuesta

Respuesta correcta: Los residuos del primer árbol, es decir, cuánto se sigue equivocando este

Cada árbol siguiente recibe los residuos del conjunto anterior y suma una corrección por la tasa de aprendizaje. Las muestras aleatorias y los árboles independientes son el bosque aleatorio.

De la lección 5.2: Ensambles: por qué muchos árboles superan a uno ¿Qué es una muestra bootstrap?

Ver la respuesta

Respuesta correcta: Filas extraídas al azar del conjunto de entrenamiento, con reemplazo

Extraer con reemplazo da a cada árbol un conjunto de datos un poco distinto, lo que hace que los árboles discrepen de forma útil.

Una médica ve fiebre y tos. ¿Hasta qué punto eso apunta a la gripe? Naive Bayes responde así: toma lo frecuente que es la gripe en general (eso es el prior), multiplícalo por lo típica que es la fiebre en quienes tienen gripe y por lo típica que es en ellos la tos. Haz lo mismo con otras enfermedades y elige el producto más grande. El modelo es «ingenuo» porque multiplica los síntomas como si, dentro de cada enfermedad, fueran independientes entre sí. En datos reales casi nunca lo son.

Predice y comprueba Naive Bayes debe reconocer la especie de un iris por la longitud y la anchura del pétalo. Supone que, dentro de una especie, esas dos medidas son independientes. Sin embargo, en los iris versicolor se correlacionan con r = 0,80: un pétalo más largo suele ser más ancho. ¿Tiene que ser cierto el supuesto para que el modelo reconozca bien las especies?
¿Qué tan seguro estás?

Experimento interactivo

Este experimento interactivo funciona en un navegador con JavaScript activado. El texto que lo rodea describe lo que muestra.

Ver la respuesta

Respuesta correcta: No, porque para decidir basta con que la especie correcta obtenga el producto más grande

No: con los pétalos el modelo acierta el 93,3% de las flores de prueba, 3 errores de 45. Lo que estropea el supuesto falso son los porcentajes. En la lección 2.4 naive Bayes con 171 biopsias de validación declaraba de media un 98,3% de confianza y acertaba un 88,3%.

Prueba

  • Empieza con los sépalos. ¿Cómo están colocadas las elipses de las especies y dónde está la sonda cuando el modelo duda?
  • Cambia a los pétalos. ¿En qué especie se correlacionan más las medidas y cuánto acierta el modelo en validación?
  • Pasa a los tumores. Compara solo el radio con el trío radio, perímetro, área. ¿Qué pasa con la confianza y qué con la exactitud?
  • Con las 10 medidas, cuenta cuántos tumores de calibración reciben una confianza superior al 99%.

Cuando lo hayas comprobado en el lab, pongamos nombre a lo que ves.

La idea en palabras sencillas

Para cada especie, naive Bayes guarda solo dos números por medida: la media y la dispersión (varianza). Con ellos dibuja una campana: lo típica que es una longitud de pétalo para setosa, para versicolor, para virginica. Una flor nueva recibe un producto por especie: prior × densidad de la longitud × densidad de la anchura. Gana el mayor. Si divides cada producto por la suma de los tres, obtienes las probabilidades de las especies, el posterior.

La independencia es un supuesto sobre la forma: las elipses de las especies están alineadas con los ejes, no inclinadas. Con los pétalos es falso, en versicolor r = 0,80. Y aun así el modelo acierta un 97,1% en validación y un 93,3% en la prueba. Para decidir no hacen falta productos exactos, solo que la especie correcta tenga el mayor. Con los pétalos las especies están lo bastante separadas como para que incluso unas elipses mal dibujadas suelan señalar bien.

A los porcentajes les va peor. En los tumores de mama, el radio, el perímetro y el área son casi una sola medida: el radio se correlaciona con el perímetro con r = 0,998 y con el área con r = 0,987. Naive Bayes los multiplica como tres pruebas independientes, así que cuenta la misma prueba tres veces. En las 132 biopsias de calibración de la lección 2.4, solo el radio da una exactitud del 88,6% y una confianza media declarada del 89,2%. Radio, perímetro y área juntos: exactitud 86,4%, confianza 96,5%. Tres copias suben, pues, la confianza, no la exactitud. Las 10 medidas aportan además información nueva, como la textura y la suavidad: la exactitud sube al 93,9%, pero la confianza (98,5%) sigue por encima.

Jak to policzono
  • Iris: Iris (Fisher, 1936; UCI, licencia CC BY 4.0), 150 flores, 3 especies. Partición estratificada: 105 flores para aprender, 45 para la prueba. Validación: validación cruzada de 5 partes dentro de las 105 flores.
  • Tumores: Breast Cancer Wisconsin (Diagnostic) (Wolberg et al., 1993; UCI, licencia CC BY 4.0), 569 biopsias, 10 medidas «mean». Partición y nombres como en la lección 2.4: 266 biopsias para aprender, 132 de calibración (en ellas el lab compara los conjuntos de medidas) y 171 de validación, solo para mirar.
  • Modelo: naive Bayes con distribución normal, como GaussianNB de scikit-learn; los números del lab coinciden con él.

Por qué funciona

Un clasificador solo se equivoca cuando una especie equivocada obtiene el mayor producto. Domingos y Pazzani (1997) demostraron que, con esta medida, naive Bayes puede ser el mejor posible incluso con variables muy dependientes: cuenta el orden de los productos, no su valor. El supuesto tiene, eso sí, un precio. Un modelo que tiene en cuenta la correlación (elipses inclinadas, el llamado análisis discriminante cuadrático, QDA) acierta con los pétalos de media un 97,1% en otras 20 particiones, frente al 95,8% de naive Bayes. Es mejor en 11 particiones y peor en ninguna. Con los sépalos naive Bayes sale de media mejor: 80,0% frente a 78,8%. Se suele explicar porque tiene menos números que estimar a partir de 105 flores.

El exceso de confianza no es una rareza de una partición. En otras 20 particiones de los tumores, solo el radio da una diferencia entre confianza y exactitud de −3,6 a 2,2 puntos. Radio, perímetro y área juntos dan siempre más confianza que exactitud: de 4,9 a 11,5 puntos. Las 10 medidas: de 4,7 a 10,8 puntos.

Un error frecuente

Verdadero o falso: «un supuesto falso significa un modelo inútil». Falso. Con los pétalos el supuesto de independencia es claramente falso, y el modelo acierta el 93,3% de las flores de prueba. En el código de abajo logra 0,960 en validación cruzada, casi tanto como el modelo con correlaciones (0,973). Lo que estropea el supuesto falso son los porcentajes: con las 10 medidas del tumor el modelo declara 0,990 y acierta 0,906.

La conclusión práctica: fíate de las decisiones de naive Bayes tanto como muestre la validación. No te fíes de sus porcentajes sin calibrarlos con datos aparte (lección 2.4).

Test

Tres preguntas para comprobar lo aprendido. Elige una respuesta o despliega la solución bajo cada pregunta. Con el teclado: las flechas eligen, Enter o Espacio confirma.

1. ¿Qué multiplica naive Bayes para juzgar si una flor es versicolor?
Ver la respuesta

Respuesta correcta: El prior de versicolor y la densidad de cada medida en versicolor, aparte

Prior × densidad de la longitud × densidad de la anchura, cada una calculada solo con la media y la varianza de esa medida en versicolor. Gana la especie con el mayor producto.

2. En versicolor la longitud y la anchura del pétalo se correlacionan con r = 0,80, y el modelo acierta el 93,3% de las flores de prueba. ¿Qué se deduce?
Ver la respuesta

Respuesta correcta: Para decidir basta con que la especie correcta obtenga el producto más grande

El supuesto falso cambia los valores de los productos, pero rara vez su orden cuando las especies están lejos. El modelo con correlaciones acierta de media solo un poco más.

3. Verdadero o falso: «un supuesto falso significa un modelo inútil».
Ver la respuesta

Respuesta correcta: Falso, porque la exactitud puede ser alta aunque el supuesto estropee los porcentajes

Con los pétalos el modelo acierta un 93,3% pese a r = 0,80. Miente, en cambio, en los porcentajes: con 10 medidas, en las 171 biopsias de validación de la lección 2.4, declara un 98,3% y acierta un 88,3%.

Ideas clave

  • Naive Bayes multiplica el prior y las densidades de variables sueltas como si, dentro de una clase, fueran independientes.
  • Un supuesto falso no arruina las decisiones: con los pétalos de iris (r = 0,80) el modelo acierta el 93,3% de las flores de prueba.
  • Lo que estropea son los porcentajes: las variables correlacionadas cuentan la misma prueba varias veces, así que en 171 biopsias de validación el modelo declara un 98,3% con un 88,3% de exactitud.
  • Fíate de las decisiones tanto como muestre la validación; de los porcentajes, solo tras calibrarlos con datos aparte.

Más a fondo: fórmula, código, práctica

Las matemáticas

Teorema de Bayes con el supuesto de independencia: P(c | x) ∝ P(c) · ∏ⱼ p(xⱼ | c), y con distribución normal p(xⱼ | c) = N(xⱼ; μ_cj, σ²_cj). El modelo elige la clase con el mayor log P(c) + Σⱼ log p(xⱼ | c).

Copias de una variable: si la misma información entra k veces, su aporte a la diferencia de logaritmos entre clases crece k veces. El orden de las puntuaciones se parece, pero las diferencias crecen, así que el posterior se escapa hacia 0 o 1.

En código (Python)

El mismo experimento en scikit-learn: naive Bayes y un modelo con correlaciones (QDA) con dos pares de medidas de iris en validación cruzada, y luego confianza y exactitud en los tumores con 1, 3 y 10 medidas.

from sklearn.datasets import load_iris, load_breast_cancer
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis

iris = load_iris(as_frame=True)
for part in ["sepal", "petal"]:
    cols = [f"{part} length (cm)", f"{part} width (cm)"]
    r = iris.data[iris.target == 1][cols].corr().iloc[0, 1]  # correlación dentro de versicolor
    nb = cross_val_score(GaussianNB(), iris.data[cols], iris.target, cv=10).mean()
    qda = cross_val_score(QuadraticDiscriminantAnalysis(), iris.data[cols], iris.target, cv=10).mean()
    print(f"{part}s: versicolor r = {r:.2f}; 10-fold CV accuracy: naive Bayes {nb:.3f}, with correlations (QDA) {qda:.3f}")
bc = load_breast_cancer(as_frame=True)
X, y = bc.data.iloc[:, :10], 1 - bc.target
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, stratify=y, random_state=0)
for cols in [["mean radius"], ["mean radius", "mean perimeter", "mean area"], list(X.columns)]:
    p = GaussianNB().fit(X_tr[cols], y_tr).predict_proba(X_te[cols])
    acc, conf = (p.argmax(1) == y_te).mean(), p.max(1).mean()
    print(f"{len(cols):2d} of 10 measurements: accuracy {acc:.3f}, mean declared confidence {conf:.3f}, over 99% sure: {(p.max(1) > 0.99).sum()} of {len(y_te)}")

Resultado

sepals: versicolor r = 0.53; 10-fold CV accuracy: naive Bayes 0.793, with correlations (QDA) 0.773
petals: versicolor r = 0.79; 10-fold CV accuracy: naive Bayes 0.960, with correlations (QDA) 0.973
 1 of 10 measurements: accuracy 0.883, mean declared confidence 0.884, over 99% sure: 26 of 171
 3 of 10 measurements: accuracy 0.895, mean declared confidence 0.969, over 99% sure: 127 of 171
10 of 10 measurements: accuracy 0.906, mean declared confidence 0.990, over 99% sure: 150 of 171

Las particiones son distintas de las del lab, y aquí la correlación se calcula con las 50 flores versicolor (0,79), así que los números son algo distintos. La imagen es la misma: con los pétalos naive Bayes logra 0,960, casi como QDA (0,973), y con los sépalos incluso más (0,793 frente a 0,773). En los tumores la confianza sube de 0,884 a 0,990, y la exactitud solo de 0,883 a 0,906.

Para profesionales
  • En scikit-learn: GaussianNB para números, MultinomialNB y ComplementNB para recuentos de palabras en texto, BernoulliNB para variables de sí/no. El modelo aprende en una sola pasada por los datos, así que es un punto de referencia rápido, sobre todo para texto (filtros de spam).
  • Cuando los porcentajes importan, calibra: CalibratedClassifierCV(GaussianNB(), method="sigmoid") ajusta la calibración en validación cruzada.
  • De las variables casi idénticas (radio, perímetro, área) quédate con una o júntalas en una. Naive Bayes contará cada copia como una prueba aparte.
  • var_smoothing suma un poco a cada varianza, para que una medida que apenas varía dentro de una clase no dé una densidad cercana a cero para cada ejemplo nuevo.

Profundiza en el Atlas

Entradas de la enciclopedia sobre las ideas de esta lección: