Mapping and Predicting Food Insecurity Across Houston with ML and Geospatial Intelligence
NutriMap is a data-driven web application that identifies and visualizes food insecurity patterns across Houston census tracts. It uses unsupervised machine learning and public demographic datasets to cluster neighborhoods by food insecurity risk and enables community planners, nonprofits, and researchers to investigate temporal trends and future vulnerabilities.
NutriMap is built on a hybrid machine learning and data visualization pipeline that:
- Clusters census tracts into six risk levels, and three simple ones: High Risk, Moderate Risk, and Low Risk, using a feature compressor (autoencoder) and K-Means clustering.
- Tracks change over time (e.g., 2015 vs. 2019) to show how food insecurity evolves across neighborhoods.
- Visualizes census tracts on an interactive Leaflet map using GeoJSON boundaries and CSV-based metadata.
- Displays tract-level details in hover/click popups: median income, education levels, poverty rate, and more.
- Scalable nationwide — with an easy-to-use search bar, NutriMap’s framework can be applied to EVERY STATE AND EVERY TRACT in the U.S. to assess local food insecurity risks.
NutriMap uses a three-step ML approach developed in Python to both analyze current risk levels and predict future tract actions:
- Inputs: 15+ census variables per tract (poverty %, unemployment, vehicle access, SNAP participation, etc.)
- Model: Shallow autoencoder trained to reconstruct input → compresses data into latent space
- Goal: Extract nonlinear relationships between variables while reducing redundancy
- Algorithm: Standard K-Means clustering on the autoencoder’s compressed features
- Output: Each tract is assigned a cluster (0, 1, 2, 3, 4, 5, or 6), corresponding to its relative food insecurity level
- Post-processing: Clusters are mapped to interpretable labels (e.g., 0 → Food Secure)
- Model: Gradient-boosted decision trees trained using the historical census data as input and the cluster labels from Step 2 as target outputs
- Purpose: Predict which census tracts are most likely to shift into higher-risk categories in the future
- Benefit: Empowers stakeholders to anticipate food insecurity trends rather than react to them
This pipeline was run offline using
scikit-learn, andPyTorch, and the results were exported as CSVs for use in the frontend, being converted into readable data by PapaParse (so technically it's a static pipeline).
- React (Vite) — App framework for performance and flexibility
- Leaflet.js — Interactive maps
- GeoJSON — Tract-level boundary visualization
- Papaparse — Fast CSV parsing client-side
- Python (PyTorch, scikit-learn, pandas) — Autoencoder training, clustering, preprocessing
- Jupyter Notebooks — Model experimentation and tract-level analytics
- Post-processing pipeline — Cluster remapping, formatting, and JSON/CSV generation
- Clone the repo
git clone https://github.com/blueskinlizard/nutrimap.git
cd nutrimap- Build the image
docker build -t nutrimap .- Run the container
docker run -p 3000:80 nutrimap- Open in browser
Visit http://localhost:3000 to use NutriMap.