oaa2 / README.md
pablog86's picture
training run 20260419_211104
17a1aef verified
|
Raw
History Blame Contribute Delete
4 kB
---
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/) |