Work / Machine Learning × Revenue Management
Predicting Hotel Cancellations to Maximize Yield
A cancellation model is only useful if it knows what its mistakes cost. This project ends not at an AUC score but at an overbooking policy that changes as the price of being wrong changes.
Team project · MSBA 315, AUB
Context
Hotel rooms are perishable inventory: a room unsold on the night is revenue that cannot be recovered. Chains defend against that with overbooking, but overbooking blind produces walked guests, and walking a guest costs far more than leaving a room empty.
The task was a supervised binary classifier over individual reservations — will this booking cancel — feeding a decision that a revenue manager actually has to make: how many rooms above capacity to sell.
Approach
- Public Hotel Booking Demand dataset: 119,390 reservations from a city hotel and a resort hotel, 2015–2017, 32 features.
- Cleaning: dropped the company column for missing-value density, treated a missing agent as its own category rather than an imputation, mode-imputed country, removed reservations with zero guests, excluded ADR values above $5,000.
- Feature engineering: total stay length, price per person, family and special-request flags, arrival month and weekday, deposit and customer type.
- Nine model configurations: logistic regression, random forest and XGBoost, each against a baseline, class weights and SMOTE. ROC-AUC as the primary metric, F1 alongside it.
- A Poisson arrival simulation on top of the model output to convert probabilities into an overbooking limit.
What the analysis showed
XGBoost with SMOTE was the strongest configuration at 0.8977 test AUC and 0.7266 F1 — but plain logistic regression reached roughly 0.88 once scaling and one-hot encoding were done properly. The spread across nine configurations was narrow. Preprocessing moved performance more than the choice of algorithm did.
The more useful result came from the cost side. Walking a guest was modelled at $300 against $120 for an empty room, a 2.5× asymmetry, which means the default 0.50 threshold is the wrong place to stand. Shifting the decision boundary to 0.55 recovered an additional $10,620 in modelled profit. Roughly 68% of errors fell in the 0.30–0.65 probability band, which is a direct instruction about where human review belongs rather than a model weakness.
Stress-testing the overbooking policy at $200, $300 and $400 walk costs moved the mean overbooking limit from 57.08 to 55.32 to 54.02, with modelled totals of $1.62M, $1.57M and $1.53M. The policy tightens itself as the cost of error rises, without manual recalibration.
What I'd do differently
- The data covers two properties over three years. Nothing here establishes that the same thresholds transfer to another market or another rate structure.
- The simulation assumes independent arrivals. Real demand is correlated across bookings — group cancellations break that assumption first.
- Cost parameters were assumed, not measured. In a real deployment the walk cost is the first thing to source from the business, because it sets the threshold.
- Deposit type deserves a leakage audit: a feature that partly encodes the outcome would flatter the model.
Team project for MSBA 315 (Machine Learning and Predictive Analytics), AUB. All monetary figures are modelled results on a public dataset — simulated outcomes, not realised business revenue.