1

Reformulations

This commit is contained in:
2025-11-26 17:22:57 +01:00
parent 8b26c0bf17
commit f4bdbe2c7f
13 changed files with 460 additions and 171 deletions

View File

@@ -1,23 +1,43 @@
# Modèle Chronos-2 (foundation model HF)
Objectif : tester un modèle de prévision généraliste récent (**Chronos-2**, Amazon) en zéro-shot sur notre station. On resample la température à lheure, on coupe les dernières 96 h pour évaluer la prévision, et on compare le forecast à lobservé.
Dans les chapitres précédents, on a testé des modèles “fabriqués maison” (linéaires, arbres, forêts, boosting) sur nos données locales.
Ici, on bascule dans un autre monde : celui des modèles de prévision préentraînés sur de vastes jeux de séries temporelles.
**Chronos2**, développé par Amazon et distribué notamment via [Hugging Face](https://huggingface.co/amazon/chronos-t5-small) et le dépôt [chronosforecasting](https://github.com/amazon-science/chronos-forecasting), est un modèle de type “foundation” capable de produire des prévisions probabilistes sur des séries très variées.
Lobjectif est de le tester en zéroshot sur notre station : lui fournir uniquement lhistorique local (sans réentraînement), lui demander une prévision et voir comment il se comporte face aux observations et aux modèles précédents.
## Première passe : choix de la taille du modèle (horizon 96 h)
On commence par un exercice simple : prédire les 96 dernières heures de température à partir des 336 heures précédentes, en faisant en resampling de la série à lheure.
On coupe donc les 96 h finales, on fournit à Chronos le contexte horaire, et on compare sa prévision aux observations.
```shell
python "docs/11 - Modèle Chronos/scripts/run_chronos.py"
```
### Résultats comparés
Ce script sappuie sur quelques variables denvironnement pour contrôler le comportement du modèle :
Nous avons utilisé les variables denvironnement suivantes : `CHRONOS_CONTEXT` (336 h), `CHRONOS_HORIZON` (96 h), `CHRONOS_RESAMPLE` (`1h`), `CHRONOS_SAMPLES` (20).
- `CHRONOS_CONTEXT` : longueur du contexte temporel fourni au modèle (ici 336 h, soit 14 jours) ;
- `CHRONOS_HORIZON` : horizon de prévision demandé (96 h) ;
- `CHRONOS_RESAMPLE` : pas temporel utilisé (`1h`) ;
- `CHRONOS_SAMPLES` : nombre déchantillons générés pour lisser la prévision (20).
![Comparaison des tailles Chronos](./figures/chronos_models_comparison.png)
Sur la même fenêtre de validation locale, nous avons testé trois tailles (`CHRONOS_MODEL`) : `chronos-t5-mini`, `chronos-t5-small` et `chronos-t5-base`. Le modèle **small** semble le plus précis (MAE ≈ 3,68 °C, RMSE ≈ 4,53 °C), les versions mini et base étant derrière (MAE ≈ 4,184,24 °C, RMSE ≈ 5,35,6 °C). Autrement dit, monter en taille na pas amélioré la prévision à 96 h sur ces données locales ; la version `small` offre le meilleur compromis précision/poids.
Sur cette même fenêtre de validation locale, on teste trois tailles de modèle (`CHRONOS_MODEL`) : `chronos-t5-mini`, `chronos-t5-small` et `chronos-t5-base`. Le script de comparaison :
```shell
python "docs/11 - Modèle Chronos/scripts/compare_chronos.py"
```
produit la figure suivante, qui résume la performance par taille.
![Comparaison des tailles Chronos](./figures/chronos_models_comparison.png)
Le modèle **small** ressort comme le meilleur compromis : MAE ≈ 3,68 °C, RMSE ≈ 4,53 °C, alors que les versions mini et base sont derrière (MAE ≈ 4,184,24 °C, RMSE ≈ 5,35,6 °C) sur cette fenêtre.
Autrement dit, “monter en taille” naméliore pas la prévision à 96 h sur nos données ; Chronossmall fait ici légèrement mieux que ses voisins, pour un coût de calcul encore raisonnable.
On peut ensuite inspecter, pour chaque taille, la trajectoire temporelle prédit vs observé :
#### chronos-t5-mini
![Trajectoire prédit vs observé mini](./figures/chronos_forecast_amazon__chronos-t5-mini.png)
@@ -26,26 +46,40 @@ python "docs/11 - Modèle Chronos/scripts/compare_chronos.py"
![Trajectoire prédit vs observé small](./figures/chronos_forecast_amazon__chronos-t5-small.png)
Le modèle suit un peu mieux la courbe de référence que les autres, mais une forte amplitude existe.
Le modèle small suit un peu mieux la courbe de référence que les autres, même si lamplitude reste importante à 96 h.
#### chronos-t5-base
![Trajectoire prédit vs observé base](./figures/chronos_forecast_amazon__chronos-t5-base.png)
### Lecture et portée
Au terme de cette première passe, on retient donc `chronos-t5-small` comme taille “par défaut” pour la suite des expériences.
Pour coller à nos horizons cibles, `run_chronos_multi.py` évalue Chronos-small sur 1 h, 6 h et 24 h pour la température, le vent et la pluie (horaire uniquement ; lhorizon 10 minutes nest pas couvert par Chronos qui est pré-entraîné en pas horaire). Les figures `chronos_multi_temperature.png`, `chronos_multi_wind_speed.png` et `chronos_multi_rain_rate.png` illustrent où le modèle est le plus fiable : à 1 h, la température reste sous ~1,3 °C de MAE et le vent sous ~0,6 km/h ; à 6 h, lerreur grimpe modérément (≈2 °C temp., ≈3 km/h vent) ; à 24 h, elle dépasse 46 (°C/ km/h). Sur la pluie, le F1 reste nul à 1 h/6 h et ne monte quà ~0,15 à 24 h, signe que le modèle “foundation” horaire ne capture pas bien les occurrences locales rares.
## Évaluation multi-horizons locale (1 h, 6 h, 24 h)
Pour comparer plus finement à notre cadre prédictif local, on évalue ensuite Chronossmall sur des horizons plus courts, en restant au pas horaire (Chronos nest pas préentraîné au pas 10 minutes).
Le script suivant demande au modèle de prévoir la température, le vent et la pluie à 1 h, 6 h et 24 h :
```shell
python "docs/11 - Modèle Chronos/scripts/run_chronos_multi.py"
```
Les trois figures suivantes montrent la performance par horizon :
![Chronos small température (1/6/24 h)](./figures/chronos_multi_temperature.png)
![Chronos small vent (1/6/24 h)](./figures/chronos_multi_wind_speed.png)
![Chronos small pluie (1/6/24 h)](./figures/chronos_multi_rain_rate.png)
On y voit que :
- à 1 h, la température reste sous ~1,3 °C de MAE et le vent sous ~0,6 km/h ;
- à 6 h, lerreur grimpe modérément (≈2 °C pour la température, ≈3 km/h pour le vent) ;
- à 24 h, elle dépasse 46 unités (°C / km/h) ;
- sur la pluie, le F1 reste nul à 1 h/6 h et ne monte quà ~0,15 à 24 h, signe que ce modèle “foundation” horaire ne capture pas bien les occurrences locales rares.
Pour avoir une vue plus synthétique, on combine les erreurs sur plusieurs figures :
```shell
python "docs/11 - Modèle Chronos/scripts/plot_chronos_errors_combined.py"
```
@@ -54,7 +88,7 @@ python "docs/11 - Modèle Chronos/scripts/plot_chronos_errors_combined.py"
![Chronos small pluie (F1/Brier)](./figures/chronos_multi_errors_rain.png)
Les figures individuelles permettent de voir la trajectoire prédite vs observée (dans la section précédente) et lerreur par horizon (ci-dessous).
Enfin, un script dédié permet de comparer directement, pour plusieurs tailles de Chronos, lerreur absolue en fonction de lhorizon :
```shell
python "docs/11 - Modèle Chronos/scripts/run_chronos_multi_errors.py"
@@ -62,9 +96,17 @@ python "docs/11 - Modèle Chronos/scripts/run_chronos_multi_errors.py"
![Erreur absolue vs horizon mini/small/base](./figures/chronos_errors_combined.png)
Au final, Chronos-small fournit un signal exploitable sur la température et un peu sur le vent pour des horizons courts à intermédiaires, mais reste faible sur la pluie et se dégrade nettement au-delà de 24 h. Une calibration locale, davantage de contexte ou une cible adaptée (pluie binaire calibrée) seraient nécessaires pour en faire un outil de prévision robuste sur toutes les variables.
Au final, dans cette configuration zéroshot, Chronossmall fournit un signal exploitable sur la température (surtout à 16 h) et un peu sur le vent, mais reste faible sur la pluie et se dégrade nettement audelà de 24 h.
Pour en faire un outil de prévision robuste sur toutes les variables, il faudrait envisager une calibration locale, davantage de contexte ou des cibles adaptées (par exemple une pluie binaire mieux calibrée).
### Réglages prudents (contexte 288 h, horizon limité à 64 h, 100 échantillons)
## Réglages plus prudents (contexte 288 h, horizon limité à 64 h, 100 échantillons)
Une troisième série dessais cherche à voir si un Chronossmall “raisonnablement bridé” se comporte mieux quune version trop ambitieuse.
Lidée : moins de contexte, un horizon maximum plus court, mais davantage déchantillons pour lisser la prévision :
```shell
python "docs/11 - Modèle Chronos/scripts/run_chronos_tuned.py"
```
![Chronos small réglé température](./figures/chronos_tuned_temperature.png)
@@ -72,9 +114,18 @@ Au final, Chronos-small fournit un signal exploitable sur la température et un
![Chronos small réglé pluie](./figures/chronos_tuned_rain_rate.png)
Avec `run_chronos_tuned.py`, on réduit le contexte (288 h) et lhorizon maximum (64 h) tout en augmentant les échantillons (100). Sur la même fenêtre locale, la température saméliore nettement : MAE ~0,75 °C à 1 h, ~1,27 °C à 6 h, ~3,40 °C à 24 h (vs 1,33/2,02/4,84 auparavant). Le vent progresse surtout à 24 h (≈2,39 contre ~6,38 auparavant), même si le 1 h est moins bon que la première passe. La pluie reste instable : le F1 peut atteindre 0,220,28 à 2448 h mais les scores courts sont peu fiables. Limiter lhorizon à 64 h, raccourcir le contexte et lisser par davantage déchantillons améliorent donc la température et le vent, mais ne suffisent pas à rendre la pluie prédictible.
Avec ces réglages (contexte 288 h, horizon limité à 64 h, 100 échantillons), la température saméliore nettement sur la même fenêtre locale : MAE ~0,75 °C à 1 h, ~1,27 °C à 6 h, ~3,40 °C à 24 h (contre ~1,33/2,02/4,84 auparavant).
### Dernier essai en conditions réelles : prévision sur les 6 dernières heures
Le vent progresse surtout à 24 h (≈2,39 km/h contre ~6,38 km/h initialement), même si lhorizon 1 h est un peu moins bon.
La pluie reste instable : le F1 peut atteindre 0,220,28 à 2448 h, mais les scores à court terme demeurent peu fiables.
En pratique, raccourcir le contexte, limiter lhorizon et augmenter le nombre déchantillons améliore donc nettement la température et le vent, mais ne suffit pas à rendre la pluie réellement prédictible à partir de cette seule station.
## Dernier essai quasi “en conditions réelles” : prévision sur les 6 dernières heures
Pour terminer, on simule une situation dusage : prévoir les 6 prochaines heures à partir de lhistorique immédiatement disponible, sans les connaître à lavance.
On masque donc les 6 dernières heures de la série, on fournit à Chronossmall 288 h de contexte, et on lui demande la prévision correspondante :
```shell
python "docs/11 - Modèle Chronos/scripts/run_chronos_holdout6.py"
@@ -82,4 +133,8 @@ python "docs/11 - Modèle Chronos/scripts/run_chronos_holdout6.py"
![Chronos small erreurs 6 h holdout](./figures/chronos_holdout6_errors.png)
On a masqué les 6 dernières heures de la série et demandé à Chronos-small (contexte 288 h, 50 échantillons) de prévoir température, vent (vitesse + direction), humidité et pression, puis comparé aux valeurs réelles. Moyennes des erreurs absolues sur ces 6 pas : température ~0,84 °C, vent ~1,2 km/h, direction ~3,9°, pression ~5,3 hPa, humidité ~24 %. Les erreurs restent très contenues sur température/vent et la direction est raisonnable (quelques degrés) ; la pression dérive (5 hPa) et lhumidité est clairement décalée. Ce test confirme que Chronos peut fournir des tendances crédibles à très court terme (<6 h) sur température et vent, mais pas sur lhumidité (et on a vu plus haut que la pluie reste peu fiable).
Sur ces 6 pas, les moyennes des erreurs absolues sont les suivantes : température ~0,84 °C, vent ~1,2 km/h, direction ~3,9°, pression ~5,3 hPa, humidité ~24 %.
Les erreurs restent très contenues sur température et vent, la direction est raisonnable (quelques degrés de décalage) ; la pression dérive (≈5 hPa) et lhumidité est clairement décalée.
Ce test, modeste, mais concret, confirme que Chronos peut fournir des tendances crédibles à très court terme (<6 h) sur la température et le vent dans ce cadre zéroshot, mais quil reste peu fiable sur lhumidité et la pluie, où lon a vu plus haut que les occurrences locales rares sont difficiles à capter pour un modèle généraliste.