14 Predição e Generalização
Este capítulo faz parte de um livro em desenvolvimento ativo e ainda não passou pela revisão do autor. O conteúdo pode mudar conforme a revisão avança.
A decisão de pesquisa. Decida se a sua pergunta é mesmo uma previsão sobre casos que ninguém viu ainda e, se for, assine um contrato de quatro partes antes de ajustar qualquer coisa: alvo, linha de base, divisão, métrica, mais uma checagem de vazamento. É esse contrato que permite defender uma pontuação modesta e honesta e dizer em voz alta onde a sua previsão para de funcionar.
14.1 Por que essa decisão importa
A decisão em jogo: se você está prevendo casos não vistos e, se estiver, qual pontuação você aceitaria como honesta.
Imagine uma gestora de saúde pública municipal que precisa decidir, semana a semana, se emite um alerta contra o banho em um lago. Florações de cianobactérias podem transformar uma praia segura em risco à saúde em poucos dias. Chega um fornecedor com um modelo que sinaliza florações nocivas “com 94% de acurácia”.
“Noventa e quatro por cento comparado a O QUÊ? Na maioria das semanas este lago está bem, então, se eu simplesmente disser ‘sem floração’ toda santa semana, já acerto umas oitenta e cinco por cento das vezes. Se o seu modelo não superar isso com folga, e provar que superou em semanas que ele nunca estudou, eu não fecho uma praia pública na palavra dele.” — uma gestora de saúde pública que já se queimou com um número de aparência impressionante
Essa gestora faz as duas perguntas que este capítulo treina você a responder antes de confiar em qualquer previsão. Ela é melhor que a regra honesta mais burra? E foi conquistada em casos que o modelo nunca viu? Erre isso e você grita “lobo!” ou deixa passar um risco real.
14.2 O conceito
Uma predição é o melhor palpite sobre um caso cujo desfecho você ainda não consegue ver. Exemplo: prever se um lago vai ter floração na semana que vem, antes de a semana que vem existir. Predição é descritiva, não causal. Ela prevê o que vai acontecer, nunca por quê.
O que faz da predição uma pergunta própria é o seu alcance, os casos que uma alegação pretende cobrir. O alcance da predição são os casos não vistos, unidades que não estão nos seus dados e cujo desfecho ainda é desconhecido, como as amostras do mês que vem. A prima dela é a generalização, o alcance que vai da sua amostra para uma população mais ampla, como dos doze lagos que você mediu para todos os lagos da bacia. As duas vão além dos dados em mãos, e as duas só são honestas quando você consegue nomear o cruzamento que as autoriza.
Uma previsão ganha confiança sob um contrato de quatro partes, em ordem fixa. O alvo é a única coluna que você prevê, por exemplo bloom_next_week. A linha de base é a regra honesta mais burra que você precisa superar, em geral “sempre chutar a resposta mais comum”; se 85% das semanas não têm floração, essa regra marca 85% de graça, então 85% é a régua. A métrica é como você conta pontos, casada com o alvo; a acurácia engana quando florações são raras, então a revocação na classe “floração”, a fatia das florações reais que o modelo pega, costuma importar mais. Escolha a que escolher, pontue a linha de base e cada candidato com a mesma métrica, ou a comparação não significa nada.
A divisão é onde a maioria das previsões de aparência honesta se perde, então ela ganha três partes em vez de duas. O conjunto de treino são os dados com que cada modelo candidato aprende. Exemplo: o modelo acerta os coeficientes dele no seu primeiro verão. O conjunto de seleção são dados separados que você usa para escolher entre candidatos. Exemplo: você compara três listas de variáveis e escolhe uma no segundo verão. O holdout final são os dados que você tranca e abre uma vez só, depois que toda escolha está feita. Exemplo: só o modelo que você já escolheu chega a tocar o terceiro verão.
Rode nessa ordem. Ajuste no treino, escolha na seleção, depois pontue a sua única escolha no holdout final. A razão do passo do meio é fácil de perder. Quando você tenta doze modelos e fica com a melhor nota que viu, essa nota vencedora está lisonjeada pela sorte, em média: algum modelo sempre ia parecer o melhor naqueles dados específicos, em parte porque os erros dele calharam de cair de um jeito gentil ali. Em qualquer divisão isolada a lisonja pode ser grande, pequena ou até invertida; ao longo de muitas divisões ela aponta para cima. O viés de seleção de modelo é essa lisonja, a distância entre a nota de um vencedor nos dados que o coroaram e a nota honesta dele em dados que ele nunca encontrou. Relate a nota da coroação como final e você vai prometer um desempenho que o modelo não entrega.
Uma consequência vale ser dita com todas as letras. Se o holdout final fizer você voltar e mudar uma variável, um limiar ou um modelo, ele entrou no desenvolvimento e deixou de ser prova. Você então precisa de dados novos e intocados para a próxima checagem final. No fluxo simples que este livro ensina, ver a nota final lacra a análise; qualquer mudança depois disso quebra o lacre. Especialistas têm técnicas para reuso cuidadoso, e elas ficam fora deste capítulo, então segure a regra simples até ter uma razão defendida para não segurar.
Uma armadilha está acima de todas as outras. Vazamento de dados é informação que chega ao seu modelo, ou à sua escolha de modelo, que não estaria disponível no momento real da previsão. Exemplo: a concentração de toxinas medida durante a floração. Uma variável vazada infla a sua pontuação nos dados de hoje e desaba nos de amanhã, porque ela não vai existir quando você realmente precisar da previsão. Escolher o seu modelo no holdout final é a mesma falha com outra roupa, já que aquela nota devia representar dados que você nunca viu.
O tempo carrega a própria versão dessa armadilha. Quando o seu alvo é a semana que vem, as suas semanas de prova deveriam vir depois das semanas com que você aprendeu. Dividir as semanas ao acaso entrega agosto ao modelo e pede que ele preveja julho, o que responde o quanto ele preenche semanas passadas espalhadas, e não o quanto ele prevê a próxima. Mantenha os blocos em ordem de calendário, e deixe o bloco mais recente ser o que você tranca. Esse é o padrão que imita como a previsão vai realmente ser usada; especialistas o relaxam em casos estreitos e argumentados, e nenhum deles começa embaralhando o calendário.
14.3 Um exemplo trabalhado
Suponha que você queira avisar quem nada no lago com uma semana de antecedência. O seu alvo é bloom_next_week, um se o lago ultrapassa o limiar do alerta e zero caso contrário. Ao longo de três verões de amostras semanais, 85% das semanas estão limpas, então a sua linha de base, “sempre dizer que não há floração”, marca 0,85 sem modelo nenhum.
Você mantém variáveis genuinamente conhecidas com uma semana de antecedência: temperatura da água, chuva recente, carga de fósforo rio acima. Os três verões dão a você os seus três papéis sem embaralhar nada. O verão um treina os seus modelos candidatos. O verão dois escolhe entre eles. O verão três fica trancado até a escolha estar feita. Você ajusta um modelo logístico (um classificador padrão de sim ou não) e compara algumas listas de variáveis no verão dois. Depois abre o verão três uma vez só, para o vencedor sozinho. Pontuado na mesma métrica da linha de base, a acurácia, o modelo fica em torno de 0,88 contra os 0,85 da linha de base (estas notas são construídas para o exemplo). Essa vantagem de três pontos parece pequena, e a pequenez dela é o resultado honesto: uma vitória verdadeira e modesta vale mais que uma vitória falsa e dramática. Você ainda relata a revocação ao lado, já que a acurácia sozinha esconde as florações perdidas.
Aí uma colaboradora bem-intencionada acrescenta chlorophyll_a, a leitura do pigmento. A pontuação salta para 0,97. Empolgante, até você perguntar quando a clorofila é medida: durante a própria floração que você está prevendo. É o desfecho usando outro crachá. Tire a variável e a pontuação volta para 0,88. Quem decide é o teste de temporalidade, não a acurácia. E, como você treinou em um lago raso, você nomeia a fronteira em voz alta: em um reservatório fundo e frio o padrão pode não valer, então a previsão ainda não generaliza para lá.
14.4 Uma simulação com semente
O capítulo alega duas coisas ao mesmo tempo, e o código abaixo mostra as duas. Um modelo pode ficar melhor nos dados que já viu enquanto piora nos casos que nunca viu. E a nota que coroou o seu vencedor o lisonjeia, em média. A semente torna a rodada reproduzível: o mesmo código sempre sorteia os mesmos mundos.
A primeira metade constrói um mundo (uma curva senoidal mais ruído) e roda o protocolo que você acabou de aprender: doze polinômios ajustados no treino, comparados na seleção, e o vencedor sozinho pontuado uma vez em um holdout final. A segunda metade mede o viés de seleção de modelo do jeito que a definição exige, como uma média ao longo de repetições. Em cada um de 500 mundos novos ela pergunta: como o erro verdadeiro do vencedor se compara com a nota de seleção que o coroou? Ninguém mede o erro verdadeiro de um modelo com exatidão, então o código o representa com dez mil pontos novos, uma aproximação de alta precisão nesta simulação e muito mais do que qualquer estudo real teria. Cada metade reinicia a semente, então você pode rodar qualquer uma sozinha e obter estes mesmos números.
import numpy as np
SEED = 464
graus = np.arange(1, 13)
def mundo(rng, n):
x = rng.uniform(-3, 3, n)
return x, np.sin(1.5 * x) + rng.normal(0, .35, n)
def rmse(coefs, dados):
x, y = dados
return np.sqrt(np.mean((np.polyval(coefs, x) - y) ** 2))
# Primeira metade: um mundo, os três papéis.
rng = np.random.default_rng(SEED)
treino, selecao, final = (mundo(rng, 40) for _ in range(3))
ajustes = [np.polyfit(treino[0], treino[1], g) for g in graus]
err_sel = np.array([rmse(c, selecao) for c in ajustes])
escolhido = int(np.argmin(err_sel)) # escolhido na SELEÇÃO, nunca no final
print("grau escolhido:", graus[escolhido])
print("nota de seleção que o escolheu:", round(float(err_sel[escolhido]), 3))
print("a sua única nota no holdout final:", round(rmse(ajustes[escolhido], final), 3))
# Segunda metade: otimismo em expectativa. Reinicie a semente para que este
# estudo se reproduza sozinho.
rng = np.random.default_rng(SEED)
diferencas = []
for _ in range(500):
tr, sel, grande = mundo(rng, 40), mundo(rng, 40), mundo(rng, 10_000)
f = [np.polyfit(tr[0], tr[1], g) for g in graus]
se = np.array([rmse(c, sel) for c in f])
pick = int(np.argmin(se))
diferencas.append(rmse(f[pick], grande) - se[pick]) # verdadeiro menos a coroa
diferencas = np.asarray(diferencas)
print("otimismo médio:", round(float(diferencas.mean()), 3), "RMSE")
print("mediana:", round(float(np.median(diferencas)), 3))
print("vencedor de fato pior que a nota da coroação em",
round(100 * float((diferencas > 0).mean()), 1), "% dos mundos")
print("maior diferença isolada:", round(float(diferencas.max()), 2))
Leia o painel da esquerda primeiro. O erro de treino azul só cai: cada grau extra de flexibilidade deixa o modelo se dobrar para mais perto de pontos que ele já viu. O erro de seleção laranja cai enquanto o modelo está aprendendo sinal, chega ao fundo perto do grau seis e sobe quando o modelo começa a decorar ruído. Nada na linha azul sozinha diria a você para parar no seis. Só dados que o ajuste nunca tocou dizem isso.
Agora o painel da direita, e leia-o como uma média, porque é isso que o viés é. Ao longo de 500 mundos o erro verdadeiro do vencedor excede a nota que o coroou em 0,025 RMSE em média (mediana 0,015), e o vencedor sai pior que a nota da coroação em 64 por cento dos mundos. No outro terço a sorte correu para o outro lado, e é por isso que nenhuma divisão isolada mostra o viés a você: ele é uma inclinação na pilha, não uma propriedade de cada rodada.
Depois olhe a seta. Em 4 dos 500 mundos a diferença passou de mais 0,3, chegando a mais 1,86, porque um ajuste absurdamente flexível calhou de vencer a seleção e depois disparou para fora dos seus dados. Esses mundos não são ruído para aparar. São o risco real do procedimento se mostrando, e qualquer média que você relate tem de assumi-los. O resumo honesto nomeia as três coisas: a inclinação (a média), o caso típico (a mediana) e a cauda (quão ruim, com que frequência). No notebook companheiro, aumente o ruído (o .35) e veja as três crescerem: quanto mais ruidoso o mundo, mais o vencedor deve à sorte.
14.5 O laboratório em Colab
Este capítulo tem o seu próprio notebook companheiro — abra-o no Colab pelo selo acima. O notebook reúne os prompts e o código do capítulo e termina com o espaço de trabalho Agora é a sua vez, para você completar a etapa do capítulo no seu projeto sem sair do Colab. O laboratório completo de sala de aula por trás deste capítulo é o notebook do curso nb08 — Prediction: generalizing to unseen cases (abrir no Colab), parte do curso companheiro apresentado no apêndice Para instrutores. No laboratório você assina o contrato de quatro partes em um conjunto de dados real, pontua primeiro uma linha de base honesta e depois constrói um vazamento de propósito, para sentir uma pontuação falsa subir e aprender a caçá-la por correlação e por temporalidade antes de retreinar limpo.
14.6 Prompts de IA recomendados
Comprometa-se com a sua própria resposta primeiro, depois delegue. Cole saída de verdade, nunca um número que você lembra. Espere rodar cada prompt mais de uma vez: leia a resposta, nomeie a parte em que você não acredita, devolva essa objeção para dentro do prompt e rode de novo. Ferramentas que rodam esse loop sozinhas, ajustando e reajustando um modelo ao longo de várias voltas, tornam a pergunta sobre vazamento mais urgente, não menos. Ninguém no loop além de você sabe quando os seus dados foram registrados.
Act as a Python tutor. Here is a cell that holds out 25% of my weekly
lake samples, scores a majority-class baseline on them, then scores a
logistic model on the SAME held-out weeks: [paste cell]. Explain, line
by line, what the split does and why it must happen before any fitting.
Then give me one independent way to confirm the held-out weeks were
never in training.
Depois de rodar, verifique: leia a linha de base, o modelo e a margem na sua própria saída impressa e confirme que os números da ferramenta batem, e não que ela os chutou. Enfrenta a fabricação confiante, uma explicação fluente que cita uma margem que o seu código nunca produziu.
Here is the outcome I want to predict and the moment I need the forecast:
a bloom next week, decided by next week's samples. Here is my candidate
feature list with when each value is recorded: [list]. For each feature,
say whether its value is settled before, at, or after the outcome, and
flag any that could not exist at prediction time.
Depois de rodar, verifique: refaça você mesmo o raciocínio de temporalidade da variável que ela liberar com mais confiança. Se alguma variável só se define no momento da floração ou depois dela, rejeite-a, diga a ferramenta o que disser. Enfrenta a ilusão de completude, uma lista bem arrumada que omite justamente a variável tardia que condena a previsão.
Act as a hostile reviewer. Attack this headline: "Our model forecasts
blooms with 88% held-out accuracy." Name every reason a skeptic would
distrust it, including the baseline it beat, the metric, and any hidden
leak.
Depois de rodar, verifique: confronte cada objeção com a sua saída impressa e guarde as que os seus números sustentam. Enfrenta a concordância bajuladora, em que uma assistente predisposta a ajudar elogia uma manchete que você mesmo escreveu.
Quatro decisões continuam sendo suas. O alvo: o que você prevê e por que isso importa. A linha de base: a regra honesta que o modelo precisa superar. A temporalidade de cada variável: se o valor existiria de verdade no momento da previsão, algo que só você, que conhece a linha do tempo dos seus dados, consegue resolver. E o veredito sobre se o seu projeto deveria prever alguma coisa. Uma ferramenta que nunca viu a sua linha do tempo não pode tomar essas decisões por você.
14.7 Um caso de falha da IA
Você cola a sua lista de variáveis e pergunta a uma parceria de IA quais são seguras de usar. Ela responde com confiança: “chlorophyll_a é o seu preditor mais forte, mantenha.” O raciocínio soa impecável, porque a clorofila se correlaciona quase perfeitamente com as florações. Essa correlação quase perfeita é exatamente o sinal. Esta é a falha do método plausível, porém errado: a ferramenta ordenou a variável pelo quanto ela se ajusta ao passado, não pelo quanto ela poderia existir a tempo de uma previsão. Você pega isso com uma pergunta que a estatística sozinha não responde. Quando a clorofila é medida? Durante a floração, então nenhuma previsão feita uma semana antes poderia tê-la. Tire a variável, veja a pontuação voltar para 0,88 e fique com o modelo honesto.
14.8 Agora é a sua vez
O seu desenho está declarado e diagnosticado. Este passo decide se o seu projeto está mesmo prevendo casos que ninguém viu ainda e, se estiver, coloca essa previsão sob contrato antes de você ajustar um único modelo.
- Faça a versão direta da sua pergunta: o seu projeto precisa adivinhar o desfecho de um caso cujo desfecho ainda não existe? Escreva sim ou não, e a frase única que justifica a sua resposta.
- Se for sim, assine o contrato de quatro partes, em ordem. Nomeie a coluna-alvo, a linha de base honesta mais burra que ele tem que superar, a divisão que mantém uma fatia de casos não vista e a métrica casada com o quanto o seu desfecho é raro.
- Liste as suas variáveis e escreva ao lado de cada uma o momento em que o valor dela se define. Circule tudo que se define no momento do desfecho ou depois dele. Esse conjunto circulado é a sua lista de vazamento, e ele pertence ao seu texto final, tendo você descartado ou não as variáveis que estão nela.
- Escreva a fronteira em uma frase: os casos que a sua previsão cobre e os que quem lê não deve supor que ela cobre. Seja específico sobre o que os torna diferentes.
- Se predição não for a sua pergunta, escreva a linha que diz isso com todas as letras e depois rode o passo 3 assim mesmo. Uma variável que só se define depois do desfecho também afunda, em silêncio, trabalhos descritivos e causais.
- Registre o passo no seu AI Research Ledger (registro de pesquisa com IA), e verifique pelo menos uma saída com um método nomeado do Guia de Verificação. Para um modelo ajustado, o método é a amostra separada para teste: nunca relate uma pontuação calculada em linhas com que o modelo treinou. Um revisor de IA pode rodar a checagem com você; a decisão de aceitar ou rejeitar continua sendo sua.