ML Atlas

Machine learning do zero · Aula 5.4 · 29 de 33 aulas prontas · 12 min

Naive Bayes: suposição falsa, boas decisões

Em resumo

O naive Bayes supõe atributos independentes. Nas pétalas de íris (r = 0,80) acerta 93,3%, mas em 171 tumores de validação declara 98,3% com 88,3% de acurácia.

Aquecimento Duas perguntas de aulas anteriores. Um minuto, e a aula nunca fica bloqueada.
Da aula 5.3: Gradient boosting: árvores que corrigem erros O que a segunda árvore aprende no gradient boosting?

Ver a resposta

Resposta certa: Os resíduos da primeira árvore, isto é, quanto ela ainda está errando

Cada árvore seguinte recebe os resíduos do conjunto anterior e soma uma correção vezes a taxa de aprendizado. Amostras aleatórias e árvores independentes são a floresta aleatória.

Da aula 5.2: Ensembles: por que muitas árvores vencem uma só O que é uma amostra bootstrap?

Ver a resposta

Resposta certa: Linhas sorteadas do conjunto de treino com reposição

Sortear com reposição dá a cada árvore um conjunto de dados um pouco diferente, o que faz as árvores discordarem de forma útil.

Uma médica vê febre e tosse. Até que ponto isso indica gripe? O naive Bayes responde assim: pegue o quanto a gripe é comum em geral (esse é o prior), multiplique pelo quanto a febre é típica em quem tem gripe e pelo quanto a tosse é típica nessas pessoas. Faça o mesmo para outras doenças e escolha o maior produto. O modelo é “ingênuo” porque multiplica os sintomas como se, dentro de cada doença, eles fossem independentes entre si. Em dados reais, quase nunca são.

Preveja, depois confira O naive Bayes deve reconhecer a espécie de uma íris pelo comprimento e pela largura da pétala. Ele supõe que, dentro de uma espécie, essas duas medidas são independentes. Nas íris versicolor, porém, elas se correlacionam com r = 0,80: uma pétala mais comprida costuma ser mais larga. A suposição precisa ser verdadeira para o modelo reconhecer bem as espécies?
Qual é o seu grau de certeza?

Experimento interativo

Este experimento interativo funciona em um navegador com JavaScript ativado. O texto ao redor descreve o que ele mostra.

Ver a resposta

Resposta certa: Não, porque para decidir basta que a espécie certa receba o maior produto

Não: nas pétalas o modelo acerta 93,3% das flores de teste, 3 erros em 45. O que a suposição falsa estraga são as porcentagens. Na lição 2.4, o naive Bayes em 171 biópsias de validação declarava em média 98,3% de confiança e acertava 88,3%.

Experimente

  • Comece pelas sépalas. Como estão dispostas as elipses das espécies, e onde fica a sonda quando o modelo hesita?
  • Mude para as pétalas. Em qual espécie as medidas se correlacionam mais, e quanto o modelo acerta na validação?
  • Vá para os tumores. Compare só o raio com o trio raio, perímetro, área. O que acontece com a confiança, e o que acontece com a acurácia?
  • Com as 10 medidas, conte quantos tumores de calibração recebem confiança acima de 99%.

Depois de conferir no lab, vamos dar nome ao que você vê.

A ideia em palavras simples

Para cada espécie, o naive Bayes guarda só dois números por medida: a média e a dispersão (variância). Com eles faz uma curva em sino: o quanto um certo comprimento de pétala é típico para setosa, para versicolor, para virginica. Uma flor nova recebe um produto por espécie: prior × densidade do comprimento × densidade da largura. O maior vence. Dividindo cada produto pela soma dos três, você obtém as probabilidades das espécies, o posterior.

A independência é uma suposição sobre a forma: as elipses das espécies ficam alinhadas com os eixos, não inclinadas. Nas pétalas isso é falso, em versicolor r = 0,80. Mesmo assim o modelo acerta 97,1% na validação e 93,3% no teste. Uma decisão não precisa de produtos exatos, só que a espécie certa tenha o maior. Nas pétalas, as espécies estão separadas o bastante para que até elipses tortas costumem apontar para o lado certo.

Com as porcentagens a coisa é pior. Nos tumores de mama, o raio, o perímetro e a área são quase uma medida só: o raio se correlaciona com o perímetro com r = 0,998 e com a área com r = 0,987. O naive Bayes os multiplica como três evidências independentes, então conta a mesma evidência três vezes. Nas 132 biópsias de calibração da lição 2.4, só o raio dá acurácia de 88,6% e confiança média declarada de 89,2%. Raio, perímetro e área juntos: acurácia 86,4%, confiança 96,5%. Três cópias sobem, portanto, a confiança, não a acurácia. As 10 medidas trazem também informação nova, como textura e suavidade: a acurácia sobe para 93,9%, mas a confiança (98,5%) continua acima dela.

Jak to policzono
  • Íris: Iris (Fisher, 1936; UCI, licença CC BY 4.0), 150 flores, 3 espécies. Divisão estratificada: 105 flores para aprender, 45 para o teste. Validação: validação cruzada em 5 partes dentro das 105 flores.
  • Tumores: Breast Cancer Wisconsin (Diagnostic) (Wolberg et al., 1993; UCI, licença CC BY 4.0), 569 biópsias, 10 medidas “mean”. Divisão e nomes como na lição 2.4: 266 biópsias para aprender, 132 de calibração (nelas o lab compara os conjuntos de medidas) e 171 de validação, só para olhar.
  • Modelo: naive Bayes com distribuição normal, como o GaussianNB do scikit-learn; os números do lab batem com ele.

Por que funciona

Um classificador só erra quando uma espécie errada recebe o maior produto. Domingos e Pazzani (1997) mostraram que, por esse critério, o naive Bayes pode ser o melhor possível mesmo com atributos muito dependentes: o que conta é a ordem dos produtos, não o valor deles. A suposição tem, porém, um preço. Um modelo que leva a correlação em conta (elipses inclinadas, a chamada análise discriminante quadrática, QDA) acerta nas pétalas em média 97,1% em outras 20 divisões, contra 95,8% do naive Bayes. É melhor em 11 divisões e pior em nenhuma. Nas sépalas, o naive Bayes se sai em média melhor: 80,0% contra 78,8%. Costuma-se explicar isso por ele ter menos números para estimar a partir de 105 flores.

O excesso de confiança não é capricho de uma divisão. Em outras 20 divisões dos tumores, só o raio dá uma diferença entre confiança e acurácia de −3,6 a 2,2 pontos. Raio, perímetro e área juntos dão sempre mais confiança que acurácia: de 4,9 a 11,5 pontos. As 10 medidas: de 4,7 a 10,8 pontos.

Um erro comum

Verdadeiro ou falso: “suposição falsa é modelo inútil”. Falso. Nas pétalas a suposição de independência é claramente falsa, e o modelo acerta 93,3% das flores de teste. No código abaixo, ele faz 0,960 na validação cruzada, quase tanto quanto o modelo com correlações (0,973). O que a suposição falsa estraga são as porcentagens: com as 10 medidas do tumor, o modelo declara 0,990 e acerta 0,906.

A conclusão prática: confie nas decisões do naive Bayes até onde a validação mostra. Não confie nas porcentagens dele sem calibrá-las em dados separados (lição 2.4).

Quiz

Três perguntas para você se testar. Escolha uma resposta ou abra a resposta embaixo de cada pergunta. No teclado: as setas escolhem, Enter ou Espaço confirma.

1. O que o naive Bayes multiplica para julgar se uma flor é versicolor?
Ver a resposta

Resposta certa: O prior de versicolor e a densidade de cada medida em versicolor, à parte

Prior × densidade do comprimento × densidade da largura, cada uma calculada só com a média e a variância dessa medida em versicolor. Vence a espécie com o maior produto.

2. Em versicolor, o comprimento e a largura da pétala se correlacionam com r = 0,80, e o modelo acerta 93,3% das flores de teste. O que se conclui?
Ver a resposta

Resposta certa: Para decidir, basta que a espécie certa receba o maior produto

A suposição falsa muda os valores dos produtos, mas raramente a ordem deles quando as espécies estão longe. O modelo com correlações acerta em média só um pouco mais.

3. Verdadeiro ou falso: “suposição falsa é modelo inútil”.
Ver a resposta

Resposta certa: Falso, porque a acurácia pode ser alta mesmo que a suposição estrague as porcentagens

Nas pétalas o modelo acerta 93,3% apesar de r = 0,80. Em compensação, mente nas porcentagens: com 10 medidas, nas 171 biópsias de validação da lição 2.4, declara 98,3% e acerta 88,3%.

Pontos-chave

  • O naive Bayes multiplica o prior e as densidades dos atributos isolados como se, dentro de uma classe, fossem independentes.
  • Uma suposição falsa não arruína as decisões: nas pétalas de íris (r = 0,80), o modelo acerta 93,3% das flores de teste.
  • Em compensação, estraga as porcentagens: atributos correlacionados contam a mesma evidência várias vezes, então em 171 biópsias de validação o modelo declara 98,3% com 88,3% de acurácia.
  • Confie nas decisões até onde a validação mostra; nas porcentagens, só depois de calibrar em dados separados.

Mais a fundo: fórmula, código, prática

A matemática

O teorema de Bayes com a suposição de independência: P(c | x) ∝ P(c) · ∏ⱼ p(xⱼ | c), e com distribuição normal p(xⱼ | c) = N(xⱼ; μ_cj, σ²_cj). O modelo escolhe a classe com o maior log P(c) + Σⱼ log p(xⱼ | c).

Cópias de um atributo: se a mesma informação entra k vezes, sua contribuição para a diferença de logaritmos entre classes cresce k vezes. A ordem das pontuações fica parecida, mas as diferenças crescem, então o posterior foge para 0 ou 1.

No código (Python)

O mesmo experimento no scikit-learn: naive Bayes e um modelo com correlações (QDA) em dois pares de medidas de íris na validação cruzada, depois confiança e acurácia nos tumores com 1, 3 e 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]  # correlação 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)}")

Saída

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

As divisões são diferentes das do lab, e aqui a correlação é calculada com as 50 flores versicolor (0,79), então os números são um pouco diferentes. O quadro é o mesmo: nas pétalas o naive Bayes faz 0,960, quase como a QDA (0,973), e nas sépalas até mais (0,793 contra 0,773). Nos tumores, a confiança sobe de 0,884 para 0,990, e a acurácia só de 0,883 para 0,906.

Para quem pratica
  • No scikit-learn: GaussianNB para números, MultinomialNB e ComplementNB para contagens de palavras em texto, BernoulliNB para atributos sim/não. O modelo aprende numa única passada pelos dados, então é um ponto de referência rápido, sobretudo para texto (filtros de spam).
  • Quando as porcentagens importam, calibre: CalibratedClassifierCV(GaussianNB(), method="sigmoid") ajusta a calibração em validação cruzada.
  • De atributos quase idênticos (raio, perímetro, área), fique com um ou junte-os num só. O naive Bayes vai contar cada cópia como uma evidência à parte.
  • var_smoothing soma um pouco a cada variância, para que uma medida que quase não varia dentro de uma classe não dê densidade perto de zero para cada exemplo novo.

Vá mais fundo no Atlas

Verbetes da enciclopédia sobre as ideias desta aula: