This is what I would focus on. - Limitations on `max_depth` might cause terminal nodes to group together observations with very small probabilities with other observations where probabilities aren't that small, so the effect is to move the leaf weights away from extreme values. Likewise, something similar with large probability observations. Try increasing `max_depth`. - `lambda` penalizes the absolute value of the weights. You want weights with large absolute value, so try setting this smaller. - Column subsampling could omit the important features (time left in the game sounds important), so I wouldn't use it. - Increasing the maximum number of trees dramatically and using early stopping could help. - Tuning the learning rate alongside these parameters is important. Since your question is basically about calibration of probabilities, something to know is that XGBoost is notorious for producing poorly-calibrated predicted probabilities. It's unclear if this is the culprit in your case. I think you might be able to close the gap using different hyper-parameters. --- I wonder if an XGBoost model is the best approach, because your data are arranged sequentially in time (60, 50, ... 10 minutes remaining, etc.). I would investigate alternative models that can account for this temporal dependency.