Creator prompt
The idea behind this presentation
**Thème du cours : améliorer un modèle avec les hyperparamètres, la validation croisée et GridSearchCV.** La fin prépare le TD de demain sur le parcours complet d’entraînement.
**Consignes pour Presenton :**
- Public débutant, sans formation mathématique approfondie.
- Une idée principale par diapositive, avec des explications concrètes.
- Conserver les tableaux et le code dans des formats lisibles.
- Les exemples de résultats signalés comme illustratifs ne sont pas des mesures réelles.
- Conserver les références R1 à R10 et leurs liens en fin de présentation.
---
## Diapositive 1 — Améliorer un modèle de machine learning
### Hyperparamètres, validation croisée et optimisation
**Question centrale : comment modifier un modèle et vérifier que le changement améliore ses résultats ?**
Localhost Academy
Enseignant : NDJANA MENGUE JERRY DAVIS
---
## Diapositive 2 — Les objectifs du cours
À la fin du cours, vous devrez pouvoir :
- distinguer un paramètre appris d’un hyperparamètre ;
- reconnaître des signes de sous-apprentissage et de surapprentissage ;
- expliquer la validation croisée ;
- comparer quelques configurations avec `GridSearchCV` ;
- justifier un choix avant d’utiliser le test final.
**Objectif pratique : améliorer une première solution avec une démarche que vous savez expliquer.**
---
## Diapositive 3 — Ce que nous savons déjà faire
Nous avons étudié :
| Étape | Son rôle |
|---|---|
| Définir X et y | Identifier les entrées et la réponse recherchée |
| Préparer les données | Traiter les manques, les catégories et les échelles |
| Construire une Pipeline | Relier préparation et modèle |
| Appeler `fit()` | Apprendre sur les exemples d’entraînement |
| Appeler `predict()` | Produire une sortie sur de nouvelles entrées |
| Évaluer | Examiner les résultats et les erreurs |
**Aujourd’hui, nous apprenons à choisir les réglages et à comparer leurs effets.**
---
## Diapositive 4 — Notre exemple conducteur
### Estimer la conversion de prospects
Nous disposons d’un tableau contenant :
- `contacts` : nombre de contacts effectués ;
- `visites` : nombre de visites enregistrées ;
- `budget_fcfa` : budget déclaré ;
- `canal` : Web, Terrain ou Recommandation ;
- `conversion` : réponse connue, 0 ou 1.
**Notre cible :** `conversion`, avec 1 pour l’achat.
Nous allons comparer plusieurs réglages d’un arbre de décision.
**Données de démonstration fictives.** Les performances obtenues ne démontrent pas une performance sur de vrais prospects.
---
## Diapositive 5 — Les paramètres appris
Un **paramètre appris** est un réglage que le modèle détermine à partir des données pendant `fit()`.
| Modèle | Exemples de paramètres appris |
|---|---|
| Régression linéaire | Coefficients et constante |
| Régression logistique | Coefficients et constante |
| Arbre de décision | Variables et seuils utilisés pour les coupures |
**Exemple :**
Si une régression apprend :
`loyer = 10 000 + 2 000 × surface`
elle a appris une constante de 10 000 et un coefficient de 2 000.
Nous choisissons la méthode. L’entraînement détermine ses paramètres.
---
## Diapositive 6 — Les hyperparamètres
Un **hyperparamètre** est un choix que nous fixons avant l’entraînement.
| Modèle | Hyperparamètre | Question associée |
|---|---|---|
| Arbre | `max_depth` | Jusqu’à quelle profondeur peut-il se développer ? |
| Arbre | `min_samples_leaf` | Combien d’exemples faut-il au minimum dans une feuille ? |
| KNN | `n_neighbors` | Combien de voisins participent à la prédiction ? |
| Logistique | `C` | Quelle force de régularisation appliquer ? |
**Changer un hyperparamètre peut changer le modèle obtenu après `fit()`.**
Il faut donc réentraîner et comparer les résultats.
*Références : R4, R5 et R6.*
---
## Diapositive 7 — Le sous-apprentissage
### Un modèle qui apprend trop peu
Le modèle ne représente pas suffisamment les relations utiles dans les données.
**Signes possibles :**
- résultats faibles sur l’entraînement ;
- résultats également faibles sur validation ;
- règles trop limitées pour le problème.
**Exemple :** un arbre extrêmement peu profond peut manquer des interactions entre les variables.
**Pistes à examiner :** variables plus pertinentes, modèle plus adapté ou contraintes moins fortes.
Ces signes sont des indices. Des données peu informatives peuvent aussi limiter les résultats.
*Référence : R7.*
---
## Diapositive 8 — Le surapprentissage
### Un modèle trop adapté aux exemples d’entraînement
Le modèle apprend des particularités qui ne se retrouvent pas suffisamment dans de nouvelles observations.
**Signes possibles :**
- score très élevé sur l’entraînement ;
- score nettement inférieur sur validation ;
- résultats sensibles à la répartition des données.
**Exemple :** un arbre profond peut construire des règles très particulières à quelques observations.
**Pistes à examiner :** limiter sa complexité, améliorer les données et vérifier le protocole.
*Référence : R7.*
---
## Diapositive 9 — Comparer entraînement et validation
**Tableau fictif construit pour expliquer le raisonnement.**
| Profondeur maximale | F1 entraînement | F1 validation |
|---:|---:|---:|
| 1 | 0,62 | 0,60 |
| 3 | 0,79 | 0,74 |
| 10 | 0,99 | 0,65 |
**Lecture :**
- Profondeur 1 : résultats faibles sur les deux parties.
- Profondeur 3 : résultat de validation le plus élevé dans cet exemple.
- Profondeur 10 : réussite presque parfaite sur l’entraînement, avec une baisse sur validation.
**Un score d’entraînement plus élevé ne suffit pas pour choisir.**
Question : quelle configuration examineriez-vous en priorité, et pourquoi ?
---
## Diapositive 10 — Les améliorations possibles
Les hyperparamètres ne sont qu’une partie du travail.
| Problème observé | Piste à examiner |
|---|---|
| Informations incorrectes | Corriger les données et vérifier leur origine |
| Cible ambiguë | Préciser sa définition et la qualité des étiquettes |
| Variables peu utiles | Revoir les entrées disponibles |
| Modèle trop complexe | Renforcer les contraintes |
| Modèle trop limité | Tester une autre capacité ou méthode |
| Résultats instables | Examiner les effectifs et le découpage |
**Une recherche automatique ne répare pas une cible mal définie.**
Avant de multiplier les essais, formuler une hypothèse sur ce qui pourrait améliorer le résultat.
---
## Diapositive 11 — Les réglages d’un arbre
### Deux hyperparamètres pour commencer
**`max_depth` : profondeur maximale**
- Une faible valeur limite les successions de questions.
- Une valeur élevée autorise des règles plus détaillées.
**`min_samples_leaf` : effectif minimal dans une feuille**
- Une faible valeur autorise des feuilles contenant peu d’exemples.
- Une valeur plus élevée limite les règles fondées sur de petits effectifs.
```python
DecisionTreeClassifier(
max_depth=3,
min_samples_leaf=5,
random_state=42
)
```
**Ces valeurs sont un point de départ, pas une configuration universelle.** [scikit-learn 1.9.1 documentation](https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html?utm_source=chatgpt.com)
---
## Diapositive 12 — Le nombre de voisins de KNN
### Le rôle de `n_neighbors`
KNN prédit à partir des observations proches.
| Choix | Effet possible |
|---|---|
| Peu de voisins | Prédiction sensible aux cas locaux et au bruit |
| Davantage de voisins | Prédiction plus lissée |
| Trop de voisins | Risque de masquer des différences utiles |
**Exemple de valeurs à comparer :** 3, 5 et 9.
```python
KNeighborsClassifier(n_neighbors=5)
```
La distance dépend de la préparation des variables.
**Pour KNN, la standardisation doit rester dans la Pipeline.** [scikit-learn 1.9.1 documentation](https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html?utm_source=chatgpt.com)
---
## Diapositive 13 — La régularisation de la logistique
La **régularisation** applique une contrainte sur les coefficients pendant l’apprentissage.
Elle peut limiter des coefficients excessifs et aider la généralisation.
Avec `LogisticRegression` :
| Valeur de `C` | Force de régularisation |
|---|---|
| Plus petite | Plus forte |
| Plus grande | Plus faible |
```python
LogisticRegression(C=1.0, max_iter=1000)
```
**Attention :** augmenter `max_iter` autorise davantage d’itérations pour rechercher une solution. Cela ne garantit pas un meilleur score de validation.
*Référence : R6.* [scikit-learn 1.9.1 documentation](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?utm_source=chatgpt.com)
---
## Diapositive 14 — Les données utilisées pour choisir
### Le développement et le test final
Nous réservons une partie des données au **test final**.
Les autres données forment le **développement**. Elles servent à apprendre et à choisir les configurations.
Deux possibilités dans le développement :
- utiliser une séparation entraînement/validation ;
- utiliser une validation croisée.
**Le test final reste à l’écart des choix.**
Si nous modifions le modèle après chaque consultation du test, ce test participe au développement.
*Références : R1 et R8.*
---
## Diapositive 15 — La validation croisée
### Répéter l’évaluation dans le développement
Exemple avec trois groupes : A, B et C.
| Essai | Groupes d’entraînement | Groupe de validation |
|---|---|---|
| 1 | B et C | A |
| 2 | A et C | B |
| 3 | A et B | C |
À chaque essai :
- une nouvelle copie du modèle apprend ;
- un groupe reste à l’écart de cet apprentissage ;
- nous calculons un score de validation.
**Le test final ne participe à aucun de ces essais.** [scikit-learn 1.9.1 documentation](https://scikit-learn.org/stable/modules/cross_validation.html?utm_source=chatgpt.com)
---
## Diapositive 16 — La moyenne et la variabilité des scores
**Exemple illustratif de trois scores de validation :**
| Pli | F1 |
|---|---:|
| 1 | 0,70 |
| 2 | 0,74 |
| 3 | 0,78 |
**Moyenne : 0,74.**
Les résultats varient entre 0,70 et 0,78 selon le groupe laissé de côté.
La moyenne résume les résultats. La dispersion indique leur variabilité dans ce protocole.
**Une petite différence entre deux moyennes ne prouve pas une supériorité stable.**
L’écart-type des plis ne constitue pas, à lui seul, un intervalle de confiance.
*Référence : R1.*
---
## Diapositive 17 — Un découpage adapté aux données
Le choix du découpage dépend du problème.
| Situation | Précaution |
|---|---|
| Classification avec observations indépendantes | Répartir les classes avec une stratification |
| Plusieurs lignes du même client | Éviter de partager ce client entre apprentissage et validation lorsque l’usage exige de généraliser à de nouveaux clients |
| Prévision du futur | Apprendre sur le passé et valider sur une période ultérieure |
| Images d’une même plante ou variantes d’un document | Tenir compte de leur dépendance |
**Pour notre exemple :** validation croisée stratifiée sur des prospects fictifs indépendants.
La stratification conserve approximativement les proportions de classes. Elle ne corrige pas les dépendances entre observations.
*Référence : R1.*
---
## Diapositive 18 — La Pipeline dans la validation croisée
Les prétraitements peuvent apprendre :
- une médiane ;
- une moyenne et un écart-type ;
- une liste de catégories.
**Dans chaque pli :**
1. Le prétraitement apprend sur le groupe d’entraînement.
2. Le modèle apprend sur ces données transformées.
3. La validation utilise les transformations déjà apprises.
**La recherche doit recevoir la Pipeline complète.**
Préparer toutes les données avant la validation croisée peut introduire une fuite. [scikit-learn 1.9.1 documentation](https://scikit-learn.org/stable/common_pitfalls.html?utm_source=chatgpt.com)
---
## Diapositive 19 — Le principe de GridSearchCV
### Comparer une petite grille de réglages
Nous choisissons :
- un modèle ou une Pipeline ;
- quelques valeurs d’hyperparamètres ;
- une métrique ;
- un protocole de validation croisée.
`GridSearchCV` évalue les combinaisons proposées.
**Exemple :**
```python
{
"modele__max_depth": [2, 4, 6],
"modele__min_samples_leaf": [5, 10]
}
```
La recherche retient une configuration parmi les valeurs testées.
Elle ne découvre pas automatiquement toutes les configurations possibles.
*Références : R2 et R3.*
---
## Diapositive 20 — Le coût d’une recherche
Dans notre grille :
- 3 profondeurs ;
- 2 effectifs minimaux par feuille.
**Nombre de configurations : 3 × 2 = 6.**
Avec trois plis :
**6 × 3 = 18 entraînements pour comparer.**
Avec `refit=True`, un entraînement supplémentaire prépare ensuite le choix retenu sur tout le développement.
**Total pour cette recherche : 19 entraînements.**
Une petite grille facilite le calcul et l’interprétation. Multiplier les essais peut aussi conduire à trop s’adapter aux résultats de validation.
*Références : R2 et R3.*
---
## Diapositive 21 — Préparer les données de l’exemple
Le fichier `prospects_demo.csv` doit être disponible dans le dossier de travail.
Les extraits suivants se lisent et s’exécutent dans l’ordre.
```python
import pandas as pd
from sklearn.model_selection import train_test_split
donnees = pd.read_csv("prospects_demo.csv")
X = donnees[
["contacts", "visites", "budget_fcfa", "canal"]
]
y = donnees["conversion"]
X_dev, X_test, y_dev, y_test = train_test_split(
X, y,
test_size=0.2,
stratify=y,
random_state=42
)
```
**Le test contient 20 % des observations.**
Pour votre propre dataset, les contrôles de qualité et la vérification du découpage précèdent cette étape.
---
## Diapositive 22 — Construire la Pipeline de l’arbre
```python
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.tree import DecisionTreeClassifier
numerique = SimpleImputer(strategy="median")
categoriel = make_pipeline(
SimpleImputer(strategy="most_frequent"),
OneHotEncoder(handle_unknown="ignore")
)
preparation = ColumnTransformer([
("num", numerique,
["contacts", "visites", "budget_fcfa"]),
("cat", categoriel, ["canal"])
])
pipe = Pipeline([
("preparation", preparation),
("modele", DecisionTreeClassifier(random_state=42))
])
```
Nous imputons les nombres et encodons le canal.
**L’arbre ne nécessite généralement pas de standardisation.**
---
## Diapositive 23 — Mesurer une référence simple
Une référence permet de savoir ce que produit une stratégie élémentaire.
Ici, elle prédit toujours la classe majoritaire de son entraînement.
```python
from sklearn.dummy import DummyClassifier
from sklearn.model_selection import (
StratifiedKFold, cross_validate
)
cv = StratifiedKFold(
n_splits=3, shuffle=True, random_state=42
)
reference = DummyClassifier(strategy="most_frequent")
scores_ref = cross_validate(
reference, X_dev, y_dev,
cv=cv, scoring="f1"
)
print(scores_ref["test_score"].mean())
```
**Ici, `f1` concerne la classe positive 1.**
Dans cette sortie de validation croisée, `test_score` désigne les plis de validation. Notre test final reste réservé.
*Références : R1 et R9.*
---
## Diapositive 24 — Lancer la recherche de réglages
```python
from sklearn.model_selection import GridSearchCV
grille = {
"modele__max_depth": [2, 4, 6],
"modele__min_samples_leaf": [5, 10]
}
recherche = GridSearchCV(
estimator=pipe,
param_grid=grille,
scoring="f1",
cv=cv,
return_train_score=True,
refit=True,
n_jobs=1
)
recherche.fit(X_dev, y_dev)
```
`modele__max_depth` désigne `max_depth` dans l’étape nommée `modele`.
**Le test final n’entre pas dans `fit()`.**
*Référence : R3.*
---
## Diapositive 25 — Lire les résultats de la recherche
```python
print(recherche.best_params_)
print(recherche.best_score_)
resultats = pd.DataFrame(recherche.cv_results_)
colonnes = [
"param_modele__max_depth",
"param_modele__min_samples_leaf",
"mean_train_score",
"mean_test_score",
"std_test_score"
]
print(
resultats[colonnes]
.sort_values("mean_test_score", ascending=False)
)
```
| Sortie | Signification |
|---|---|
| `best_params_` | Réglages retenus |
| `best_score_` | Score moyen de validation du choix retenu |
| `mean_train_score` | Score moyen d’entraînement |
| `mean_test_score` | Score moyen des plis de validation |
| `std_test_score` | Dispersion des scores de validation |
**Ces résultats ne sont pas les scores du test final.**
*Référence : R3.*
---
## Diapositive 26 — Arrêter le choix et évaluer le test final
Avant d’ouvrir le test :
- comparer à la référence ;
- examiner les erreurs et la variabilité ;
- confirmer la métrique et les choix ;
- documenter les limites.
`best_score_` a servi à sélectionner une configuration. Il peut donc donner une estimation optimiste.
Avec `refit=True`, `best_estimator_` contient déjà la Pipeline retenue réentraînée sur tout le développement.
```python
from sklearn.metrics import classification_report
modele_final = recherche.best_estimator_
predictions_test = modele_final.predict(X_test)
print(
classification_report(
y_test, predictions_test, zero_division=0
)
)
```
**Le rapport final sert à décrire le résultat, sans lancer une nouvelle série de réglages sur ce test.**
*Références : R2 et R3.*
---
## Diapositive 27 — Sauvegarder et prédire une nouvelle entrée
Nous conservons toute la Pipeline.
```python
import joblib
joblib.dump(modele_final, "pipeline_prospects.joblib")
modele_recharge = joblib.load(
"pipeline_prospects.joblib"
)
nouveau = pd.DataFrame([{
"contacts": 4,
"visites": 8,
"budget_fcfa": 100000,
"canal": "Web"
}])
print(modele_recharge.predict(nouveau))
```
**Le pipeline rechargé applique les transformations apprises.**
Conserver les noms, les unités et les versions des bibliothèques.
Charger uniquement des fichiers de modèle provenant d’une source de confiance.
*Référence : R10.*
---
## Diapositive 28 — Les erreurs à éviter
| Erreur | Conséquence |
|---|---|
| Choisir le plus grand score d’entraînement | Favoriser une mémorisation |
| Régler le modèle sur le test final | Perdre une évaluation indépendante |
| Prétraiter toutes les données avant la validation | Introduire une fuite |
| Modifier plusieurs éléments sans trace | Rendre les effets difficiles à expliquer |
| Changer les graines jusqu’à obtenir un beau score | Sélectionner une répartition favorable |
| Tester une grille immense sans justification | Augmenter le coût et la sélection opportuniste |
| Présenter les résultats d’une simulation comme une preuve terrain | Exagérer la portée de l’expérience |
**Un résultat modeste et expliqué reste une information utile.**
*Référence : R8.*
---
## Diapositive 29 — Utiliser l’IA pour comprendre et améliorer
### Un exemple de demande utile
> Voici notre Pipeline, notre protocole et les résultats réellement obtenus sur validation. Explique les écarts entre entraînement et validation. Propose au maximum deux changements justifiés, avec leur effet attendu. Ne modifie pas le test final et n’invente aucun résultat.
**Avant d’appliquer une proposition :**
- comprendre le changement ;
- formuler l’effet attendu ;
- conserver la version précédente ;
- exécuter et noter le résultat ;
- accepter qu’une modification puisse ne rien améliorer.
**Question à la classe :** si la validation baisse après un changement, quelles vérifications feriez-vous avant de changer encore de modèle ?
---
## Diapositive 30 — Le TD de demain : entraîner un modèle de A à Z
### Objectif
Réaliser un parcours complet et expliquer chaque étape.
| Phase | Travail prévu |
|---|---|
| Compréhension | Définir le problème, une ligne, les entrées et la cible |
| Contrôle | Examiner types, unités, manques, doublons et classes |
| Protocole | Réserver le test et choisir une métrique |
| Construction | Préparer les colonnes et créer une Pipeline |
| Première évaluation | Mesurer une référence et un premier modèle |
| Amélioration | Comparer une petite grille en validation croisée |
| Vérification finale | Arrêter le choix, évaluer et commenter les erreurs |
| Utilisation | Sauvegarder, recharger et prédire une nouvelle entrée |
**À préparer :** environnement de travail, CSV de démonstration et dictionnaire de votre dataset.
**Livrable :** notebook exécuté, tableau de résultats, erreurs commentées et prédiction sur une nouvelle entrée.
---
## Diapositive 31 — Références officielles : évaluation et recherche
**R1 — Validation croisée et stratégies de découpage**
Scikit-learn, *Cross-validation: evaluating estimator performance*
https://scikit-learn.org/stable/modules/cross_validation.html
**R2 — Réglage des hyperparamètres**
Scikit-learn, *Tuning the hyper-parameters of an estimator*
https://scikit-learn.org/stable/modules/grid_search.html
**R3 — Documentation de GridSearchCV**
Paramètres, résultats et réentraînement du choix retenu
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
**R7 — Courbes de validation et diagnostic des modèles**
https://scikit-learn.org/stable/modules/learning_curve.html
**R9 — Métriques et choix des scores**
https://scikit-learn.org/stable/modules/model_evaluation.html
*Documentation consultée le 3 novembre 2026.*
---
## Diapositive 32 — Références officielles : modèles et bonnes pratiques
**R4 — Arbres de décision : DecisionTreeClassifier**
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
**R5 — KNN : KNeighborsClassifier**
https://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
**R6 — Régression logistique : LogisticRegression**
https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
**R8 — Erreurs fréquentes et prévention des fuites**
https://scikit-learn.org/stable/common_pitfalls.html
**R10 — Sauvegarde et chargement des modèles**
https://scikit-learn.org/stable/model_persistence.html
**Complément — Pipelines et transformations par colonne**
https://scikit-learn.org/stable/modules/compose.html