Skip to main content
Ross Bulat
Full Stack Engineer
View all authors

Building a MovieLens Recommender with Biased Matrix Factorisation

· 6 min read
Ross Bulat
Full Stack Engineer

Google Colab notebook: Open in Google Colab · Raw Notebook: Download .ipynb

For this exercise, I developed a recommender system in stages, from simple baselines to biased matrix factorisation, before asking whether SHAP explanations make individual predictions more understandable. What stood out was that better rating prediction did not automatically produce better top-10 ranking.

Inside a CNN: Testing Similar and Dissimilar Images

· 5 min read
Ross Bulat
Full Stack Engineer

I used CNN Explainer to follow two images through a small convolutional neural network: an espresso, which matches one of the model's trained classes, and a sunflower, which does not. Comparing them exposed a basic limitation of image classifiers: a model can only choose from the labels and examples represented in its dataset.

Facial Recognition, CNNs and the Cost of Being Wrong

· 3 min read
Ross Bulat
Full Stack Engineer

Wall's article made me think about facial recognition less as a model-accuracy problem and more as a deployment problem: what happens when an organisation treats a CNN score as objective evidence? A convolutional neural network can return a probability or similarity score, but that score does not, by itself, establish a person’s identity. In a photo app, a wrong match can merely be irritating; but in policing, border control, or military use, it can expose someone to surveillance, exclusion, arrest, or harm (Wall, 2019).

A Hybrid Neural Network for Airbnb Demand

· 4 min read
Ross Bulat
Full Stack Engineer

Google Colab notebook: Open the hybrid Airbnb demand notebook · Raw Notebook: Download .ipynb

I wanted to find out whether combining text, location context and ordinary listing details could predict Airbnb demand more effectively than structured data alone. I tested this using the Airbnb NYC 2019 dataset, with 48,884 listings remaining after invalid rows were removed. For this experiment, I defined “high demand” as at least 1.58 reviews per month, the upper quartile of the dataset. This is a proxy for demand rather than a measure of confirmed bookings or occupancy, so the results should be interpreted as predictions of review activity.

Global Population and GDP - Correlation and Regression

· 8 min read
Ross Bulat
Full Stack Engineer

Google Colab notebook: Open in Google Colab · Raw Notebook: Download .ipynb

This portfolio activity investigates the relationship between a country or entity's mean population and its mean total GDP across the years 2001-2020. The analysis uses two World Bank datasets, global_gdp.csv and global_population.csv, and applies descriptive analysis, Pearson correlation, log-scale visualisation, and simple linear regression.

Airbnb NYC Dataset - Demand Proxy Rationale

· 4 min read
Ross Bulat
Full Stack Engineer

Google Colab notebook: Open in Google Colab · Raw Notebook: Download .ipynb

The Airbnb NYC 2019 dataset is useful for exploring listing-level patterns, but it has one important limitation: it does not contain direct demand measures. There are no actual booking counts, occupancy rates, revenue figures, or guest ratings that can be used as a clean target variable.