When we built the prediction engine at Onyx Odds, one of the early decisions was which model architecture to use for each prediction type. We ended up with different approaches for different output types, and the reasoning behind those choices is worth explaining explicitly, because it touches on a set of tradeoffs that come up in every sports prediction problem regardless of the specific sport or use case.
This is not a theoretical survey. It is an account of what we actually tried, where each approach performed well, and where each one fell apart. The three approaches we have used most seriously are logistic regression, gradient boosted trees, and recurrent neural networks. Each has a natural domain in sports prediction. Each has failure modes that are not obvious until you are several months into a production deployment.
Logistic Regression: Honest and Interpretable
Logistic regression is the oldest approach and the one that sounds least impressive to pitch to a stakeholder. In practice, it is often the right choice for binary game-outcome prediction, and it is the approach we still use as a calibration benchmark for everything else we build.
The core strength of logistic regression in sports prediction is interpretability. Each feature has an explicit coefficient, and you can calculate exactly how much a given feature is contributing to the predicted probability for a specific matchup. This interpretability is not just academically useful; it is essential for building the kind of explainable predictions that editorial teams can use. When our API returns a talking point that says "home court advantage is the primary factor in this 68% win probability," that is possible because we know the exact weight that feature carries in the model.
Where logistic regression falls apart: interaction effects. Sports outcomes are rarely driven by one factor in isolation. The impact of a back-to-back schedule depends heavily on which opponents are involved. An injury to one player affects different matchup configurations differently. Logistic regression handles these interactions poorly unless you engineer explicit interaction features by hand, which becomes quickly unmanageable as the feature set grows. You are essentially trying to enumerate every pairwise and higher-order interaction that might matter, which is an intractable combinatorial problem in a sport with dozens of relevant features per matchup.
Best domain in sports prediction: simple, well-defined outcome prediction where you have a clear feature set and you need the model's reasoning to be inspectable. Season-level win probability, where the feature set is reasonably stable, is a good fit. Venue-specific effects and rest-schedule impacts are also well-handled by logistic regression because the feature-to-outcome relationship is relatively linear.
Gradient Boosted Trees: The Production Workhorse
Gradient boosted trees (we use XGBoost as the primary implementation) are the model class we rely on most heavily for game-outcome prediction across multiple sports. They handle interaction effects naturally without requiring manual feature engineering, they are relatively fast to retrain on new data, and they can be partially interpreted using SHAP values to explain which features drove a specific prediction.
The accuracy story for gradient boosted trees in sports prediction is real but bounded. In controlled backtesting on well-curated historical data, they consistently outperform logistic regression by three to seven percentage points in Brier score across most sports we have tested. In production, the lift is smaller because the production environment includes data quality issues that do not exist in clean historical backtest data.
Where gradient boosted trees fall apart: temporal ordering. Tree-based models have no inherent understanding of time sequences. A model that learns from the full history of a team's performance does not naturally give more weight to recent form than to performance from two seasons ago, unless you explicitly engineer recency-weighting into your features. In sports, recent form matters enormously, particularly over short windows like the last three to five games. Teams go on hot and cold streaks for reasons that are real but difficult to quantify, and a gradient boosted model trained on raw historical features without careful recency engineering will underfit these short-window dynamics.
How we handle this: we build explicit recency-weighted features for a set of key metrics (defensive efficiency, pace, turnover rate, and several others depending on the sport) and feed these as engineered features rather than relying on the model to learn recency weighting from the raw data. This is more labor-intensive but produces substantially better short-window predictions.
Recurrent Neural Networks: Powerful and Fragile
Recurrent neural networks, and specifically LSTM architectures, are theoretically well-matched to sports prediction because sports outcomes are genuinely sequential: the history of how a team has been playing matters, in order, and the most recent games matter more than older ones. LSTMs are designed to learn exactly this kind of sequential dependency.
In practice, LSTMs in sports prediction are significantly harder to work with than the gradient boosted alternative, and the accuracy gains in production are modest enough that we use them selectively rather than as the primary model for any output type. The failure modes are instructive.
First, LSTMs require substantially more data to train well. A gradient boosted model for outcome prediction works reasonably well with a few seasons of historical data for a sport with 30 games per team per season. An LSTM on the same data tends to overfit or produce poorly calibrated probabilities unless you have significantly more training examples, either through a longer historical window or by training across multiple similar sports simultaneously. Sports prediction is a small-data problem by machine learning standards, and LSTMs feel that constraint acutely.
Second, LSTMs are sensitive to the definition of the sequence. Should your sequence be games in order? Or rolling 10-game windows? Or weekly snapshots? Each choice implies a different model of how recent history affects future performance, and the wrong choice produces worse results than a well-tuned gradient boosted model on the same data. There is no theoretically correct answer; the right sequence definition varies by sport and by what you are trying to predict.
Where LSTMs add genuine value: in-game state prediction, where the sequence is meaningful at a finer granularity. Predicting how a game is likely to evolve from the current quarter score, possession data, and recent possession efficiency is a problem where the sequential structure is well-defined and the state space is bounded. We use an LSTM for our in-game inflection point signals for this reason. Pre-game outcome prediction is a weaker use case.
What This Means in Practice
The selection among these three approaches in a production sports prediction system is not a single architectural decision made at the start of a project. It is an ongoing operational choice that depends on what you are predicting, how much data you have, and what you need to do with the output.
For editorial talking points that need to be explainable, gradient boosted trees with SHAP attribution is the right combination. For calibration benchmarking and venue-effect quantification, logistic regression provides cleaner isolation of individual factors. For in-game signals where sequence matters precisely, LSTMs are the right tool despite their fragility.
The broader principle is that sports prediction problems are heterogeneous. A model that is the right choice for one prediction type in one sport is often not the right choice for a different prediction type in the same sport. Building a system that treats all prediction tasks as identical and applies one model class to everything is almost always leaving accuracy on the table.
We ended up with a small ensemble of models for most sports, each contributing to different facets of the final output. That is more complex to maintain than a single model, but it is what the data supports.