IDSE data science project · Delhi, 2015–2020
Do Punjab–Haryana farm fires help predict Delhi's smog?
Every October and November, farmers in Punjab and Haryana burn crop stubble, and Delhi's air turns toxic. The fires clearly pollute. We asked a narrower, practical question: if you already know today's pollution and weather in Delhi, does adding satellite counts of those fires make the forecast for the next few days any more accurate? Each model was built twice, once with the fire data and once without, and tested on years it had never seen.
No, not measurably. In three different years, forecasts with fire data were neither reliably better nor reliably worse than forecasts without it. By the time the smoke matters, it is already showing up in Delhi's own pollution readings, which the model uses anyway.
- PM2.5
- Fine particles small enough to reach the lungs, in µg/m³. India calls above 60 unhealthy and above 250 Severe.
- Burning season
- 15 Oct – 30 Nov, when most stubble fires happen and smog peaks.
- Forecast error
- How far a forecast lands from the real reading, averaged over days (MAE, in µg/m³). Lower is better.
- Naive forecast
- "Tomorrow will be the same as today." Any model worth using must beat it. Also called persistence.
The results in four numbers
Live forecast
Try the model yourself. Pick a real day from the data (the results show what actually happened next), or type in your own conditions. Forecasts update as you type, using the exact code that trained the model.
What do the fires add to this forecast?
What if there had been no fires, or four times as many? The orange line re-runs the forecast with every fire count multiplied (×1 = what you entered). The blue dashed line is the model built without fire data. Even where the orange line moves, testing over three years showed this reaction does not make forecasts more accurate (see Findings).
Every model, every horizon
Forecast PM2.5 (µg/m³) from every model we built. Random Forest, Ridge and HistGB are three kinds of machine-learning model; the highlighted one was picked on 2018 data before testing. Persistence ("tomorrow = today") and the seasonal mean (the usual level for that time of year) are simple yardsticks.
Findings
We set three goals before testing. The main test used 2019, a year the models never saw. A wider check on 2017, 2018 and 2019 then showed that the small fire benefit seen in 2019 was luck, not a pattern.
2019 test year: how far off was each model?
Average error = average miss in µg/m³ (lower is better). RMSE weighs big misses more heavily. R² is the share of day-to-day variation explained (1 = perfect). Burning season = 15 Oct – 30 Nov, 47 days.
Does it hold up? Three years, 1–3 days ahead
Each year was forecast by models trained only on earlier years. "Fire benefit" = how much adding fire data cut the burning-season error (positive = helped, negative = hurt), over all 141 days. The 95% range is the plausible size of that change in µg/m³; when it spans zero, the effect could be nothing.
Figures
Data & exploration
Three free public sources: Delhi's official pollution readings, NASA's satellite fire detections, and historical weather.
| Source | What | Role |
|---|---|---|
CPCB via Kaggle city_day.csv | Daily Delhi pollutants, Jan 2015 – Jul 2020 | What we predict, and today's readings |
| NASA FIRMS MODIS C6.1 | Satellite fire detections over India | The fire data being tested |
| Open-Meteo ERA5 archive | Delhi weather & boundary-layer height | Weather, which also drives smog |
Exploratory figures
How the models were trained
The whole pipeline, from download to this website's models, reruns with one command,
./run_all.sh, and gives the same numbers every time.
- DownloadFIRMS yearly files, Open-Meteo JSON, Kaggle CSV
- CleanDuplicates, impossible values, UTC→IST, region filter; target never imputed
- FeaturesPast-only lags & rolling windows; forward-fill only
- Leakage testsAutomated checks that no input secretly uses future data
- TuneTry settings on 2015–17, always validating on later months (GridSearchCV, TimeSeriesSplit)
- SelectPick the model with the lowest error on 2018
- Test onceRetrain on 2015–18, score 2019 a single time
- RobustnessRepeat for 2017, 2018 and 2019, at 1–3 days ahead
Split by time, never at random
Neighbouring days are nearly identical, so a random split would leak tomorrow into training. Rows are assigned by the date being predicted.
Features
The inputs each model sees. "Fires" are the only difference between the two versions of each model. Weather is today's measured weather, not tomorrow's, so the model never relies on a perfect weather forecast. Calendar inputs describe the day being forecast, which is known in advance.
Tuned hyperparameters
Report & notebooks
The full write-up, including limitations and viva notes.
Limitations to keep in mind
- Predictive, not causal. "No forecasting skill" does not mean fires don't pollute Delhi; it means their effect is already in today's measurements.
- Satellites miss fires at night, under smoke and cloud, and when small. MODIS passes around 10:30 and 13:30.
- Only three test seasons and data ending in 2020; one city-average series and one weather grid point.
- Post-hoc steps (alert threshold, robustness check) are labelled as such and reported alongside the primary result.