Wildfire Activity Nowcasting from Satellite Detections + Weather
Short-term forecasting of fire activity per spatial grid cell and time window, based on NASA FIRMS satellite detections (MODIS / VIIRS) and daily weather (Open-Meteo). From the raw detections we build a (grid cell x time window) panel with history features and then solve the same problem in three flavours:
- a binary "any fire next?" task
- an ordinal risk-level task (0/1/2)
- a count regression
We compare simple baselines, gradient boosting and sequence models, run an ablation study, and check whether weather features help.
What we achieved:
- a full reusable preprocessing pipeline
- working models for all three tasks (persistence baseline, gradient boosting on raw/balanced/PCA features, LSTM and TCN)
- a two-stage count regressor
- an ablation study and a weather-augmented variant
Because the full USA data did not fit in laptop memory, the heavy per-country runs were split into four Google Colab notebooks sharing one helper module. Unfortunately, free plan was not enough to run the full pipeline, so we only have results for Poland and India, but the code is ready to run on a High-RAM runtime when available.
Predict short-term fire activity (number of hotspots, intensity bucket) for a grid cell and time window, given its recent detection history.
NASA FIRMS Active Fire (MODIS/VIIRS) https://firms.modaps.eosdis.nasa.gov/active_fire/ and archive downloads https://firms.modaps.eosdis.nasa.gov/download/. Daily weather from Open-Meteo. Per-country zips live in data/<country>/<country>_<sensor>.zip and weather in data/weather/<country>_weather.zip.
- Persistence baseline (lag-1)
- Gradient boosting with lag features (raw, balanced and PCA variants)
- Sequence models (LSTM/TCN)
- Count regression uses a two-stage approach - a classifier decides "any fire", then a regressor predicts the count on fire-only rows
Time-aware validation (last 30% of unique time windows held out as test, with a leakage guard)
Metrics:
- Binary task - AUC, PR-AUC
- Risk level - macro F1, macro Recall
- Count - MAE, RMSE
Risk maps + actionable insights for early-warning prioritization.
.
├── wildfire_activity.ipynb # original working notebook
├── colab/ # Google Colab notebooks
│ ├── wildfire_lib.py # pipeline + models
│ ├── 00_test_viirs_sample.ipynb # quick test on small VIIRS
│ ├── 01_poland.ipynb # Poland (MODIS) + weather
│ ├── 02_india.ipynb # India (MODIS) + weather
│ └── 03_usa.ipynb # USA (MODIS) + weather, needs a High-RAM runtime
├── data/ # FIRMS data (per-country zips) + weather
├── results/ # leaderboard CSVs + figure PNGs
├── .gitignore / .gitattributes # ignore specific files, enable LFS
├── README.md # quick project overview
├── report.md # a detailed description of the actions, along with the results
└── pyproject.toml / uv.lock # dependencies
All shared code sits in colab/wildfire_lib.py, so the four Colab notebooks reuse the same functions instead of copying the pipeline.
- Install
uv- python package and project manager https://docs.astral.sh/uv/getting-started/installation/ - Open a terminal in the project folder and run
uv sync - Select the generated
.venvas the kernel for the Jupyter notebook.
Poland runs fine locally. India is heavy, but 32GB RAM is enough, and USA is too big for a local machine. We don't know what will be the exact memory requirements for the full USA run, but it will likely require a High-RAM runtime.
- Upload the
colab/folder (it containswildfire_lib.py) and thedata/folder to Google Drive, e.g.MyDrive/eksploracja_danych/. - Open one of the notebooks from
colab/. - In the Setup cell, set
PROJECT_DIRto your Drive folder (default/content/drive/MyDrive/eksploracja_danych). - For USA: Find a High-RAM runtime.
- Runtime > Run all. Results (leaderboard CSVs + figure PNGs) are saved to
results/<country>/on Drive.
Start with 00_test_viirs_sample.ipynb - a quick sanity check that everything wires up before spending resources on the big countries.
- Problem framing & success criteria: define target, stakeholders, constraints, evaluation metric(s).
- Data acquisition & understanding: download/API pull, data dictionary, initial EDA.
- Cleaning: missing values, duplicates, outliers, label noise, leakage checks.
- Preprocessing: encoding, scaling, text/image preprocessing, train/validation/test splits (timeaware if needed).
- Feature engineering: domain features (lags, aggregates, embeddings, graph features, geospatial joins).
- Model selection: baselines + 2-4 candidate models.
- Training & tuning: cross-validation/backtesting where appropriate; hyperparameter search.
- Testing & interpretation: final holdout test; error analysis; explainability (e.g., SHAP, permutation importance).
- Executive summary report: a concise, decision-oriented summary with key findings, limitations, and next steps.
- Emilia Stacherczak
- Przemysław Popowski