Seleção de Modelos

Seleção de modelos (model selection) é o processo de escolher uma família de modelos (por exemplo, modelo linear (linear model) vs. árvores com boosting de gradiente (gradient-boosted trees) vs. rede neural (neural network)) e seus hiperparâmetros (por exemplo, força de regularização (regularization strength), profundidade da árvore (tree depth), taxa de aprendizado (learning rate)) usando avaliação baseada em princípios (principled evaluation) para que o sistema escolhido generalize bem para novos dados. Ela está no núcleo do aprendizado de máquina (machine learning) aplicado porque a maioria dos ganhos de desempenho no mundo real não vem de um único truque inteligente, mas de um ciclo cuidadoso de escolha de hipótese + avaliação + iteração.

Este artigo foca em como fazer seleção de modelos de forma correta e reprodutível, e como evitar armadilhas comuns como vazamento de dados (data leakage) e “espiar” (peeking) o conjunto de teste.

O que “seleção de modelos” inclui (e o que não inclui)

Termos-chave

  • Família de modelos / classe de hipóteses (model family / hypothesis class): A forma funcional que você está considerando (por exemplo, regressão logística (logistic regression), floresta aleatória (random forest), transformer (transformer)).
  • Parâmetros (parameters): Aprendidos a partir dos dados durante o treinamento (pesos, divisões, vetores de incorporação (embeddings)).
  • Hiperparâmetros (hyperparameters): Definidos por você (força de regularização, número de árvores, profundidade da arquitetura, intensidade de aumento de dados (data augmentation) etc.).
  • Critério de seleção (selection criterion): A métrica e o protocolo de avaliação que você usa para decidir (por exemplo, AUROC médio em validação cruzada).
  • Generalização (generalization): Desempenho em dados novos, não vistos, extraídos da mesma (ou similar) distribuição.

Seleção de modelos está intimamente conectada a:

O que seleção de modelos *não* é

  • Treinar um modelo com hiperparâmetros fixos (isso é otimização (optimization)).
  • Decisões de implantação do modelo (model deployment) (embora a seleção deva incorporar restrições de implantação).
  • Análise puramente teórica de capacidade (purely theoretical capacity analysis) sem avaliação empírica (útil, mas insuficiente na prática).

Por que seleção de modelos é difícil: sobreajuste ao processo de validação

Um risco central é o sobreajuste (overfitting) do procedimento de seleção em vez do conjunto de treinamento. Mesmo que cada modelo candidato seja treinado de forma correta, tentar repetidamente muitos modelos/hiperparâmetros e escolher o melhor pode “ajustar” o ruído da sua estimativa de validação.

Isso acontece porque:

  • Métricas de validação têm variância (variance) (dados finitos).
  • Você pode tentar dezenas/centenas de variantes.
  • Decisões do seu fluxo de trabalho (conjuntos de atributos, pré-processamento, regras de parada antecipada (early stopping)) efetivamente também viram hiperparâmetros.

Um fluxo de trabalho de seleção de modelos baseado em princípios precisa lidar com isso projetando uma avaliação que seja:

  • Sem viés (ou com viés mínimo) em relação à generalização.
  • De baixa variância o suficiente para discriminar entre candidatos.
  • Alinhada com o objetivo e as restrições reais.

Fundamentos teóricos (intuições que guiam a prática)

Minimização do risco empírico e generalização

A maior parte do treinamento em aprendizado de máquina minimiza risco empírico (perda nos dados de treinamento). A seleção de modelos visa minimizar risco esperado (perda na verdadeira distribuição geradora de dados).

Na prática, você aproxima o risco esperado com uma estimativa em conjunto retido (held-out estimate) (validação/teste) ou com validação cruzada (cross-validation).

Compromisso viés–variância e complexidade do modelo

Um modelo mental útil:

  • Modelos simples (por exemplo, lineares) tendem a ter maior viés, menor variância.
  • Modelos complexos (redes profundas, árvores de grande profundidade) tendem a ter menor viés, maior variância.

Seleção de modelos é, em grande parte, a arte de encontrar o melhor equilíbrio viés–variância para:

  • tamanho do conjunto de dados,
  • nível de ruído / qualidade dos rótulos,
  • representação de atributos,
  • métrica de avaliação,
  • risco de mudança de distribuição (distribution shift).

Regularização, parada antecipada e aumento de dados efetivamente reduzem a variância, tornando modelos mais complexos viáveis.

Minimização estrutural do risco (SRM, structural risk minimization)

A SRM (da teoria do aprendizado estatístico (statistical learning theory)) sugere escolher entre classes de modelos aninhadas equilibrando o erro de treinamento com uma penalidade de complexidade. Na prática moderna, você raramente calcula explicitamente limites de dimensão VC (VC-dimension), mas o princípio aparece como:

  • preferir modelos mais simples quando os dados são escassos,
  • regularização e restrições (L1/L2, dropout (dropout), profundidade máxima),
  • selecionar um modelo que tenha bom desempenho e seja estável entre dobras/divisões.

Critérios de informação (AIC/BIC) e MDL (quando aplicável)

Para alguns modelos probabilísticos, critérios clássicos como AIC e BIC fornecem seleção com penalização de complexidade. Eles são mais comuns em estatística e econometria de séries temporais; no aprendizado de máquina mainstream, a validação cruzada é mais comum e amplamente aplicável.

O que você está otimizando: mais do que “acurácia”

Um modelo “melhor” raramente é definido por um único número. Na prática, a seleção de modelos frequentemente envolve trade-offs multiobjetivos (multi-objective):

  • Desempenho preditivo (por exemplo, AUROC, RMSE, perda logarítmica (log loss))
  • Calibração (calibration) (probabilidades que significam o que dizem; veja Avaliação)
  • Latência / vazão (throughput) (restrições de serviço)
  • Pegada de memória (memory footprint) (implantação em borda (edge deployment))
  • Interpretabilidade (veja Interpretabilidade (Aprendizado de Máquina Clássico))
  • Robustez (robustness) a ausência de dados (missingness), ruído, mudança de domínio (domain shift)
  • Restrições de equidade (fairness) / conformidade (frequentemente avaliadas por subgrupo)

Uma abordagem baseada em princípios é definir:

  1. Uma métrica primária (o que você otimiza),
  2. Métricas de proteção (guardrail metrics) (não podem piorar além de limites),
  3. Um orçamento de implantação (latência/custo),
  4. Uma regra de decisão (por exemplo, “escolha o modelo mais simples dentro de 1 erro padrão do melhor escore em validação cruzada”).

Protocolos de avaliação para seleção de modelos

Divisões treino/validação/teste: o padrão básico

  • Conjunto de treinamento (training set): ajustar parâmetros.
  • Conjunto de validação (validation set): escolher hiperparâmetros, selecionar modelos, ajustar limiares.
  • Conjunto de teste (test set): avaliação final sem viés, uma vez que você tenha se comprometido com um processo de seleção.

Regra importante: não use o conjunto de teste para decisões iterativas. Se você olhar repetidamente, ele vira um conjunto de validação.

Validação cruzada (CV): quando e por quê

A validação cruzada reduz a sensibilidade a uma única divisão ao fazer a média entre dobras (folds). Variantes comuns:

  • CV K-fold: padrão para dados i.i.d.
  • K-fold estratificado (stratified K-fold): preserva o balanceamento de classes (classificação).
  • K-fold por grupos (group K-fold): mantém grupos juntos (por exemplo, agrupamento por paciente).
  • Divisão para séries temporais (time-series split): respeita a ordem temporal.

A validação cruzada é especialmente útil quando:

  • os dados são limitados,
  • as diferenças de desempenho são pequenas,
  • você quer uma estimativa mais confiável do que uma divisão holdout (holdout split).

Validação cruzada aninhada: seleção honesta de hiperparâmetros

Se você ajusta hiperparâmetros usando validação cruzada e reporta esse mesmo escore, você ainda corre risco de viés de seleção (selection bias). A validação cruzada aninhada (nested cross-validation) resolve isso:

  • Loop externo de validação cruzada: estima a generalização de todo o procedimento de seleção de modelos.
  • Loop interno de validação cruzada: escolhe hiperparâmetros para cada dobra de treinamento do loop externo.

A validação cruzada aninhada é o padrão-ouro para conjuntos de dados pequenos a médios quando você precisa de uma estimativa de desempenho sem viés para um modelo ajustado. Ela é computacionalmente mais pesada.

Comparações múltiplas e “maldição do vencedor”

Quando você testa muitos modelos, o melhor escore de validação tende a ser um superestimador. Mitigações:

  • validação cruzada aninhada ou um conjunto de teste final intocado
  • limitar o espaço de busca a hipóteses razoáveis
  • usar validação cruzada repetida e reportar intervalos de confiança
  • preferir “bom e estável” a “melhor porém frágil”

Fluxo de trabalho prático: um ciclo de seleção de modelos baseado em princípios

1) Comece com uma boa linha de base

Uma linha de base (baseline) deve ser:

  • simples,
  • rápida,
  • difícil de quebrar,
  • avaliada corretamente.

Para dados tabulares, um modelo linear regularizado e um modelo baseado em árvores (por exemplo, boosting de gradiente) são linhas de base comuns (veja Modelos).

2) Construa um pipeline de ponta a ponta (evite vazamento)

Todo o pré-processamento deve ser aprendido dentro das dobras de treinamento:

  • imputação,
  • escalonamento,
  • codificação,
  • seleção de atributos,
  • vetorização de texto.

É aqui que muitos bugs de vazamento acontecem (veja Engenharia de Atributos).

3) Escolha métricas e divisões que correspondam ao mundo real

Exemplos:

  • Para problemas desbalanceados, prefira PR-AUC, recall@precision ou perda ponderada por custo (veja Modelagem de Eventos Desbalanceados / Raros).
  • Para dados dependentes do tempo, use divisões conscientes do tempo (sem vazamento do futuro).
  • Para dados por usuário, agrupe por usuário para que treino/teste não compartilhem a mesma identidade.

4) Ajuste hiperparâmetros com eficiência

Use procedimentos de Ajuste de Hiperparâmetros:

  • busca aleatória (random search) (padrão forte),
  • otimização Bayesiana (Bayesian optimization),
  • bandits com parada antecipada (early-stopping bandits) (Hyperband/ASHA),
  • priors/faixas sensatas.

5) Compare candidatos levando em conta a incerteza

Não trate pequenas diferenças como definitivas. Use:

  • média ± desvio padrão entre dobras,
  • comparações pareadas nas mesmas dobras,
  • bootstrap (bootstrapping) nas predições quando apropriado.

6) Trave a decisão e avalie uma única vez no teste

Depois de selecionar:

  • retreine em treino+validação (ou em todos os dados de treinamento),
  • avalie no teste exatamente uma vez,
  • documente todo o procedimento de seleção.

Exemplo prático 1: classificação tabular com pipelines e validação cruzada (scikit-learn)

Abaixo está um padrão comum: um pipeline de pré-processamento sem vazamento, modelos candidatos e pontuação com validação cruzada.

import numpy as np
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier

# Suppose you already have:
# X: pandas DataFrame
# y: numpy array or Series
# numeric_cols, categorical_cols: lists of column names

numeric_preprocess = Pipeline(steps=[
    ("imputer", SimpleImputer(strategy="median")),
    ("scaler", StandardScaler())
])

categorical_preprocess = Pipeline(steps=[
    ("imputer", SimpleImputer(strategy="most_frequent")),
    ("onehot", OneHotEncoder(handle_unknown="ignore"))
])

preprocess = ColumnTransformer(
    transformers=[
        ("num", numeric_preprocess, numeric_cols),
        ("cat", categorical_preprocess, categorical_cols),
    ]
)

models = {
    "logreg": LogisticRegression(max_iter=2000, C=1.0, class_weight="balanced"),
    "rf": RandomForestClassifier(n_estimators=500, max_depth=None, random_state=0),
}

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)

for name, clf in models.items():
    pipe = Pipeline(steps=[("prep", preprocess), ("model", clf)])
    scores = cross_val_score(pipe, X, y, cv=cv, scoring="roc_auc")
    print(name, np.mean(scores), np.std(scores))

Pontos-chave:

  • O pré-processamento está dentro do Pipeline, então ele é ajustado apenas nas dobras de treinamento.
  • StratifiedKFold mantém o balanceamento de classes estável entre dobras.
  • Reporte a variabilidade, não apenas a média.

Para ajustar hiperparâmetros, envolva pipe com busca aleatória/Bayesiana (veja Ajuste de Hiperparâmetros).

Exemplo prático 2: validação cruzada aninhada para estimativa sem viés de desempenho

A validação cruzada aninhada é útil quando você precisa reportar desempenho após ajuste sem usar um conjunto de teste separado.

Padrão conceitual (simplificado):

from sklearn.model_selection import StratifiedKFold, RandomizedSearchCV
from sklearn.pipeline import Pipeline

outer_cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
inner_cv = StratifiedKFold(n_splits=3, shuffle=True, random_state=1)

pipe = Pipeline(steps=[("prep", preprocess),
                      ("model", LogisticRegression(max_iter=2000))])

param_distributions = {
    "model__C": np.logspace(-3, 3, 50),
    "model__penalty": ["l2"],
}

search = RandomizedSearchCV(
    pipe,
    param_distributions=param_distributions,
    n_iter=30,
    scoring="roc_auc",
    cv=inner_cv,
    n_jobs=-1,
    random_state=0
)

nested_scores = cross_val_score(search, X, y, cv=outer_cv, scoring="roc_auc")
print("Nested CV AUROC:", nested_scores.mean(), "+/-", nested_scores.std())

Interpretação:

  • A validação cruzada interna seleciona hiperparâmetros.
  • A validação cruzada externa estima a generalização desse processo de seleção.

Exemplo prático 3: séries temporais e “sem vazamento do futuro”

Para previsão (forecasting) ou qualquer predição temporalmente ordenada, validação cruzada aleatória é inválida. Use avaliação por janela expansiva (expanding-window evaluation):

  • Treine no tempo ≤ t
  • Valide no tempo em (t, t+Δ]

No scikit-learn você pode usar TimeSeriesSplit (ou divisões customizadas se precisar de gaps, horizontes ou múltiplas entidades).

Ideia central: nunca treine com dados que ocorram após os timestamps de validação.

Como escolher modelos candidatos (regras práticas)

Dados tabulares

Frequentemente têm bom desempenho:

  • Árvores com boosting de gradiente (por exemplo, XGBoost/LightGBM/CatBoost)
  • Modelos lineares regularizados
  • Florestas aleatórias

Redes neurais podem ganhar, mas normalmente exigem ajuste cuidadoso e mais dados.

Texto e imagens

A representação domina:

  • Para texto: transformers pré-treinados (veja Arquitetura Transformer)
  • Para imagens: redes neurais convolucionais (CNNs, convolutional neural networks) pré-treinadas ou transformers de visão (vision transformers)

Aqui, a seleção de modelos frequentemente foca em:

  • fine-tuning (fine-tuning) vs. atributos congelados (frozen features),
  • cronogramas de taxa de aprendizado (learning rate schedules),
  • intensidade de aumento de dados,
  • parada antecipada e seleção de pontos de verificação (checkpoints).

Regimes de poucos dados

Favoreça:

  • modelos mais simples,
  • regularização mais forte,
  • avaliação robusta (validação cruzada aninhada),
  • melhorias na qualidade dos dados (IA Centrada em Dados).

Além de desempenho: seleção sob restrições

Um processo de seleção baseado em princípios deve codificar explicitamente restrições:

  • Se dois modelos estiverem dentro do ruído estatístico, escolha o mais barato/rápido/simples.
  • Se interpretabilidade for exigida, considere modelos lineares generalizados ou restrições monotônicas.
  • Se qualidade probabilística importar, otimize perda logarítmica e avalie calibração (veja Avaliação).

Uma regra de decisão pragmática comum é a regra de “um erro padrão” (one standard error rule): escolha o modelo mais simples cuja média do escore em validação cruzada esteja a até um erro padrão do melhor escore.

Armadilhas comuns (e como evitá-las)

  • Espiar o conjunto de teste: avaliar muitas vezes no conjunto de teste.
    • Correção: mantenha um teste final intocado; use validação cruzada aninhada se não houver conjunto de teste.
  • Vazamento de dados no pré-processamento (escalonadores/codificadores ajustados em todos os dados).
    • Correção: sempre use pipelines; ajuste transformações apenas dentro das dobras de treinamento.
  • Engenharia de atributos com vazamento (atributos calculados usando informação futura).
    • Correção: compute atributos com regras causais/temporais estritas; valide com divisões temporais.
  • Unidade de divisão errada (mesmo usuário/paciente aparece em treino e teste).
    • Correção: divisão baseada em grupos.
  • Incompatibilidade de métrica (otimizar AUROC quando você se importa com precisão em baixa revocação, custo ou calibração).
    • Correção: defina cedo a métrica operacional e a estratégia de limiarização.
  • Busca excessiva de hiperparâmetros sem ajustar a avaliação.
    • Correção: validação cruzada aninhada, conjunto de validação maior ou espaço de busca reduzido.
  • Ignorar variância: perseguir melhorias minúsculas.
    • Correção: validação cruzada repetida, intervalos de confiança, checagens de estabilidade.

Relato e reprodutibilidade

Um bom relatório de seleção de modelos deve incluir:

  • A estratégia exata de divisão dos dados (incluindo regras de agrupamento/tempo)
  • A(s) métrica(s) e como foram computadas
  • O espaço de busca e o orçamento de ajuste
  • Sementes aleatórias e número de tentativas
  • Média e variabilidade entre dobras/divisões
  • Desempenho final no teste (avaliação única) e qualquer limiar escolhido

Esse nível de transparência ajuda outras pessoas a reproduzirem sua seleção e evita vazamentos acidentais.

Relação com ensemblagem e AutoML

  • Ensembles podem ser vistos como uma etapa pós-seleção: após identificar modelos fortes e diversos, combine-os para reduzir variância e melhorar robustez (veja Estratégias de Ensemblagem).
  • Automação de aprendizado de máquina (AutoML) formaliza o ciclo de seleção de modelos (famílias de modelos + pré-processamento + ajuste), mas ainda depende dos mesmos princípios: avaliação correta, pipelines sem vazamento e tratamento cuidadoso de comparações repetidas.

Checklist prático

  • Defina o objetivo real (métrica + restrições).
  • Escolha uma estratégia de divisão que corresponda à geração dos dados (estratificada/grupo/tempo).
  • Construa pipelines sem vazamento (todo pré-processamento dentro da validação cruzada).
  • Comece com boas linhas de base.
  • Ajuste hiperparâmetros com uma estratégia consciente do orçamento.
  • Use validação cruzada aninhada ou um conjunto de teste travado para evitar viés de seleção.
  • Prefira melhorias estáveis; quantifique a incerteza.
  • Documente tudo para reprodutibilidade.

No fim, seleção de modelos é sobre ser honesto com seu eu do futuro: construir um ciclo de avaliação que torne difícil enganar a si mesmo, mesmo que acidentalmente, enquanto ainda permite iteração rápida rumo a melhor desempenho no mundo real.