HomeAboutExperienceProjectsContactBlog
RésuméDex0/17
← Projects

Keeneland race model

A hackathon XGBoost model that ranks the likely top finishers of Keeneland races.

POSTODDSFINISH0.6 × MODEL + 0.4 × ODDS193RD24.52ND3315TH4214TH51.81ST

The model's top three: Diblasi, Ohoopee, Twirling Ridge.

Race 1 at Keeneland on April 13, 2025, as the model called it. Places are filled one at a time. For each of the first three, every horse still in the pool scores 0.6 times the model's chance of that finish plus 0.4 times how short its odds are, and the best score takes the place. Before that, the win chance gets 0.2 added for the three shortest prices and 0.1 taken off long shots; fourth and fifth fill from what is left.

Built over a race weekend: ~319k historical entries become per-horse and per-jockey profiles by surface, track condition, distance, pairing, recent form and odds, feeding a multi-class XGBoost model that outputs a ranked top five for each race.

Lesson

Looking back, the horse and jockey aggregates use each horse's whole history and validation rows were split at random, so later races leak into the features. Computing them strictly from earlier races, and validating on later dates, is the fix, and most of the work in sports prediction.

Next: DatoteA browser-based statistics workbench: drop in a CSV, get charts, tests and cleanup.

Year
2025
Platform
Python
Status
Hackathon project
Code
Source
Built with
Python, pandas, XGBoost, scikit-learn, SHAP
  • 318,702 training rows
  • 241 engineered features
  • 58,831 horses