python 3.12.13, scikit-learn 1.9.1, pandas 3.0.6 rows: dev 15867, holdout 1344; forecast origins 1321, horizon 1..24 MAE by horizon (bikes per hour, lower is better), default HistGradientBoostingRegressor strategy h=1 h=2 h=3 h=6 h=12 h=24 mean 1-24 one-step, real lag_1 (not a forecast) 24.5 24.5 24.5 24.4 24.5 24.6 24.5 recursive 24.5 32.2 37.9 46.1 47.8 49.4 45.7 direct 24.5 36.5 50.5 50.2 53.5 50.4 49.4 lag_24 + lag_168 only 49.7 49.7 49.7 49.6 49.9 50.4 50.0 no lags 53.2 53.2 53.2 53.2 53.9 54.6 53.9 direct, MAE at every horizon 1..24: 24.5 36.5 50.5 50.0 52.3 50.2 49.1 51.0 49.3 51.9 45.5 53.5 49.8 52.6 49.1 49.0 56.0 52.8 52.5 51.5 52.1 55.8 49.1 50.4 Same, early_stopping=False (every model trained on all dev rows) strategy h=1 h=2 h=3 h=6 h=12 h=24 mean 1-24 one-step, real lag_1 (not a forecast) 23.8 23.8 23.8 23.8 23.9 24.1 24.0 recursive 23.8 31.9 37.6 45.4 47.2 47.5 44.8 direct 23.8 35.4 45.8 51.8 47.8 46.4 47.0 lag_24 + lag_168 only 45.6 45.6 45.6 45.5 45.9 46.4 45.9 no lags 50.1 50.1 50.1 50.1 50.7 51.4 50.7 direct, MAE at every horizon 1..24: 23.8 35.4 45.8 45.9 48.9 51.8 52.0 47.7 47.0 49.8 47.2 47.8 48.0 48.4 50.5 52.4 46.3 51.0 47.4 48.5 49.4 47.2 49.3 46.4 Training cost on the dev set (default settings) one-step model 1 fit(s), 0.3 s direct (24 models) 24 fit(s), 7.2 s lag_24 + lag_168 model 1 fit(s), 0.3 s