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:
- Avaliação: escolher métricas, estimar incerteza, comparar modelos.
- Ajuste de Hiperparâmetros: os procedimentos de busca (grade/aleatória/Bayesiana/Hyperband).
- Estratégias de Ensemblagem: frequentemente aplicadas depois de selecionar modelos base fortes.
- Engenharia de Atributos e IA Centrada em Dados: mudanças nas representações de entrada e na qualidade do conjunto de dados frequentemente alteram a melhor escolha de modelo.
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:
- Uma métrica primária (o que você otimiza),
- Métricas de proteção (guardrail metrics) (não podem piorar além de limites),
- Um orçamento de implantação (latência/custo),
- 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. StratifiedKFoldmanté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.