Clear Hour

An open forecaster that ranks the hours of tomorrow by how breathable the air is in Islamabad / Rawalpindi.

Built with PriorLabs-TabPFN

TabPFN v2 needs roughly 1,000–2,500 training hours (about 6–15 weeks of hourly data) before it matches, and then edges, a one-line hour-of-day bias baseline on hour ranking. Below that it is worse and high-variance.

Mean gap in median within-day ranking ρ, TabPFN − B2: −0.12 at 100 h, −0.05 at 250 h, −0.12 at 500 h, +0.01 at 1,000 h, +0.07 at 2,500 h, +0.11 at 5,000 h. The edge is consistent across folds only at 5,000 h (4/4 folds; 3/5 at 1,000 and 2,500 h). Six rolling-origin folds, not the spent TEST month.

Tomorrow's pre-registered forecast: 2026-10-11

Clear Hour predicts the cleanest 2h window of 2026-10-11 is 15:00-17:00 at 49.2 ug/m3; the dirtiest is 22:00-00:00 at 78.4 ug/m3.

Late entry: the B0 and B2 curves were committed at 06:10:46 (69c7d9e). TabPFN was committed at 06:51 (802344a); hours before that time (shaded, up to 07:00) had already occurred and are not pre-registered. Inputs are live forecasts; ground truth is an uncalibrated low-cost sensor.

TabPFN v2 (late entry)B2 hour-biasB0 raw CAMSMeasured (sensor 4554236)

Lanes under the axis: solid bar = each model's cleanest 2 h window, outlined bar = its dirtiest. Shaded region = hours before the TabPFN commit.

ModelCleanest 2 h (µg/m³)Dirtiest 2 h (µg/m³)
TabPFN v2 late entry15:00–17:00 (49.2)22:00–00:00 (78.4)
B2 hour-bias pre-registered15:00–17:00 (54.0)22:00–00:00 (81.8)
B0 raw CAMS pre-registered05:00–07:00 (34.9)22:00–00:00 (67.3)

Measured hours: 24/24. Truth = OpenAQ sensor 4554236, uncalibrated low-cost, CC BY 4.0, The Urban Unit (AirGradient sensor, uncalibrated). One day is one sample.

ModelViewMAEBiasSpearman ρChosen cleanest 2 hActual PM2.5 in that windowInside actual cleanest set?
TabPFN v2full day21.9+14.6-0.36915:00-17:0029.8 vs day mean 45.4no
TabPFN v2hours ≥ 07:00 (windows re-derived)25.6+25.6-0.48315:00-17:0029.8 vs day mean 35.7no
B2 hour-biasfull day25.3+18.8-0.40915:00-17:0029.8 vs day mean 45.4no
B2 hour-biashours ≥ 07:00 (windows re-derived)30.9+30.9-0.15315:00-17:0029.8 vs day mean 35.7no
B0 raw CAMSfull day21.9-3.5-0.51205:00-07:0073.7 vs day mean 45.4no
B0 raw CAMShours ≥ 07:00 (windows re-derived)18.1+7.8-0.70109:00-11:0047.8 vs day mean 35.7no
Table view: predicted hourly PM2.5 (µg/m³)
HourTabPFN v2B2B0Measured
00:0063.458.541.984.1
01:0064.360.941.174.4
02:0057.658.639.266.9
03:0055.756.737.152.9
04:0053.356.935.456.7
05:0051.356.834.866.7
06:0051.460.035.080.7
07:0053.365.237.750.5
08:0055.366.537.347.8
09:0057.465.334.948.8
10:0057.267.135.546.8
11:0056.269.535.349.5
12:0055.265.835.351.0
13:0056.961.536.645.6
14:0052.557.837.635.8
15:0049.653.136.431.9
16:0048.854.938.127.7
17:0059.459.040.918.2
18:0065.167.045.623.7
19:0069.970.948.922.4
20:0073.571.550.221.7
21:0074.973.755.324.4
22:0078.878.863.824.4
23:0078.184.870.837.0

Data efficiency: how many hours before a new sensor is usable?

Rolling-origin test: for each of six 30-day windows, train on the N most recent valid hours before the window (recency, never random). Mean over the folds available at each N (4–6); TabPFN's whiskers are ±1 std across folds (large: fold spread is as big as most gaps between models). The shaded column marks 1,000–2,500 h.

TabPFN v2HistGBRB2 hour-biasRidgeB0 raw CAMS

Hour ranking (the product metric)

Level error

Ridge is omitted from the error chart: it is off-scale at small N (MAE 321 at 100 h, 74 at 250 h, 52 at 500 h). N = 10,000 is not shown: TabPFN was not run there (one fold, baselines only). The F3 smog-season fold dominates every mean; differences under ~1–2 µg/m³ or ~0.05 in ρ are ties.

Table view: learning curve
Model (mean over folds)N=100N=250N=500N=1,000N=2,500N=5,000
TabPFN v20.317
MAE 19.7
0.447
MAE 18.4
0.431
MAE 17.9
0.544
MAE 17.2
0.616
MAE 16.0
0.590
MAE 16.9
HistGBR0.350
MAE 18.3
0.402
MAE 18.8
0.442
MAE 17.5
0.441
MAE 17.2
0.457
MAE 16.8
0.541
MAE 31.9
B2 hour-bias0.439
MAE 19.2
0.498
MAE 18.1
0.555
MAE 21.3
0.535
MAE 24.1
0.543
MAE 30.2
0.476
MAE 44.5
Ridge0.309
MAE 320.9
0.470
MAE 74.1
0.529
MAE 52.5
0.469
MAE 50.5
0.453
MAE 19.1
0.547
MAE 22.4
B0 raw CAMS0.439
MAE 24.9
0.439
MAE 24.9
0.479
MAE 27.2
0.479
MAE 27.2
0.479
MAE 27.2
0.431
MAE 30.1
TabPFN − B2 (ρ)-0.123-0.051-0.124+0.010+0.073+0.114

Cross-sensor transfer

Trained on sensor 4554236 (2,500 most recent hours, no retraining), evaluated at sensor 4565419 over folds F2, F3, F4, F6. Both sensors share the same CAMS/weather inputs; F1 and F5 have no transfer cell.

ModelMAEmedian ρtop-window hitfolds
B0 raw CAMS27.50.57043%4
B2 CAMS+hour bias32.50.60447%4
B4 Ridge18.20.56847%4
B5 HistGBR17.50.52143%4
M1 TabPFN v216.80.66156%4

Held-out TEST month (evaluated once)

2026-09-10 → 2026-10-09, 30 days, models refit on TRAIN+DEV. TabPFN's MAE edge over B2 is clear; its ranking edge over B2 is not statistically significant, and HistGBR beat TabPFN on the DEV month.

ModelMAERMSEBiasWithin-day ρ medianTop-2h hit
B0 raw CAMS16.120.7-3.40.56430%
B1 CAMS+const bias22.028.7+20.20.56430%
B2 CAMS+hour bias22.128.7+20.20.54443%
B3 CAMS+hour×season bias31.641.1+27.30.48940%
B4 Ridge20.327.4+17.40.60330%
B5 HistGBR10.815.2-4.10.64440%
M1 TabPFN v210.314.6-4.20.67537%