Exercice 99 / 100

Projet — Évaluation de modèle

Compare LogisticRegression, DecisionTreeClassifier, RandomForestClassifier et KNeighborsClassifier sur le dataset Iris. Affiche l'accuracy de chaque modele.

Évaluer = comparer plusieurs modèles sur un même problème pour choisir le meilleur. Outil clé : cross_val_score + pipelines pour standardiser le prétraitement.

Protocole standard

1. fixer le random_state pour la reproductibilité 2. utiliser la MÊME cross-validation pour tous les modèles 3. utiliser des PIPELINES pour intégrer le prétraitement (StandardScaler si nécessaire) 4. rapporter moyenne ± écart-type, pas un seul score 5. inspecter les modèles avec une différence statistiquement significative
Comparer des modèles suppose le même protocole pour tous : la même validation croisée, puis chaque score posé à sa valeur avec son écart-type, car deux modèles dont les marges se recouvrent ne sont pas départagés

Quels modèles tester en baseline ?

Classification

LogisticRegression
rapide, interprétable
DecisionTreeClassifier
interprétable, sans scaling
RandomForestClassifier
performant out-of-the-box
KNeighborsClassifier
simple, dépend du scaling
GradientBoostingClassifier
souvent le meilleur tabulaire

Régression

LinearRegression RandomForestRegressor GradientBoostingRegressor

Exemple : comparaison multi-modèles

import numpy as np from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline
np.random.seed(42) X = np.random.randn(300, 5) y = (X[:, 0] + 0.5*X[:, 1] - X[:, 2] > 0).astype(int)
models = { 'Logistic': Pipeline([('s', StandardScaler()), ('m', LogisticRegression())]), 'Tree': DecisionTreeClassifier(max_depth=5), 'Forest': RandomForestClassifier(n_estimators=50, random_state=42), 'KNN': Pipeline([('s', StandardScaler()), ('m', KNeighborsClassifier())]), }
for name, model in models.items(): scores = cross_val_score(model, X, y, cv=5, scoring='accuracy') print(f'{name:12s}: {scores.mean():.4f} (+/- {scores.std():.4f})')

Métriques à choisir selon le problème

scoring='accuracy' classification simple, classes équilibrées scoring='f1' classes déséquilibrées scoring='roc_auc' binaire, indépendant du seuil scoring='r2' régression scoring='neg_mean_squared_error' MSE (avec signe négatif car sklearn maximise)

Tests statistiques de différence

Pour décider si modèle A est significativement meilleur que B :

from scipy import stats stats.ttest_rel(scores_A, scores_B) # t-test apparié sur les folds

Une fois le meilleur modèle identifié par CV, refit sur 100% du train et évalue sur le test set holdout pour la métrique finale.

exercise.py

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →