Construção dos modelos de boosting

Se o Random Forest treina árvores em paralelo e vota, o boosting treina uma de cada vez, e cada nova árvore aprende exatamente com os erros da anterior. É o que costuma extrair a última gota de desempenho — e, neste projeto, foi o que levou os dois finalistas a praticamente o mesmo lugar por caminhos opostos.

A diferença de arquitetura entre os dois

XGBoost e LightGBM fazem a árvore crescer de formas distintas:

  • 🪜 Level-wise (XGBoost, por padrão) — cresce nível por nível, de forma equilibrada e conservadora.
  • 🌿 Leaf-wise (LightGBM) — cresce sempre pela folha de maior ganho, gerando árvores mais profundas e assimétricas; costuma ser mais rápido e um pouco mais preciso, ao custo de mais risco de overfitting.

A busca de hiperparâmetros

RandomizedSearchCV com 25 sorteios por modelo, cinco dobras estratificadas, otimizando ROC AUC. O pipeline inteiro entra na busca — cada candidato refaz a preparação por dobra, mantendo a garantia contra vazamento.

ModeloPadrãoAjustadoGanhoGap treino-val.
XGBoost0,8511630,864800+0,0136370,0772 → 0,0149
LightGBM0,8615760,865079+0,0035040,0407 → 0,0126

Repare no que a busca fez de mais valioso: além de ganhar AUC, ela cortou o gap entre treino e validação pela metade ou mais. O ajuste não deixou os modelos só melhores — deixou mais honestos.

A convergência

Os hiperparâmetros vencedores dos dois contam a mesma história:

# XGBoost
n_estimators=400, max_depth=8, learning_rate=0.0187,
min_child_weight=50, subsample=0.66, colsample_bytree=0.75

# LightGBM
n_estimators=600, num_leaves=15, learning_rate=0.0175,
min_child_samples=20, subsample=0.72, reg_lambda=10

Taxa de aprendizado baixa (~0,018), muitas árvores e regularização forte. Os dois chegaram lá por rotas diferentes — o LightGBM limitando folhas (num_leaves=15), o XGBoost exigindo peso mínimo por nó (min_child_weight=50) — mas o desenho final é o mesmo. Quando dois algoritmos independentes convergem para a mesma configuração, isso diz algo sobre o problema, não sobre os algoritmos: o sinal aqui é sutil e exige aprendizado lento.

O desbalanceamento repete o padrão

Testei scale_pos_weight no XGBoost e is_unbalance no LightGBM. Mesmo resultado da floresta: ganho nulo em AUC e Brier quase triplicando — de 0,048 para 0,13. A probabilidade média salta de 6,7% para ~30%, e o limiar econômico passaria a negar quase 80% da carteira. Decisão mantida em todos os modelos: sem ajuste de peso.

📊

Parte 8 de 12 da série Aurora — um modelo de risco de crédito do zero ao deploy. O mapa completo da série reúne todas as partes e os números finais. Veja também a documentação técnica e o código no GitHub ↗.