Skip to main content

Why-Fires

From a public map of 107M fire detections to a calibrated wildfire risk model.

Data and ML · Oct 2023 – Jun 2026

Did it burn?

1 January 2024

Loading the test days

the riskiest 5%fire within 30 daysother sampled cells

The 2026 model predicts whether fire is detected in a 0.1° cell, about 11 km across, within the next 7 and 30 days. Pick a month of its held-out test: its riskiest cells for that day light up, then the fires that really came within 30 days land on the map.

One test day per month, January 2024 to October 2025, from data the model never trained on. Each day shows the test table's sampled rows: cells with fire that day plus sampled cells without, not every cell in the country. Cells are drawn larger than 0.1°.

When it says 30%, about 30% burn.

The whole held-out test, sorted by the risk the model gave and cut into ten bins of equal size. The white mark is what it said on average; the bar is the share that burned.

Bin 8 of 10 · 166,975 cell-days

It said 27.9%. 30.4% burned.

The whole test, read once: 1,669,748 cell-days from 1 January 2024 to 31 October 2025.

The riskiest shares of the whole held-out test, 30-day label
The riskiestSaw fire within 30 daysShare of all fires
1%87.1%4.4%
5%72.6%18.5%
10%63.1%32.1%
20%52.0%52.9%
All19.7%100%

30-day ROC AUC 0.823, average precision 0.550 against a 19.7% base rate. 7-day: ROC AUC 0.818, average precision 0.373 against 10.5%.

How the model works

A staged Python pipeline of 8 stages, each writing a JSON report. The model, its settings and its calibration were chosen on 2023 validation data; the test split was read once.

1 / 8Detections

Raw detections per month, before filtering. The lines overlap because the satellites often see the same fires.

How it got here

One project in three versions. The two before the model, each with its own picture and its own data:

  1. 2023 The notebooksOct – Nov 2023
  2. 2025 The public mapFeb – Jul 2025
  3. 2026 The Wildfire Risk ModelFeb – Jun 2026

2023 · The notebooks

Personal Jupyter notebooks that joined CMIP6 climate-model fields (burnt fraction, precipitation, wind, humidity and temperature from CNRM-ESM2-1's historical run) with MODIS fire detections for the US, 2001–2022, and fit a scikit-learn decision-tree regressor.

2001
The notebook's own maps, 2001–2014: the grid cells where the climate model's burnt fraction passed 1% that year. Climate-model output, not satellite observations.

2025 · The public map

A full-stack app on NASA FIRMS MODIS data for every country: a Flask backend that streamed its progress over SSE, Plotly maps filtered by year, month, date, day or night and fire type, a point detail view and a SARIMA daily fire forecast. A React frontend was started.

2001–2024 107,483,508 detections

All 107,483,508 detections behind it, 2001–2024, counted per 1° cell.

What it can't tell you

  1. It is an offline research prototype, not a service. The model's maps on this page are historical test days, scored after the fact; none is a forecast.

  2. Each test day shows the test table's sampled rows, so its counts are not a census of the country.

  3. The shipped models were fit on 600,000 rows, and background (never-fire) cells were only 0.42% of them.

  4. Lag and rolling features count sampled rows, not calendar days.

  5. 157 of the 500 background cells lie outside the US: they were sampled from rectangular boxes.

  6. The 2023 maps are a climate model's output, not satellite observations, and the 107M detections belong to the 2025 map, not to this model.

2026
Python, pandas, Polars, PyArrow, scikit-learn, GeoPandas, xarray, rasterio
2025
Flask, Plotly, statsmodels (SARIMA)
2023
Jupyter, scikit-learn

Data: NASA FIRMS (MODIS, VIIRS), Copernicus ERA5, the US Drought Monitor, OpenStreetMap contributors, SILVIS Lab (WUI), WorldPop and CMIP6 (CNRM-ESM2-1).