Gradient boosting still wins on tabular data
Notes from building credit-risk ensembles that decide in under 100 milliseconds.
For a lending client we needed credit decisions in under 100 milliseconds, explainable enough for regulators, trained on bureau data, bank statements and alternative signals. We evaluated neural approaches. Gradient-boosted trees won on every axis that mattered.
Where trees win
Tabular data with mixed types, missing values and non-linear thresholds is exactly what XGBoost and LightGBM were built for. They train in minutes, tune well with Optuna, and their errors are understandable. Neural models matched them only with far more engineering, and never beat them by enough to justify the cost.
Explainability came almost free
Monotonic constraints (more income should never lower a score) and SHAP-based reason codes gave us decision explanations that satisfied both compliance and the underwriters who had to trust the system.
Latency is an engineering problem
The model was fast; the features were slow. Precomputing and caching hot features in Redis, and validating inputs before scoring, brought decisions under the target. The ensemble itself contributed a small fraction of the latency budget.
An ensemble, not a single model
Combining XGBoost and LightGBM with different feature views improved stability more than raw accuracy. Stability matters when a model runs for months between retrains.
When we do reach for deep learning
Sequences, images, signals and text. For a table of applicant attributes, we start with trees and have rarely needed to move.
More from the blog
Why most RAG systems fail at retrieval, not generation
What we learned tuning a 55-million-object vector cluster, and the metrics that predicted answer quality.
How much autonomy should an agent have?
A practical framework for deciding what agents may do alone, what needs approval, and how to expand trust.
Working on something similar?
Tell us what you're building; we'll share what we've learned.
