Profundidade 1: treino=0.9271 teste=0.9006
Profundidade 5: treino=0.9925 teste=0.9298 <- melhor teste
Profundidade 6+: treino=1.0000 teste=0.9181
Seleção de Modelo, Validação Cruzada e Bootstrap
Aula 4 — Fundamentos Estatísticos do Aprendizado Supervisionado
1 Proposta da Aula
A Aula 3 podou uma árvore de decisão “olhando o gráfico”: a acurácia de validação subia, atingia um pico e depois caía, e escolhemos visualmente o ponto de virada. Isso funciona num quadro didático, mas esconde uma pergunta que qualquer projeto real precisa responder de forma sistemática: como escolher a complexidade certa sem espiar os dados que vão medir o sucesso final?
Esta aula muda o objeto de estudo. Em vez de um modelo específico, o assunto é o procedimento de avaliar e escolher entre modelos. A tese central: o erro medido nos próprios dados de treino é uma estimativa otimista — não porque o modelo trapaceia, mas porque ele foi ajustado exatamente para minimizar esse número.
Nota: esta é a primeira aula do curso a usar um conjunto de dados real — o Breast Cancer Wisconsin (569 pacientes, diagnóstico benigno ou maligno a partir de medidas do núcleo celular) — em vez de dados sintéticos como nas Aulas 1–3.
O roteiro, em quatro perguntas:
- Por que o erro de treino engana, e por quanto?
- O que, exatamente, a validação cruzada estima?
- Como escolher o número de partições (folds)?
- O que o Bootstrap estima que a validação cruzada não estima?
2 O Erro de Treino é uma Estimativa Otimista
Vamos treinar árvores de decisão de profundidade crescente no Breast Cancer Wisconsin, medindo a acurácia tanto nos dados usados para treinar quanto numa fatia de 30% nunca vista durante o ajuste.
O padrão é sistemático, não um acidente desta amostra: a acurácia de treino cresce monotonicamente e atinge 100% a partir da profundidade 6 (a árvore memoriza completamente as 398 pacientes de treino). A acurácia de teste sobe até a profundidade 5 (92,98%) e depois estabiliza um pouco abaixo (91,81%) — a árvore memorizada não generaliza melhor que uma moderadamente podada.
Formalizando: seja \(\hat{R}(\theta) = \frac{1}{N}\sum_i \mathcal{L}(y_i, f_\theta(x_i))\) o erro empírico medido nos mesmos dados usados para ajustar \(\theta\), e \(R(\theta) = \mathbb{E}_{(X,Y)\sim P}[\mathcal{L}(Y, f_\theta(X))]\) o risco esperado sob a distribuição populacional. \(\hat{R}(\theta)\) é um estimador enviesado para baixo de \(R(\theta)\) precisamente porque \(\theta\) foi escolhido observando os mesmos pontos usados para calcular \(\hat{R}\) — o modelo tem, literalmente, a resposta da prova antes de fazer a prova.
2.1 O Split como Simulação do Mundo Real
Entender que o erro de treino é enviesado nos leva imediatamente à necessidade de separar um conjunto de teste. Mas como fazer essa separação é uma decisão estatística, não apenas chamar uma função de embaralhamento aleatório.
O conjunto de teste serve a um propósito rigoroso: simular o ambiente em que o modelo será efetivamente usado. Quando colocamos um modelo na rua, o processo gerador de dados (DGP — Data Generating Process) não para; ele continua operando, produzindo novos exemplos. A sua métrica de teste só será confiável se o particionamento dos dados mimetizar a forma como esses novos exemplos chegarão na realidade.
Se o seu particionamento não refletir essa mecânica, a estimativa de erro voltará a ser otimista, sofrendo de vazamento de informações. A regra central é alinhar o split ao eixo de generalização desejado:
- Generalização no tempo: Se o objetivo é prever o amanhã, um sorteio aleatório contamina o modelo com informações do “futuro”. O particionamento deve ser cronológico: treina-se com dados do passado (ex: 2023 a 2025) e testa-se estritamente no período subsequente (ex: 2026).
- Generalização espacial ou de contexto: Se queremos saber se um modelo funciona para hospitais, escolas ou fazendas diferentes das usadas no treino, o split deve agrupar essas entidades. Treinar com dados da localidade A e testar com a localidade A esconde a queda de desempenho que ocorrerá ao chegar na localidade B.
- Generalização por indivíduo: Em exames médicos longitudinais ou com múltiplas amostras, um mesmo paciente pode ter dezenas de registros. O particionamento deve ser feito pelo ID do paciente. Separar por registro isolado permite que o modelo decore características anatômicas daquele paciente no treino e as use no teste, resolvendo o problema por reconhecimento de identidade, não por diagnóstico real.
A suposição tradicional de que os dados são perfeitamente independentes e identicamente distribuídos (i.i.d.) num sorteio aleatório é conveniente matematicamente, mas frequentemente perigosa. O design metodológico do seu conjunto de teste define exatamente qual pergunta de pesquisa você está de fato respondendo.
2.2 Train/Validation/Test, e o Pecado de Espiar
Se o erro de treino é otimista, a solução óbvia é reservar uma fatia dos dados que o ajuste nunca vê. Mas um único split levanta um problema sutil: se usarmos essa mesma fatia repetidas vezes para escolher entre profundidade 3, 5, 8, 12… — cada escolha “espia” um pouco mais esse conjunto, e a estimativa final de desempenho fica ela mesma otimista, só que num grau mais discreto do que o erro de treino puro.
A prática correta separa três papéis:
- Treino: ajusta os parâmetros do modelo (os cortes da árvore).
- Validação: compara candidatos e escolhe hiperparâmetros (profundidade, ou o \(\lambda\) de custo-complexidade da Aula 3) — pode ser espiado várias vezes, mas cada espiada contamina um pouco a estimativa.
- Teste: usado uma única vez, ao final, para reportar o número que vai para o relatório. Se ele for consultado durante o desenvolvimento, deixa de significar o que deveria significar.
O restante desta aula formaliza a etapa de validação — e o problema prático de que, com dados escassos, “reservar uma fatia” para validação é caro. A validação cruzada existe para usar os dados de forma mais eficiente sem abrir mão do princípio de nunca avaliar um modelo nos mesmos pontos usados para ajustá-lo.
3 Validação Cruzada como Simulação de Amostragem
A validação cruzada em \(k\) partes (k-fold) resolve o problema de “dados escassos para validação” reciclando a amostra inteira, tanto para treino quanto para validação — só que nunca ao mesmo tempo. O livro-texto desta aula (Hastie, Tibshirani & Friedman, ESL) define o objetivo com precisão:
Tradução livre: “Esse método estima diretamente o erro esperado fora da amostra \(\text{Err} = \mathbb{E}[\mathcal{L}(Y, \hat{f}(X))]\), o erro médio de generalização quando o método \(\hat{f}(X)\) é aplicado a uma amostra de teste independente, vinda da distribuição conjunta de \(X\) e \(Y\)” (ESL, §7.10, p. 241).
Este é o elo que dá nome ao bloco: cada fold de validação é, sob a suposição de amostra i.i.d. de \(P(X,Y)\), uma aproximação de “coletar uma nova amostra de teste”. O procedimento:
- Particione os dados em \(k\) blocos de tamanho aproximadamente igual.
- Para cada bloco \(j = 1, \dots, k\): treine usando os outros \(k-1\) blocos, avalie no bloco \(j\) (nunca visto no ajuste).
- A estimativa final é a média das \(k\) avaliações: \[ \text{CV}(\hat f) = \frac{1}{N}\sum_{i=1}^{N} \mathcal{L}\bigl(y_i,\, \hat f^{-\kappa(i)}(x_i)\bigr), \] onde \(\kappa(i)\) indica em qual bloco a observação \(i\) caiu, e \(\hat f^{-\kappa(i)}\) é o modelo ajustado sem esse bloco.
Cada uma das \(k\) rodadas simula o que aconteceria se, de fato, tivéssemos coletado uma amostra de teste nova e independente — e a média sobre \(k\) rodadas reduz a variância dessa simulação em relação a um único split de validação.
Estratificação. No nosso dataset, 62,7% das pacientes são benignas e 37,3% malignas — um desbalanceamento moderado, o mesmo tipo de cuidado já visto na Aula 1. Um particionamento aleatório ingênuo pode, por azar, concentrar a maioria dos casos malignos num único fold. StratifiedKFold corrige isso, preservando a proporção de diagnóstico em cada partição:
Proporção de malignos em cada fold (estratificado):
fold 1: 0.375
fold 2: 0.375
fold 3: 0.375
fold 4: 0.367
fold 5: 0.367
Proporção no conjunto de treino inteiro: 0.372
Cada fold preserva a proporção original (~37%) dentro de uma margem pequena — sem estratificação, essa variação poderia ser bem maior em folds pequenos.
4 Escolhendo k: Viés e Variância do Próprio Estimador
\(k\) não é um detalhe de implementação — é uma escolha estatística. No caso extremo \(k=N\) (leave-one-out, LOOCV), cada modelo é treinado com \(N-1\) pontos — quase a amostra inteira — então o viés desse estimador é mínimo. Mas o ESL alerta:
Tradução livre: “Com \(K=N\), o estimador de validação cruzada é aproximadamente não-enviesado para o erro de predição esperado (verdadeiro), mas pode ter alta variância, porque os \(N\) ‘conjuntos de treino’ são tão parecidos uns com os outros” (ESL, §7.10.1, pp. 242–243). O texto recomenda \(K=5\) ou \(10\) como escolha prática padrão.
Vamos comparar isso empiricamente na nossa árvore podada (do bloco seguinte). Repetimos 5-fold e 10-fold dez vezes cada, variando apenas a partição aleatória, e comparamos com o LOOCV (que é determinístico — não há aleatoriedade de partição a repetir):
5-fold: média das 10 repetições = 0.9282, desvio-padrão entre repetições = 0.0030
10-fold: média das 10 repetições = 0.9236, desvio-padrão entre repetições = 0.0071
LOOCV (398 ajustes, um por paciente): 0.8945
Três achados honestos, não forçados para bater com a teoria:
- O 5-fold e o 10-fold variam de partição para partição — a estimativa depende de quais pacientes caem em qual bloco. O LOOCV, sendo determinístico (cada paciente é seu próprio fold, sem sorteio), não tem essa fonte de variação.
- Neste dataset específico, o LOOCV (89,4%) ficou abaixo da média repetida do 5-fold e do 10-fold (ambas por volta de 92–93%) — um lembrete de que “menos viesado” não é sinônimo de “número mais alto”; são estimativas de quantidades diferentes, e ambas carregam ruído de amostra finita.
- O 10-fold, apesar de teoricamente mais próximo do LOOCV, teve mais variação entre repetições do que o 5-fold nesta amostra particular — o comportamento teórico (“mais \(k\) → menos viés, geralmente mais variância de estimação com folds menores”) é uma tendência média, não uma garantia caso a caso.
\(k=5\) ou \(k=10\) seguem sendo a escolha prática padrão: bem mais baratos que LOOCV (uma única árvore grande tem \(N=398\) ajustes no LOOCV contra apenas 5 ou 10 no k-fold) e, na prática, competitivos em qualidade de estimativa.
5 Aplicação: Escolhendo a Poda da Aula 3 por Validação Cruzada
A Aula 3 introduziu o critério de custo-complexidade \(C(T) = \sum_\tau Q_\tau(T) + \lambda|T|\) e podou “olhando o gráfico” de um único split treino/validação. Fechamos aquele gancho agora, usando cost_complexity_pruning_path (a mesma ferramenta da Aula 3) e escolhendo \(\lambda\) (ccp_alpha) por 5-fold CV estratificada:
Árvore completa (sem poda): 19 folhas, acurácia de teste = 0.9181
Melhor lambda por CV: 0.01592 -> 4 folhas
CV: 0.9297 ± 0.0243 Teste: 0.9181
O resultado é um argumento direto a favor da parcimônia: a árvore escolhida por CV tem 4 folhas, contra 19 na árvore completa — e as duas atingem a mesma acurácia de teste (91,8%). Nenhuma das 15 folhas extras da árvore completa contribuiu para generalização; elas só memorizaram ruído específico do conjunto de treino.
Um refinamento: a regra de 1 desvio-padrão. Em vez de escolher o \(\lambda\) que maximiza a média de CV, a regra “1-SE” escolhe o modelo mais simples cuja acurácia de CV esteja a até um erro-padrão do melhor valor observado — reconhecendo explicitamente que a própria estimativa de CV tem incerteza, e que não vale a pena pagar complexidade extra por uma diferença de acurácia que pode ser só ruído de amostragem.
Regra 1-SE: lambda=0.04378 -> 2 folhas
CV: 0.9272 Teste: 0.9006
A árvore “1-SE” fica ainda mais simples (2 folhas) e paga um preço real de acurácia de teste (90,1% contra 91,8%) — um lembrete honesto de que a regra de parcimônia não é gratuita neste caso específico; ela é uma escolha deliberada de trocar um pouco de desempenho por uma árvore muito mais interpretável (2 folhas cabem numa frase; 4 já exigem um parágrafo).
Escreva sua resposta e compare com um colega antes de avançar (2 min).
6 O Bootstrap: Incerteza de um Estimador
A validação cruzada responde “qual é o erro esperado deste procedimento?”. O Bootstrap responde uma pergunta diferente e complementar: “quão incerta é uma estatística que já calculei a partir da minha amostra?” O ESL define a ideia de forma geral:
Tradução livre: “O Bootstrap é uma ferramenta geral para avaliar a precisão estatística. […] A ideia básica é sortear, com reposição, conjuntos de dados a partir dos dados de treino, cada amostra do mesmo tamanho que o conjunto de treino original. Isso é feito \(B\) vezes […], produzindo \(B\) conjuntos de dados bootstrap” (ESL, §7.11, pp. 249–250).
Antes de simular no código, vale fixar exatamente o que essas réplicas permitem calcular. Seja \(S(Z)\) uma estatística calculada a partir de uma amostra \(Z\) — aqui, a acurácia medida no teste (ou no procedimento de ajuste). O Bootstrap gera \(B\) réplicas \(Z^{*1}, \dots, Z^{*B}\) por reamostragem com reposição e calcula \(S(Z^{*b})\) em cada uma; a partir dessas \(B\) réplicas, uma das quantidades que se pode estimar diretamente é a própria variância de \(S(Z)\): \[ \widehat{\mathrm{Var}}[S(Z)] = \frac{1}{B-1}\sum_{b=1}^{B}\bigl(S(Z^{*b}) - \bar S^*\bigr)^2, \qquad \bar S^* = \frac{1}{B}\sum_{b=1}^{B} S(Z^{*b}) \] (ESL, §7.11, p. 250). Premissa usada a seguir: para \(B\) grande, os percentis empíricos do conjunto de réplicas \(\{S(Z^{*b})\}\) aproximam os percentis da verdadeira distribuição amostral de \(S\) — é essa aproximação, e não a fórmula da variância acima, que sustenta o intervalo de confiança percentílico construído no código abaixo (as duas quantidades vêm do mesmo conjunto de réplicas, mas respondem perguntas ligeiramente diferentes: um único número de dispersão vs. um intervalo inteiro).
A acurácia de teste da nossa árvore de 4 folhas foi 91,8% — mas esse número, sozinho, esconde quanta confiança devemos depositar nele. Duas perguntas distintas, duas formas de usar o Bootstrap:
1. Quão incerta é a acurácia medida, dado que o conjunto de teste tem só 171 pacientes? Reamostramos, com reposição, os acertos e erros já observados no teste:
Acurácia pontual: 0.9181
Bootstrap (B=2000): média=0.9170, desvio-padrão=0.0215
Intervalo de confiança 95% (percentílico): [0.8772, 0.9591]
O intervalo [87,7%, 95,9%] é largo — com apenas 171 pacientes de teste, a acurácia pontual de 91,8% poderia facilmente ter saído entre 88% e 96% por puro acaso da amostragem.
2. Quão instável é o próprio modelo ajustado, dado que a amostra de treino também é finita? Aqui reamostramos o conjunto de treino (com reposição), reajustamos a árvore em cada réplica, e avaliamos sempre no mesmo conjunto de teste — mais próximo da formalização \(S(Z)\) do ESL, em que \(Z\) é a amostra de treino inteira:
Bootstrap com reajuste (B=200): média=0.9161, desvio-padrão=0.0139
Intervalo de confiança 95%: [0.8889, 0.9358]
O intervalo aqui é um pouco mais estreito ([88,9%, 93,6%]) — reflete a instabilidade do procedimento de ajuste (qual árvore de 4 folhas sai de cada amostra de treino reamostrada), uma quantidade conceitualmente diferente da incerteza de medir a acurácia num teste fixo.
A diferença que fica desta seção: CV estima o risco esperado de um procedimento (uma média sobre folds, cada um vindo de uma partição diferente); Bootstrap estima a variabilidade amostral de uma estatística já calculada (uma distribuição inteira de valores plausíveis, não só uma média).
7 Armadilhas Comuns
O jeito errado de fazer validação cruzada. O ESL descreve um cenário revelador: um conjunto com \(N=50\) amostras e \(p=5\,000\) atributos, todos estatisticamente independentes do rótulo (ruído puro) — o erro real de qualquer classificador é, portanto, 50%. Uma prática comum, e sutilmente errada: (1) selecionar os 100 atributos mais correlacionados com o rótulo usando toda a amostra; (2) treinar um classificador só com esses atributos; (3) validar por CV. Reproduzimos o experimento de forma independente:
Jeito ERRADO — erro médio de CV: 0.015 (erro real: 0.50)
Jeito CERTO — erro médio de CV: 0.491 (erro real: 0.50)
O resultado é dramático: selecionar atributos usando a amostra inteira antes de particionar em folds produz um erro estimado de CV de \({\sim}1{,}5\%\) — quando o erro verdadeiro é 50%. Fazer a seleção dentro de cada fold, usando só os dados de treino daquele fold, recupera uma estimativa honesta (\({\sim}48\%\), muito perto do valor real). O problema: no jeito errado, os atributos “já viram” os rótulos do fold de validação durante a etapa de seleção — a validação deixa de ser independente do ajuste, mesmo que o classificador final pareça respeitar a partição.
A regra prática: qualquer transformação que “aprenda” algo dos dados — seleção de atributos, normalização, imputação de valores faltantes, redução de dimensionalidade — precisa ser recalculada dentro de cada fold de treino, nunca na amostra inteira antes do split.
Reportar só a média é enganoso. O próprio ESL observa, sobre um experimento de CV real:
Tradução livre: “A acurácia média de validação cruzada gira em torno do valor esperado real […] Por outro lado, existe uma variabilidade considerável no erro, o que reforça a importância de reportar o erro-padrão estimado da estimativa de CV” (ESL, §7.10.3, p. 249).
Vimos isso diretamente na nossa curva de poda: a acurácia de CV do melhor \(\lambda\) foi \(92{,}97\%\), mas com um desvio-padrão de \(2{,}43\%\) entre os 5 folds — um número sozinho, sem essa segunda informação, sugere mais precisão do que a validação cruzada realmente entrega.
8 Conclusão
Voltando às quatro perguntas da abertura:
- Por que o erro de treino engana: ele é calculado nos mesmos dados que escolheram o modelo — otimista por construção, não por acidente.
- O que a validação cruzada estima: o erro esperado de generalização, simulando repetidas amostras de teste a partir da própria amostra disponível.
- Como escolher \(k\): \(5\) ou \(10\) é a escolha prática padrão — LOOCV tem menos viés teórico, mas é caro e, como vimos, não é automaticamente “melhor” numa amostra real.
- O que o Bootstrap estima: a variabilidade amostral de uma estatística já calculada — uma pergunta complementar à da validação cruzada, não uma alternativa a ela.
O fio que une os quatro blocos centrais: nenhuma estimativa de desempenho é um número exato. Ela vem com um viés (o erro de treino) ou com uma variância (a estimativa de CV, o intervalo do Bootstrap) que precisa ser levada em conta — e ignorá-la é o erro estatístico mais caro e mais comum na prática de aprendizado de máquina.
Ponte para a Aula 5
A intuição desta aula — “um modelo mais flexível se ajusta melhor ao treino, mas isso não garante melhor generalização” — reaparecerá na Aula 8 formalizada como a decomposição viés-variância, decompondo matematicamente o erro esperado em viés ao quadrado, variância do estimador e ruído irredutível. Antes disso, porém, a Aula 5 constrói o primeiro modelo paramétrico do curso — regressão linear — e mostra que ajustá-lo por mínimos quadrados é, sob um modelo de ruído gaussiano, exatamente o mesmo que ajustá-lo por máxima verossimilhança: o mesmo princípio unificador que já apareceu em cada aula até aqui, agora aplicado a alvos contínuos.
9 Exercícios
9.1 Questões discursivas
Explique por que \(\hat{R}(\theta)\), o erro medido nos mesmos dados usados para ajustar \(\theta\), é um estimador enviesado do risco esperado \(R(\theta)\). Por que esse viés tende a crescer com a flexibilidade do modelo (compare uma árvore de profundidade 1 com uma de profundidade 15 no nosso experimento)?
Um colega decide normalizar todos os atributos (subtrair a média, dividir pelo desvio-padrão) usando a base de dados inteira, e só depois faz uma validação cruzada de 5 folds. Explique por que isso é uma forma de vazamento de dados, análoga ao experimento de seleção de atributos desta aula, e descreva como corrigir o procedimento.
A árvore escolhida pela regra de 1 desvio-padrão teve acurácia de teste pior do que a árvore de máxima acurácia de CV, mas com metade das folhas. Discuta em que cenários essa troca (menos acurácia por mais simplicidade) pode ser a escolha certa, e em quais não seria.
9.2 Questões de Verdadeiro/Falso
Cada bloco de 4 itens trata do mesmo tema. A questão só é considerada correta se todos os 4 itens forem julgados corretamente (deixar em branco tem penalidade de 20% da nota da questão).