Why My Best Model Only Explains 40% of the Variance (And Why That's Fine)
On structural ceilings, honest modeling, and resisting the urge to over-explain what data can't tell you.

On structural ceilings, honest modeling, and resisting the urge to over-explain what data can't tell you.

The best regression model in this project — a well-tuned XGBoost trained on 14 million flights — achieved an R² of 0.404. That means roughly 60% of the variance in departure delays is unexplained. When I first saw this number, my instinct was to keep tuning.
That instinct was wrong.
What's in the unexplained 60%
Flight delays have causes that don't exist in any tabular dataset. Weather events that deviate from forecasts. Mechanical failures that no prior tail-number history predicts. Crew incidents, gate conflicts, air traffic control ground stops triggered by conditions at airports hundreds of miles away. These are not modeling failures — they are the actual floor of what historical operational data can predict.
The structural ceiling argument is this: even a perfect model can only explain variance that exists in the features. If the causal mechanism of a delay doesn't generate a signal in your training data, no amount of tuning recovers it. Gradient boosting reached R² 0.404. Adding more features, more trees, and more hyperparameter trials moved the needle by a few hundredths. The plateau was real.
How to recognize a structural ceiling vs a modeling problem
These are genuinely different situations and they require different responses. A modeling problem shows up as a large gap between training and test performance — the model has memorized patterns that don't generalize. Random Forest in this project hit a training AUC of 1.00 with default settings. That's a modeling problem.
A structural ceiling shows up differently: training and test performance are close, but both plateau. CatBoost achieved a training-to-test AUC gap of just 0.031 — the model generalizes well. It's just approaching the limit of what the data supports. Further tuning trades compute for marginal gains.
The deployment implication
Recognizing the ceiling matters most when deciding how to use the model. A model that explains 40% of delay variance is genuinely useful for a passenger deciding whether to book a connection — it's far better than the historical base rate. It is not useful for crew scheduling or gate assignment, where errors are operationally costly. The recommendation was explicit: deploy as a passenger-facing probability score within 12 hours of departure. Don't use it for operations.
This is the kind of analytical clarity that separates useful models from overconfident ones. Knowing what your model can't do is at least as important as knowing what it can.
