# Premiers modèles prédictifs Objectif : passer de la description à la prédiction sur nos données locales, en restant simple et lisible. L’idée est de prendre le cadre posé au chapitre 8 et de le peupler avec des modèles très basiques, pour voir ce qu’ils valent réellement sur les horizons T+10, T+60, T+360 (~6 h) et T+1440 (~24 h) pour la température, le vent et la pluie, sans présupposer que “plus complexe” signifie forcément “meilleur”. ## Point de départ : données, features et métriques On travaille toujours à partir de `data/weather_minutely.csv` (pas 10 minutes), enrichi des variables dérivées vues au chapitre 8 : temps encodé en sin/cos, lags courts (T‑10/‑20/‑30), deltas, moyennes et cumuls glissants sur 30–60 minutes, composantes `(u, v)` du vent, drapeaux d’événements (pluie en cours, vent fort, chaleur/froid). Cette table est découpée en trois blocs chronologiques : une partie _train_ (~70 % du début de la série) pour l’apprentissage, une partie validation (~15 % suivante) pour régler les hyperparamètres, et une partie test (~15 % la plus récente) pour juger les modèles sur un futur qui n’a pas servi à l’entraînement. On peut, en variante, utiliser un _time‑series split_ “en rouleau” comme décrit au chapitre 8, mais les figures de ce chapitre s’appuient sur une découpe simple. Côté métriques, on reste sur les repères déjà introduits : MAE/RMSE pour température et vent, et pour la pluie binaire, le trio précision–rappel–[_F1_](https://fr.wikipedia.org/wiki/F-mesure) complété par le [_Brier score_](https://en.wikipedia.org/wiki/Brier_score) et la calibration des probabilités. Les modèles ne seront jugés intéressants que s’ils apportent un gain clair par rapport à des références naïves. ## Étape 1 — Baselines de référence ```shell python "docs/09 - Premiers modèles prédictifs/scripts/run_baselines.py" ``` Ce premier script ne fait qu’une chose : mesurer la performance de quelques stratégies “bêtes mais honnêtes” qui serviront ensuite de ligne de base. Il lit le dataset minuté, applique le découpage temporel, puis entraîne et évalue : - des baselines de persistance (prédire que la prochaine valeur est identique à la dernière observée) ; - des climatologies horaires (moyennes/quantiles par heure locale, éventuellement par saison) ; - des moyennes mobiles à court terme ; - un classifieur “toujours sec” pour la pluie, qui illustre à quel point la rareté des précipitations peut tromper les métriques. Le script génère : - deux CSV de résultats dans `docs/09 - Premiers modèles prédictifs/data/` : - `baselines_regression.csv` (température/vent, MAE/RMSE, splits validation/test) - `baselines_rain.csv` (pluie binaire, précision/rappel/F1/Brier, splits validation/test) - deux figures de synthèse (validation) dans `docs/09 - Premiers modèles prédictifs/figures/` : - `baselines_mae_validation.png` (MAE vs horizon pour température et vent) - `baselines_rain_validation.png` (F1 et Brier vs horizon pour la pluie) Ces deux graphiques résument ce que ces baselines savent faire, horizon par horizon. ![](./figures/baselines_mae_validation.png) ![](./figures/baselines_rain_validation.png) Sur la figure MAE, la persistance reste imbattable jusqu’à +6 h sur la température, avec une erreur moyenne sous le degré ; à +24 h, elle se dégrade (MAE ≈1,5 °C), mais reste nettement devant la climatologie horaire, qui plafonne autour de 4–6 °C. Pour le vent, la moyenne mobile sur 60 minutes devance légèrement la persistance dès +10 min, mais l’écart reste modeste et la MAE grimpe doucement avec l’horizon (≈2 km/h à +24 h). Le message est clair : sur un pas de 10 minutes, les baselines “bricolées” font déjà un travail honorable, et le gain potentiel d’un modèle plus riche sera nécessairement limité. Sur la figure pluie, la persistance profite à plein de la rareté des événements : annoncer “sec” presque tout le temps donne un F1 très élevé aux petits horizons, même si le Brier score se dégrade en s’éloignant. La climatologie horaire, sans contexte, ne voit pratiquement jamais la pluie. Toute tentative de modèle devra donc battre la persistance sur F1/Brier, surtout à +60 et +360 minutes où le score chute déjà : la barre n’est pas très haute en absolu, mais elle l’est par rapport à la quantité d’information disponible dans une simple série locale. Ces baselines fixent donc une référence indispensable : si un modèle plus sophistiqué n’apporte pas de gain visible par rapport à elles, il ne sert à rien en pratique. ## Étape 2 — Premiers modèles supervisés ```shell python "docs/09 - Premiers modèles prédictifs/scripts/run_first_models.py" ``` Une fois les références en place, on passe à des modèles un peu plus élaborés. Ce second script : - construit les variables dérivées (sin/cos temporels, lags, deltas, moyennes glissantes, vent u/v, drapeaux) à partir du CSV brut ; - découpe en _train_/_validation_/_test_ (70/15/15 %) ; - utilise la matrice de corrélation décalée (chapitre 5) pour privilégier les variables/lags dont |r| ≥ 0,2, tout en conservant les cibles ; l’humidité, la pression, l’illuminance, etc. sont donc injectées quand elles sont corrélées à la cible ; - entraîne Ridge/Lasso pour température et vent, régression logistique pour la pluie ; - exporte `models_regression.csv` et `models_rain.csv` dans `docs/09 - Premiers modèles prédictifs/data/` ; - produit `models_mae_validation.png` (MAE vs horizon pour température et vent) dans `docs/09 - Premiers modèles prédictifs/figures/`. ![](./figures/models_mae_validation.png) Cette figure concentre la lecture sur température et vent, en MAE vs horizon. Côté température, Ridge/Lasso battent légèrement la persistance sur tous les horizons sauf à +10 min (MAE ≈0,14 à +60 min vs 0,15 pour la persistance ; ≈1,48 à +1440 vs 1,55). Injecter les variables corrélées (humidité, illuminance, pression…) donne un petit gain par rapport à la version “lags génériques”, mais la marge reste modeste. Pour le vent, la logique est la même : un léger mieux que la persistance (≈0,87 à +10 min vs 0,99 ; ≈1,67 à +1440 vs 1,74), sans révolution. Les corrélations étant globalement faibles, l’apport des autres variables reste limité sur ce pas de 10 minutes. Pour la pluie, la régression logistique ne parvient pas encore à dépasser la persistance : F1 ≈0,91 à +10 min contre 0,94 pour la persistance, puis chute rapide à +60 min et au‑delà. La probabilité produite est pourtant correctement calibrée (Brier ≈0,011 à +10 min), mais cela ne suffit pas à compenser l’avantage d’un modèle qui “reste sec” la plupart du temps. Il faudra enrichir les variables d’entrée ou changer de famille de modèles pour espérer dépasser cette baseline très difficile à battre sur une série aussi déséquilibrée. En résumé, ces premiers modèles linéaires apportent un petit gain sur température/vent, mais échouent encore à battre la persistance pour la pluie. Ils fixent un second niveau de référence : toute complexité supplémentaire devra se justifier par un gain clair, surtout sur les horizons intermédiaires (+60/+360 min) où les baselines commencent à se dégrader. ## Conclusion Contre l’intuition, c’est au très court terme que nos modèles simples se heurtent à un mur pour la pluie : la persistance reste devant à +10 min, et l’écart se creuse déjà à +60 min. Pour la température et le vent, les gains existent mais restent modestes, même à +10 min, alors qu’on pouvait espérer que ces prévisions soient “faciles”. Les horizons longs se dégradent comme prévu, mais le vrai défi est donc d’améliorer les prédictions proches sans sur-complexifier. Prochaine étape : tester des modèles plus flexibles (arbres/boosting) et enrichir les features, tout en vérifiant que le gain sur les petits horizons justifie l’effort.