Problem
Dengue case counts in one district depend on its neighbours, on recent weather, and on signals that show up in local health news before they show up in the numbers. A forecast that uses only one of those misses the rest. The aim is to predict outbreaks early enough to act on.
Users
Public-health surveillance teams. The web app presents the forecast as a dengue early-warning view, state by state and district by district.
Constraints
- Sudden spikes. Outbreak data has huge outliers that can dominate a squared-error loss.
- Embedding size. BioBERT embeddings are 768-dimensional, which is too large to fuse efficiently alongside a handful of weather and case features.
- Data. Three inputs are needed: processed cases with weather variables, news headlines per date and district, and a district connectivity matrix.
What I built
- News signal: BioBERT encodes headlines into 768-dim embeddings, compressed to 32 dims with PCA.
- Spatial signal: an adjacency matrix of district connectivity, modelled with a Graph Attention Network (GAT).
- Temporal signal: an LSTM over rolling 7-day windows of weather, past cases and news embeddings, predicting one day ahead.
- Training: one model (
EpiGraphModel) handles all three, optimised with Huber loss and early stopping, then evaluated on unseen data.
Metrics
Success was defined before the model was built: MAE, RMSE and outbreak detection accuracy on unseen data. Results as recorded in the repo's PROJECT_OVERVIEW.md:
| Metric | Value | Meaning |
|---|---|---|
| R² | 0.585 | Explains 58.5% of the variance in case counts |
| Outbreak detection accuracy | 63.0% | Prediction within 50% or 10 cases of the actual count |
| MAE | 26.74 | Average absolute error in weekly case count |
| RMSE | 55.91 | Penalises large misses |
Trade-offs I made
- Huber loss.Sudden case spikes pull the model around less, at the cost of penalising large misses less.
- PCA from 768 to 32 dimensions.The news signal becomes cheap enough to fuse, at the cost of some of the information in the embedding.
