Evaluating probabilistic forecasts

Three tools you meet in the NFIDD forecast-evaluation session — the CRPS and the DSS score how good a forecast is, while the PIT histogram diagnoses why. The guiding principle throughout: maximise sharpness subject to calibration.

The big picture

What makes a probabilistic forecast "good"?

A probabilistic forecast is not a single number but a whole distribution over what might happen. To judge it we use two ideas:

The goal of forecast evaluation: maximise sharpness subject to calibration (Gneiting et al., 2007). Be as confident as you can get away with — but no more.

A proper scoring rule is a score, assigned to each (forecast, outcome) pair, that you minimise in expectation only by reporting your true beliefs. It rewards calibration and sharpness together, so it can't be gamed. Here we use the convention throughout that lower is better.

ToolTypeAnswersUnits
CRPSscoreHow far is the whole forecast distribution from the outcome?same as the data
WISscoreThe CRPS computed from a handful of quantiles (forecast-hub format)same as the data
DSSscoreSame, using only the forecast's mean & spreadunitless (log)
PITdiagnosticWhy is calibration off — too sharp, too wide, or biased?a histogram

CRPS score · lower is better

Continuous Ranked Probability Score — the MAE of probabilistic forecasts

For a point forecast you would use the mean absolute error: the distance between your single guess and the truth. The CRPS generalises this to a forecast that is a distribution. Write the forecast as its cumulative distribution function (CDF) F, and the observed value as y. The CRPS compares the forecast CDF to the "perfect-hindsight" CDF — a single step from 0 to 1 at the value that actually happened:

CRPS(F, y) = ∫−∞ ( F(x) − 1{x ≥ y} )² dx

The shaded region below is the CRPS: wherever the smooth forecast curve disagrees with the step at the observation, that squared gap is added up. A forecast that is both accurate (centred near y) and sharp (steep) leaves little gap and scores low. Drag the observation, or widen the forecast, and watch the area — and the score — change.

forecast CDF F(x) observation step 1{x ≥ y} squared gap = CRPS
observation y = 7.0 CRPS =

Breaking the CRPS into components

A single CRPS number tells you how wrong a forecast is, but not why. It splits cleanly into three additive pieces that always sum back to the total — the same decomposition scoringutils reports:

Drag the controls above and watch the split: centre the forecast on y and only dispersion remains; push the observation into a tail and a directional penalty grows.

dispersion = overprediction = underprediction = sum = ≈ CRPS

Things worth remembering

PIT histogram diagnostic

Probability Integral Transform — a calibration check, not a score

Evaluate each forecast CDF F at the value that actually occurred: u = F(y) — where in the forecast distribution the outcome landed. Collected over many forecasts, these u values should be spread evenly across 0–1 if the forecasts are calibrated. Let's first build the histogram one forecast at a time, then learn to read its shape.

1 · Building the histogram — one forecast at a time

The PIT value is simply where each outcome lands on its own forecast CDF: read up from the observation y to the S-curve, then across to the axis — that height is u = F(y). The histogram is just those heights, from many forecasts, piling up. Pick a scenario, then press play and watch a fresh outcome get drawn, read off the CDF on the left, and dropped into its bin on the right.

collected n = 0

2 · Reading the shape

Once many outcomes have piled up, the shape of the histogram tells you what is wrong. A perfectly calibrated forecaster gives a flat histogram; the classic departures are:

All four forecasters predict a Normal; the truth is also Normal. Only the shape of the predictive distribution differs.

Flat (uniform) — well calibrated. Outcomes fall everywhere in the predictive distribution as often as they should. This is the target.
U-shapeoverconfident / too sharp (under-dispersed). The forecast is too narrow, so the truth keeps landing in the tails (very low or very high u) more often than predicted.
Dome / humpunderconfident / too wide (over-dispersed). The forecast is too cautious; outcomes cluster in the middle of an over-wide distribution.
Sloped / lop-sidedbiased. A forecast that runs systematically high pushes outcomes into the low u bins (and vice-versa).

Try it yourself

Move the forecaster's bias and spread and watch the histogram morph between the four shapes above. The truth is fixed at a standard Normal (mean 0, σ = 1); only the forecast changes. The preset buttons snap to each canonical case.

σ ratio (forecast ÷ truth) =

One subtlety for count data. The clean uniform result holds for continuous forecasts. For integer-valued forecasts (case counts!) the PIT is no longer exactly uniform even when calibrated, so the course uses a randomised PIT — it replaces the single step with a uniform draw across the probability jump at y — which restores uniformity under calibration.

DSS score · lower is better

Dawid–Sebastiani Score — accuracy and sharpness from just two numbers

The DSS asks only for the forecast's mean μ and standard deviation σ — no full distribution required. It is the squared standardised error plus a penalty on the spread:

DSS(F, y) = (y − μ)²σ² + 2 log σ

Read the two terms as a tug-of-war:

Together they re-create "maximise sharpness subject to calibration": shrink σ only as far as your accuracy can back up. The figure shows it directly — a sharp forecast wins near the truth but is penalised steeply when wrong, while a wide forecast is mediocre everywhere.

sharp forecast (σ = 0.7) wide forecast (σ = 2.0) observation y
DSS sharp = DSS wide =

How DSS relates to CRPS

WIS score · lower is better

Weighted Interval Score — the CRPS for quantile forecasts

Forecast hubs (COVID-19, flu, RSV) don't collect a forecaster's whole distribution — they collect a handful of quantiles, e.g. the 2.5%, 25%, 50%, 75%, 97.5% points. The WIS scores exactly that. It is built from the interval score of each central prediction interval [l, u] at level (1−α):

ISα(y) = (u − l)width + 2α(l − y)·1{y < l} + 2α(y − u)·1{y > u}

Pay for the interval's width (sharpness), then pay a penalty if the outcome lands outside it. The WIS averages these across K intervals plus the median m, weighting each by αk2:

WIS(y) = 1K + ½ ( ½|y − m| + Σk=1K αk2 ISαk(y) )
The link to CRPS. Recall the CRPS can be written as an average of quantile (pinball) losses over all probability levels. The WIS is exactly that average evaluated on a finite grid of quantiles — a numerical approximation of the CRPS. Add more quantile levels and WIS → CRPS. With just a handful of quantiles it is already very close, which is why hubs can score distributional forecasts they never fully observe.

The lower panel makes this concrete: the dashed line is the exact CRPS of the underlying forecast, and the WIS curve climbs toward it as the number of intervals K increases. The upper panel shows the nested intervals (the forecast "fan") and where the observation falls — intervals it escapes are drawn in red.

prediction intervals interval missed (penalty) observation y exact CRPS
WIS = exact CRPS =

Same components as the CRPS

Because WIS is the finite-quantile CRPS, it carries the identical three-part decomposition — and the interval form makes each piece tangible:

dispersion = overprediction = underprediction =

Calibration II — interval coverage diagnostic

The PIT's plain-English twin: do your intervals contain the truth as often as they claim?

The PIT histogram is one window onto calibration; interval coverage is another, often easier to explain to a non-statistician. Take the forecaster's central X% prediction interval (e.g. the 90% interval, running from the 5th to the 95th percentile). If the forecaster is calibrated, then over many forecasts the truth should fall inside that interval about X% of the time. Tally how often it actually does, for every nominal level from 0 to 100%, and plot the result.

Here every forecast is a Normal(μf, σf) and the truth is drawn from a standard Normal(0, 1). The forecaster can be biasedf ≠ 0) and over- or under-dispersedf ≠ 1). Because both are Normal, the expected coverage of the central level q interval has a closed form — the solid curve — and a finite sample of n forecasts scatters around it (the dots).

coverage(q) = P( |Y − μf| ≤ σf · z(1+q)/2 ),   Y ~ Normal(0, 1)

Read the coverage diagram below as: x-axis = the level you claimed, y-axis = the level you achieved. The dashed 45° line is perfect calibration. An over-confident (too-sharp) forecaster makes intervals that are too narrow, so they catch the truth less often than advertised and the curve sags below the diagonal; an under-confident (too-wide) forecaster sits above it. Bias drops the whole curve, since an off-centre interval misses on the far side.

perfect calibration (45°) expected coverage ● sampled coverage (n forecasts)
50% interval covers (target 50%) 90% interval covers (target 90%)
The same story as the PIT, told differently. A flat PIT histogram is exactly a coverage curve on the diagonal — every nominal level is met. A U-shaped PIT (over-confident, truth piling into the tails) is exactly coverage below the diagonal — intervals too narrow, missing too often. A dome-shaped PIT (under-confident) is coverage above it, and a sloped PIT (biased) pulls the whole coverage curve down. Coverage and the PIT are two readings of one quantity: how often outcomes land where the forecast said they would.

Scoring on the natural vs the log scale score

Why epidemic forecasts are often scored after a log transform

Epidemic incidence spans orders of magnitude — a wave can climb from a handful of cases to thousands and back. A proper score like the CRPS is in the units of the data, so on the natural scale a miss of 100 cases counts the same whether the truth was 50 or 5000. The few high-incidence days around the peak therefore dominate the total: a model can look excellent overall just by getting the peak roughly right, while being hopeless in the low-count growth and decline phases that matter most for situational awareness.

Scoring on the log scale — transform both forecast and observation by log(x + 1) before scoring — fixes this. Differences in log space are relative / multiplicative errors, so being a factor of two off is penalised equally whether near 10 cases or near 1000. This weights the growth, peak and decline phases more evenly and amounts, roughly, to scoring the order of magnitude (or the growth rate) rather than the raw count (Bosse et al., scoring epidemiological forecasts on transformed scales).

Below, an epidemic trajectory rises from about 1 to about 1000 and back. Two forecasters track it: A nails the peak but is sloppy at low counts, while B is consistently decent across all phases. Each bar is a single day's CRPS contribution. Flip between the natural and log scale and watch where the score "lives" — and watch the ranking flip.

true incidence forecaster A — peak specialist forecaster B — all-rounder
total A = total B =
Why log-scale scoring for epidemic data? Natural-scale scores are dominated by the highest-count days, so they mostly measure peak accuracy and reward sheer magnitude. Log-scale scores measure relative error, giving the low-count growth and decline phases comparable weight to the peak — closer to evaluating the order of magnitude or growth rate that drives real-time decisions. The transform is monotone and the score stays proper on the transformed scale, so this is a principled change of what "close" means, not a trick. See Bosse et al., scoring epidemiological forecasts on transformed scales. (The per-day CRPS here is illustrative: the log-scale value approximates log(x+1)-transformed scoring by transforming each forecast's mean and spread.)

Side by side

CRPSWISDSSPIT histogram
What it isProper scoreProper scoreProper scoreCalibration diagnostic
NeedsFull predictive distributionA set of quantilesOnly mean & SDFull predictive CDF at the outcome
UnitsSame as the dataSame as the dataUnitless (log scale)
Best valueLowerLowerLowerFlat / uniform
Sees distribution shape?YesAt the chosen quantilesNo (moments only)Indirectly, via where outcomes land
Outlier sensitivityModerateModerateHigh (squared, standardised)Shows up as tail bins
Decomposes?Dispersion + over + underDispersion + over + underNo
Use it to…Rank full distributionsScore hub-style quantile forecastsScore quickly from summariesExplain why a model mis-scores
In practice: score with the CRPS — or the WIS when you only have quantiles (it is the CRPS, approximated) — to get a single ranking number and its dispersion/over/under breakdown, then reach for the PIT histogram to diagnose why one model beats another — too sharp, too wide, or biased.