Skip to content
Project 02 / 04Machine LearningHospitality · Product Analytics

Sydney Airbnb Guest Satisfaction Classifier

Supervised ML pipeline that finds what actually drives guest satisfaction while debunking a misleading signal.

02 · Machine Learning
SHAP beeswarm summary plot showing host_scale_20+, amenities_count, and number_of_reviews as the strongest drivers of predicted guest satisfaction
Role
Solo project / independent build
Stack
Python, scikit-learn, XGBoost, SHAP
Scope
17,730 Sydney listings · Sep 2025 scrape
  • 17,730

    Sydney listings analysed

  • 0.771

    ROC-AUC on held-out test data

  • 3

    Model families compared

  • 46.6% / 16.2%

    Top-tier rate, 1-listing vs 20+ hosts

The build

How it came together.

  1. 01

    The question

    The question I set out to answer sounds simple: what makes an Airbnb listing top-tier? But I wanted to answer it honestly, without the usual shortcuts. I built an end-to-end supervised ML pipeline on Inside Airbnb's Sydney dataset (17,730 listings, Sep 2025 scrape), classifying listings as top-tier vs. standard. Rather than picking an arbitrary percentile, I defined the target (review_scores_rating ≥ 4.9 with ≥ 5 reviews) through class-balance testing so the label meant something.

  2. 02

    The blocker

    Early on I hit a wall: the price column was 100% null, and I verified that at both the listing and calendar level. Instead of dropping the dataset, I pivoted the feature strategy to host- and property-behaviour signals and documented the sourcing decision, because a real project rarely gives you the feature you expected.

  3. 03

    Feature engineering

    Feature engineering was where the honesty mattered. I derived host tenure from signup dates, parsed amenities into counts and binary flags, and recovered bathrooms via regex, while deliberately excluding leakage columns like review sub-scores and host_is_superhost that would have let the model cheat. I compared Logistic Regression, Random Forest, and XGBoost, then tuned the winner with RandomizedSearchCV (3-fold CV) to reach ROC-AUC 0.771 on held-out test data.

  4. 04

    The finding

    Then SHAP (TreeExplainer) delivered the headline. The strongest driver of guest satisfaction wasn't price or amenities. It was host portfolio size: single-listing hosts hit a 46.6% top-tier rate versus just 16.2% for hosts managing 20+ listings. That one insight also explained a misleading instant-bookable pattern in the raw data. Instant-booking looked like it hurt satisfaction, but it was really just a marker for large operators who can't personally vet every stay. Two different methods, EDA and SHAP, landing on the same answer.

Visuals

What it produced.

02 figures

Fig. 01
Project summary infographic: 17,730 raw listings cleaned and feature-engineered, model comparison by ROC-AUC, and the host-portfolio-size finding
The project at a glance: from 17,730 raw listings to a tuned, SHAP-explained model.
  • Fig. 02
    Confusion matrix on the held-out test set showing top-tier vs. not-top-tier predictions
    Confusion matrix on the held-out test set: top-tier vs. standard listings.
Tech stack
  • Python
  • scikit-learn
  • XGBoost
  • SHAP
View source on GitHub

What's next

Have a similar problem to solve?Let's talk it through.

I'm looking for a junior data analyst or analytics engineer role in Sydney. If something here looks like the work you need doing, get in touch.

Open to opportunitiesSydney, Australia