MSc thesis, University of Zielona Góra, 2026

Win probability in Counter-Strike 2

MSc in Data Engineering, specialising in data mining systems (2025–2026), after a BA in Economics (2021–2024), both at the University of Zielona Góra.

A model that gives the probability of winning a round, second by second. I downloaded professional match recordings with Selenium, parsed them with demoparser2 and built the features in pandas: 9,196 maps, 187,361 rounds and 16.8 million game states.

I compared nine models, validated by match groups and walk-forward by quarter, with bootstrap tests, ablations, calibration and SHAP. Gradient boosting came out best: LightGBM log loss 0.527, ROC-AUC about 0.81–0.82 in the quarterly walk-forward tests, and an expected calibration error (ECE) of 0.0086 for the production XGBoost model. Predictions are served by FastAPI to a React app.

All nine models, five-fold cross-validation grouped by match, so rounds from one match never land on both sides. Lower log loss and Brier are better.
ModelLog lossROC-AUCBrier
LightGBM0.52670.80360.1790
CatBoost0.52720.80590.1786
XGBoost (production)0.52890.80170.1800
Random forest0.52950.80350.1797
MLP0.53230.80160.1807
Extra trees0.53320.80430.1805
Logistic regression0.55180.79180.1858
Linear regression baseline0.59190.78890.1891
Ridge classifier0.60440.78890.2074
Walk-forward by quarter: train on every earlier quarter, test on the next one. With little history, in 2024 Q1 and Q2, the model is weaker; from 2024 Q3 on, XGBoost stays at 0.81–0.82. Here XGBoost has fixed settings (300 trees).
Test quarterTraining mapsLogistic AUCXGBoost AUC
2024 Q18440.73020.6498
2024 Q21,4480.79730.8049
2024 Q33,5190.80050.8140
2024 Q45,3150.80320.8183
2025 Q15,9990.80510.8217
2025 Q26,4570.80380.8190
2025 Q37,1720.79800.8119
2025 Q47,8280.80160.8142
2026 Q18,7700.79560.8094

Read the thesis in 5 minutes

The thesis app replaying a round on Mirage with the win probability bar and its curve over time
The thesis app replays a round on the map radar, with the win probability over time.