VALUES
Real Estate Price Prediction

WHAT IT IS
Values is an interactive website that predicts prices for commercial and industrial property in Singapore: offices, retail units, shophouses, factories, warehouses and business parks. A user enters a property's type, location, size, floor level and lease details; the platform returns a machine-learning price estimate, puts it in context with median price per square foot and historical comparisons, and shows the location, nearby amenities and price trends on a map.
THE PROBLEM
Property prices depend on location, size, tenure, nearby amenities and market conditions, but listing sites only show asking prices or past transactions. For new buyers and investors that is data without a conclusion. Most existing tools either focus on residential homes or route you to an agent for a number.
THE SOLUTION
A full-stack web platform rather than a notebook: a React interface collects property details, a Flask API turns them into features, queries a PostgreSQL + PostGIS database of public transaction and geospatial records, and runs a regression model. The estimate comes back with comparisons, amenity maps and trend charts, and premium users can compare predictions side by side, bookmark them and export summaries.
MY ROLE
Full-stack developer on my final year project. I built the React interface and the Flask API layer that connects it to the PostgreSQL/PostGIS data and the prediction models, integrated the prediction flow into the application so an estimate comes back with its comparisons, maps and charts, and carried the data flow from input to result end to end. I also co-authored the technical manual: requirements, functional hierarchy, stakeholders, data collection, business model and development methodology.
HOW IT WORKS
- 01Enter a property: type, address or location, floor area, floor level and lease/tenure.
- 02The Flask API validates the input, geocodes the location and derives features: remaining lease, floor-level band, distance to the nearest MRT and amenities.
- 03PostGIS supplies the spatial context: nearby transactions, planning area and proximity queries such as properties within 500 m of a station.
- 04A regression model trained on cleaned URA and Data.gov.sg transaction records returns the predicted price.
- 05The interface presents the estimate with median price per sq ft, historical comparisons, an amenity map and trend charts, comparable and exportable for premium users.
ARCHITECTURE
REQUEST FLOWS LEFT → RIGHT
CLIENT
React
Input forms, prediction views, comparison tool, charts and Google Maps. Deployed on Vercel
API
Flask
REST endpoints that validate input, engineer features, call the model and shape the response. Hosted on Render
DATA
PostgreSQL + PostGIS
Transaction history plus spatial queries: proximity to MRT and amenities, planning-area mapping
MODEL
Scikit-learn · XGBoost · GeoPy
Regression on property, lease and location features; distance features from GeoPy
MACHINE LEARNING
The model predicts a sale price from structured property attributes: type, floor area, floor-level band, lease start and remaining lease, planning area and proximity to MRT and amenities. Candidates were trained in a Scikit-learn pipeline with GridSearchCV and compared on MAE and R² on a held-out split; XGBoost, Random Forest and Gradient Boosting regressors were evaluated, with permutation importance used to check which features drive the estimate. Training data came from public sources (URA transactions, Data.gov.sg rental indices) after de-duplication, standardisation, outlier removal and one-hot encoding.
GEOSPATIAL · POSTGIS
Location is treated as a first-class feature, not a label. PostGIS stores each record with coordinates and planning area so the API can run spatial queries (nearest MRT, amenities within a radius, transactions in the same zone), and GeoPy computes the distance features the model consumes. Google Maps renders the property, nearby facilities and zoning context back to the user.
CHALLENGES
- 01Merging commercial and industrial transaction data from several public sources into one training set: inconsistent categories and near-duplicate names had to be standardised, with fuzzy matching (RapidFuzz) used to align them.
- 02Wiring the three layers together: the ML model → Flask → React path needed integration testing so features, response shapes and load behaviour matched end to end.
- 03Deploying a Python API and a React app on separate hosts (Render + Vercel): CORS, routing and environment variables broke first and were fixed before production, with automatic deploys from GitHub after that.
OUTCOME
- Full-stack platform built end-to-end: React · Flask · PostgreSQL/PostGIS · ML, deployed on Vercel + Render
- Focus on an under-served segment (commercial and industrial property) using open government data
- Tiered product: free, premium, agent and admin roles with comparison, bookmarks, trends and exports
WHAT I LEARNED
A prediction is only useful once it survives the whole path from data to interface: the feature engineering has to be reproducible in the API, the database has to answer spatial questions fast enough for a web request, and the result has to be explained with comparisons a non-specialist can read. Working on the frontend and backend of that path taught me more about product engineering than the model itself.


