--- license: apache-2.0 tags: - time-series-forecasting - f1 - chronos - fine-tuned language: - en --- # F1 Lap-Time Forecasting — Chronos Fine-tune One-step-ahead lap time forecasting for Formula 1 races, fine-tuned from [autogluon/chronos-bolt-base](https://huggingface.co/autogluon/chronos-bolt-base). | | | |---|---| | **Run ID** | `20260419_211104` | | **Base model** | `autogluon/chronos-bolt-base` | | **Task** | Next-lap time regression (ms) within a stint | | **Repository** | `pablog86/oaa2` | --- ## Dataset Sourced from the consolidated `f1-race-data/latest.parquet` Parquet produced by the Airflow ingestion DAG (SPEC-008/SPEC-009). | | | |---|---| | **Train / val seasons** | [2022, 2023] | | **Test seasons** | [2024] | | **Session types** | RACE | | **Object ETag** | `a6b0d597d06b934476b5e77a928c9659` | | **Last modified** | 2026-04-19T04:22:53+00:00 | --- ## Features The model receives a sliding context window of pit-corrected lap times (`lap_time_ex_pit_ms`) within the current stint, plus the covariates listed below. | Feature | Type | |---|---| | `lap_time_ex_pit_ms` (context window) | Target signal — sliding window of pit-stop-corrected lap times within the current stint | | `circuit_id` | Static | | `constructor_id` | Static | | `grid_position` | Static | | `circuit_season_max_laps` | Static | | `lap`, `lap_position`, `lap_in_race_pct` | Dynamic observed | | `lap_in_stint`, `is_pit_out_lap`, `is_pit_in_lap` | Dynamic observed | | `cumulative_pit_count`, `laps_since_last_pit` | Dynamic observed | | `elapsed_race_time_ms` | Dynamic observed | | `lag_1/2/3_lap_time_ex_pit_ms` | Historical | | `rolling_mean_3/5_lap_time_ex_pit_ms` | Historical | | `rolling_std_3_lap_time_ex_pit_ms` | Historical | | `delta_vs_prev_lap_ex_pit_ms` | Historical | | `delta_vs_rolling_mean_3_ex_pit_ms` | Historical | --- ## Training Configuration | Hyperparameter | Value | |---|---| | `model_id` | `autogluon/chronos-bolt-base` | | `learning_rate` | `0.0001` | | `batch_size` | `32` | | `max_epochs` | `15` | | `patience` | `3` | | `weight_decay` | `0.0001` | | `gradient_clip_val` | `1.0` | | `context_length` | `20` | | `prediction_length` | `1` | | `loss_function` | `huber` | | `random_seed` | `42` | | **Early stopping at epoch** | 8 / 15 | --- ## Evaluation Results ### Validation | Metric | Value | |---|---| | MAE (ms) | 8377.9 | | RMSE (ms) | 80676.4 | | MAPE (%) | 8.07 | | Within ±500 ms (%) | 55.7 | | Within ±1000 ms (%) | 70.7 | | Samples | 8873 | ### Test | Metric | Value | |---|---| | MAE (ms) | 4619.8 | | RMSE (ms) | 55007.5 | | MAPE (%) | 4.54 | | Within ±500 ms (%) | 60.3 | | Within ±1000 ms (%) | 75.6 | | Samples | 25241 | ### Test — by season | Segment | mae (ms) | mape (%) | pct_within_500ms | n_samples | | --- | --- | --- | --- | --- | | 2024 | 4619.8 | 4.5 | 60.3 | 25241 | ### Test — by stint length | Segment | mae (ms) | mape (%) | pct_within_500ms | n_samples | | --- | --- | --- | --- | --- | | long (>30) | 4393.4 | 4.5 | 62.0 | 9235 | | medium (15–30) | 3189.5 | 3.3 | 61.8 | 12629 | | short (<15) | 10587.5 | 9.2 | 50.3 | 3377 | --- ## Baseline Comparison (test set) | Metric | **Model** | `last_lap` | `rolling_mean_3` | `rolling_mean_5` | | --- | --- | --- | --- | --- | | MAE (ms) | **4619.8** | 5167.4 | 3152.9 | 2975.1 | | MAPE (%) | **4.5** | 5.6 | 3.5 | 3.4 | | Within ±500 ms (%) | **60.3** | 58.7 | 62.4 | 59.5 | --- ## Run History | run_id | model | val MAE (ms) | test MAE (ms) | test MAPE (%) | within ±500 ms (%) | |---|---|---|---|---|---| | `20260419_211104` | `chronos-bolt-base` | 8377.9 | 4619.8 | 4.54 | 60.3 | --- ## Reproducibility | Artifact | Path in this repo | |---|---| | Dataset manifest | [`dataset_manifest/20260419_211104.json`](dataset_manifest/20260419_211104.json) | | Run metadata (metrics + config) | [`runs/20260419_211104.json`](runs/20260419_211104.json) | | TensorBoard logs | [`tensorboard/20260419_211104/`](tensorboard/20260419_211104/) |