Inspiration

We built SE7EN for the House Edge challenge at TAMU Datathon 2026. The goal was to predict slot machine payouts from historical spins, but the challenge was that different machines could follow different patterns, and those patterns could change over time. We wanted to see how well we could predict those changes using only the information available before each spin.

What it does

SE7EN predicts the probability of five possible payouts: 0×, 1×, 2×, 5×, and 20×. Instead of guessing one outcome, our model returns a probability distribution for each machine's next spin.

How we built it

We used Python to process the machine histories, develop forecasting models, and evaluate their predictions.

Round 1 — Main Round

We started with a temporal model that used lagged interactions between earlier spins. We combined models that captured different types of changes, then tested how to adjust their predictions through probability calibration.

Our final Round 1 approach used narrow-window change detection and two-region calibration. It scored 48.91/60 on public validation.

Round 2 — Adaptation

For the adaptation round, we tested how well our original model worked on a new dataset. We found that its calibration did not transfer well, and simply adjusting the temporal model was not enough.

We then moved to a more machine-specific approach. Using regularized regression and empirical Bayes shrinkage, we estimated relationships from each machine's own history while using information from similar machines to stabilize the estimates.

The model also handles shorter and longer histories differently. It uses lag interactions, recency weighting, and time-dependent features to capture changes in machine behavior.

Our final adaptation model scored 17.26/20 on public validation.

Challenges we ran into

One of the biggest challenges was figuring out which improvements would actually generalize. Some changes looked promising on validation but performed worse when we tested them on held-out training episodes.

We also learned that the same model settings did not work equally well for every machine. Short histories gave us less information, while longer histories could contain patterns that had already changed.

Another challenge was making sure our predictions were reproducible. We checked that the saved models and code could regenerate the submission files without using future outcomes.

Accomplishments

We built forecasting pipelines for both competition rounds and tested several approaches, including temporal models, calibration, gradient boosting, and machine-specific regression.

Our final public validation scores were:

  • Round 1: 48.91/60
  • Round 2: 17.26/20

We also tested the final Round 2 model using episode-held-out experiments rather than relying only on the public validation score.

What we learned

Our biggest takeaway was that a model needs to capture differences between individual machines, not just overall patterns. We also learned that a higher validation score doesn't always mean a model will perform better on unseen data.

Testing changes carefully, checking for overfitting, and keeping the predictions reproducible turned out to be just as important as building the model itself.

What's next

We would like to improve how the model detects changing behavior and evaluate it on more unseen episodes. We would also like to explore ways to make machine-specific predictions more reliable when only a short history is available.

Built With

Share this project:

Updates

Submission history