← All projects
completed

ICU & Mortality Forecasting (COVID-19)

Forecasting COVID-19 ICU occupancy and deaths for the Netherlands, Germany, Bremen and the UK, comparing linear, Random Forest and XGBoost models with time-series backtesting.

  • −87% MAE vs linear baseline
  • 4 regions, 62-day holdouts
  • Time-series CV
Bar chart comparing Random Forest and XGBoost errors with the linear baseline for four forecasting targets; the tree models' errors are 13% to 95% of the baseline's.

Problem

M.Sc. coursework project. Hospitals and public-health teams need to know what ICU load and mortality will look like in the coming weeks. The goal was to forecast January 2022 values for several regions and find which model family to trust for each one.

Data

Public daily COVID-19 series (ICU occupancy, deaths) for the Netherlands, Germany, the German state of Bremen, and the UK, from 2020 to January 2022.

Approach

  • Lag-based features on each daily series.
  • Backtest first: a 2021 backtest period to check the method, then a forecasting run with a 62-day holdout (Dec 2021 – Jan 2022).
  • Compared Linear Regression, Random Forest and XGBoost, using TimeSeriesSplit cross-validation so no model ever trains on the future.
  • Picked the best model per region, inspected feature importances, and exported January 2022 forecasts as CSV.

Results

Mean absolute error on the 62-day holdout (Dec 2021 – Jan 2022, 7-day smoothed targets):

Target Linear Random Forest XGBoost
Germany, daily deaths 345.0 52.7 46.4
Netherlands, daily deaths 10.4 9.9 6.3
Netherlands, ICU occupancy 91.1 39.3 34.6
Bremen, daily deaths 3.0 0.44 0.43
UK, daily deaths — 19.2 48.8
  • In Germany, XGBoost cut the error by 87% compared with the linear baseline.
  • No single model wins everywhere. In the UK, Random Forest beat XGBoost, and cross-validation showed XGBoost’s error varied a lot between folds.
Bar chart of each tree model's error as a percentage of the linear baseline's error. Germany deaths: Random Forest 15%, XGBoost 13%. Bremen deaths: 15% and 14%. Netherlands ICU patients: 43% and 38%. Netherlands deaths: 95% and 61%.
Error as a share of the linear baseline's: tree models cut it most in Germany and Bremen.

What I learned

  • Honest time-series validation (backtest, then walk-forward CV) matters more than model choice. A random train/test split would have leaked the future into training.
  • Look at the error for each fold, not just the mean: a model with a good average can still be unstable.