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.
| Modelo | Padrão | Ajustado | Ganho | Gap treino-val. |
|---|---|---|---|---|
| XGBoost | 0,851163 | 0,864800 | +0,013637 | 0,0772 → 0,0149 |
| LightGBM | 0,861576 | 0,865079 | +0,003504 | 0,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 ↗.