Módulo 5 · Probabilidade e estatística
Probabilidade condicional e Bayes
Aula 5.2 · cerca de 20 minutos
P(A | B) = P(A ∩ B) / P(B) Teorema de Bayes: P(H | E) = P(E | H) · P(H) / P(E)
Bayes inverte a condicional: a partir da chance da evidência dada a hipótese, obtemos a chance da hipótese dada a evidência. P(H) é a priori, P(H | E) é a posteriori.
Exemplo: alerta de fraude
0,1% das transações são fraude. O detector acerta 99% das fraudes e dá falso positivo em 2% das transações legítimas. Se o alerta disparou, qual é a chance de ser fraude?
P(alerta) = 0,99·0,001 + 0,02·0,999 ≈ 0,02097 P(fraude | alerta) = 0,99·0,001 / 0,02097 ≈ 4,7%
Mais de 95% dos alertas são falsos. Com eventos raros, a taxa de falso positivo domina. Isso vale para monitoramento, detecção de spam e exames médicos.
# Filtro de spam Naive Bayes, mínimo
from collections import Counter
import math
def treina(docs): # docs: lista de (palavras, é_spam)
cont = {True: Counter(), False: Counter()}
n = Counter()
for palavras, spam in docs:
cont[spam].update(palavras)
n[spam] += 1
return cont, n
def log_prob(palavras, cls, cont, n, vocab):
total = sum(cont[cls].values())
lp = math.log(n[cls] / sum(n.values()))
for w in palavras: # suavização de Laplace
lp += math.log((cont[cls][w] + 1) / (total + vocab))
return lpDica: Trabalhe com logaritmos de probabilidades. Multiplicar centenas de números pequenos dá underflow para 0.0; somar logs, não.
Exercício 1
Um teste de CI instável falha 30% das vezes quando há bug e 5% das vezes sem bug. 10% dos commits têm bug. O teste falhou: qual é a chance de haver bug?