Le machine learning en partant de zéro · Leçon 5.6 · 31 sur 33 leçons prêtes · 12 min
Quel modèle, quand ?
En bref
Cinq modèles, cinq jeux, 20 découpages. Aucun modèle n’est en tête partout, et 0,3 point d’écart peut être un nul : 10 contre 7.
Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
Vous connaissez maintenant cinq familles de modèles : la régression logistique, les k plus proches voisins (kNN), la forêt aléatoire, le gradient boosting et la SVM à noyau RBF. Lequel choisir ? La réponse honnête : celui qui fait le mieux en validation sur vos données. Cette leçon vérifie à quel point le résultat dépend des données et comment distinguer une vraie différence du bruit. Nous montons un zoo de modèles : chacun des cinq modèles avec ses réglages par défaut, sans ajustement, sur cinq jeux de données, et sur chaque jeu avec les mêmes 20 découpages. À chaque fois, 75 % des lignes servent à apprendre et 25 % à valider.
Choisissez une réponse et votre degré de certitude.
Répondez pour débloquer le labo.
Labo interactif
Ce labo interactif fonctionne dans un navigateur avec JavaScript activé. Le texte qui l’entoure décrit ce qu’il montre.
Voir la réponse
Bonne réponse : Non : la SVM bat la régression sur les chiffres et perd contre elle sur les manchots
Non. Sur les chiffres, la SVM a plus de bonnes réponses que la régression logistique sur 17 découpages sur 20, la régression plus que la SVM sur 3. Sur les manchots, la régression a plus de bonnes réponses sur 9 découpages, la SVM sur aucun, et 11 sont à égalité. La meilleure moyenne revient aussi à des modèles différents selon le jeu, mais sur quatre jeux le meneur a plus de bonnes réponses que le deuxième sur 10 découpages sur 20 au plus. Qui est en tête y dépend en grande partie des découpages.
À vous d’essayer
- Au départ : chiffres, kNN contre SVM. L’écart des moyennes est plus petit que la dispersion de kNN d’un découpage à l’autre. Sur combien des 20 découpages la SVM a-t-elle plus de bonnes réponses ?
- Passez aux tumeurs du sein et comparez la SVM au gradient boosting. Quel est l’écart des moyennes, et comment se répartissent les découpages ?
- Trouvez une paire de modèles où l’un est en tête sur les chiffres et l’autre sur les manchots.
- Sur chaque jeu, regardez l’écart entre le pire et le meilleur découpage d’un même modèle.
Une fois vérifié dans le lab, mettons des mots sur ce que vous voyez.
L’idée en termes simples
Le même modèle sur le même jeu obtient des résultats différents selon le découpage, parce que la validation reçoit tantôt des exemples plus faciles, tantôt plus difficiles. Sur les tumeurs du sein, la régression logistique obtient de 89,4 % à 96,5 % sur des découpages isolés. Les écarts entre modèles sont souvent bien plus petits. Un seul découpage ne suffit donc pas pour les classer.
Mieux vaut comparer les modèles par paires : sur le même découpage, les deux ont la tâche aussi facile ou aussi difficile. On compte sur combien de découpages chacun a plus de bonnes réponses. Sur les tumeurs, la SVM obtient 94,2 % en moyenne et le gradient boosting 93,9 %. La SVM a plus de bonnes réponses sur 10 découpages, le boosting sur 7, et 3 sont à égalité. Un tel écart de 0,3 point est un match nul, pas une victoire. L’inverse arrive aussi. Sur les chiffres, la SVM n’a que 0,7 point d’avance sur kNN, alors que le résultat de kNN saute d’un découpage à l’autre de 96,0 % à 99,1 %. Pourtant, la SVM a plus de bonnes réponses sur 16 découpages sur 20, et kNN sur 2. Ce qui compte, c’est que l’avance se répète, pas la taille de la moyenne.
Quand une avance se répète-t-elle ? Si les deux modèles étaient aussi bons l’un que l’autre, chaque découpage sans égalité serait un pile ou face. Une pièce donne 16 à 2 moins d’une fois sur 100 séries, et 10 à 7 souvent. Le lab dit qu’une avance se répète quand un tel résultat sortirait moins d’une fois sur 100 séries. C’est le test des signes. Les égalités ne pèsent pas dessus : on ne les compte simplement pas.
Le plus important : l’ordre dépend des données. Sur les chiffres, la SVM a plus de bonnes réponses que la régression logistique sur 17 découpages sur 20, la régression plus que la SVM sur 3. Sur les manchots, c’est l’inverse : la régression a plus de bonnes réponses sur 9 découpages, la SVM sur aucun, et 11 sont à égalité. Les deux avances passent le test des signes. Sur les chiffres, la SVM a plus de bonnes réponses que chacun des autres modèles sur au moins 16 découpages.
Tout cela avec les réglages par défaut, sans ajustement, sur de petits jeux (de 150 à 1797 lignes) aux variables seulement numériques. Ce n’est pas un verdict sur les modèles en général. Sur de plus grands tableaux, aux variables de types variés et après réglage, l’ordre peut être autre (le boosting est traité dans la leçon 5.3). La conclusion est autre : un classement ne se recopie pas du tableau d’un autre, il se vérifie sur vos données.
Le meneur aussi est facile à surestimer. Prenez le modèle à la meilleure moyenne sur les découpages 1–10 et regardez qui est en tête sur les découpages 11–20. Sur les iris, les vins et les manchots, c’est déjà un autre modèle. Quand plusieurs modèles sont proches, c’est en grande partie le bruit qui décide lequel passe en tête, comme pour le choix des réglages dans la leçon 3.5.
Jak to policzono
- Données : Iris (Fisher, 1936), Wine (Aeberhard et Forina, 1992), Breast Cancer Wisconsin (Wolberg et al., 1993 ; 10 mesures « mean ») et Digits (Alpaydin et Kaynak, 1998), tous de l’UCI sous licence CC BY 4.0 ; Palmer Penguins (Gorman et al., 2014 ; Horst et al., 2020 ; licence CC0 1.0), 342 manchots avec 4 mesures corporelles.
- Modèles : réglages par défaut de scikit-learn, sans ajustement. Régression logistique (C = 1), kNN (k = 5), forêt aléatoire (100 arbres), gradient boosting (100 arbres, pas 0,1, profondeur 3), SVM à noyau RBF (C = 1). La régression, kNN et la SVM reçoivent des variables mises à l’échelle sur chaque découpage avec la seule partie d’apprentissage.
- Accord avec scikit-learn sur les mêmes 20 découpages : la SVM a les mêmes lignes justes sur chaque découpage, la régression et kNN diffèrent de 3 lignes au plus par découpage. Les arbres du lab coupent chaque variable en 32 intervalles au plus, alors que scikit-learn construit des arbres exacts, donc ici les écarts sont plus grands : sur les tumeurs, la forêt a le même résultat sur 3 découpages sur 20, le boosting sur 4. Avec des arbres exacts, c’est le boosting qui a la meilleure moyenne sur les tumeurs, pas la SVM. Les conclusions de cette leçon sur les paires sont les mêmes dans les deux versions.
- Découpages : 20 découpages stratifiés, 75 % pour apprendre et 25 % pour valider, les mêmes pour chaque modèle. Il n’y a pas de test ici. Les 500 résultats ont été calculés par le code du lab, et le test les recalcule de zéro. Le test des signes est bilatéral, sur les découpages sans égalité, avec un seuil de 1 %.
Pourquoi ça marche
Le théorème « pas de repas gratuit » (Wolpert, 1996) dit qu’en moyenne sur toutes les tâches possibles, aucun algorithme d’apprentissage n’est meilleur qu’un autre. Un modèle ne gagne que si ses hypothèses collent aux données particulières : frontières droites pour la régression logistique, voisins semblables pour kNN, seuils sur des variables isolées pour les arbres. C’est pourquoi choisir un modèle est une mesure, pas un savoir de tableau.
La comparaison par paires marche, car la difficulté d’un découpage touche les deux modèles à la fois et s’annule dans la différence. Une réserve : 20 découpages du même jeu partagent des lignes, ce ne sont donc pas 20 pile ou face indépendants. Les tests statistiques usuels sur de tels résultats ont tendance à être trop sûrs d’eux (Dietterich, 1998). C’est pourquoi le seuil est strict, et une avance qui se répète est un bon indice, pas une preuve.
Un modèle peut aussi avoir son propre hasard. La forêt tire au sort des lignes et des variables pour chaque arbre. Sur les chiffres, avec les mêmes 20 découpages, la forêt de graine aléatoire 1 a plus de bonnes réponses que la régression sur 15 découpages et moins sur 5, et avec la graine 4 plus sur 11 et moins sur 9. Avec aucune graine de 1 à 5 cette avance ne passe le test des signes. C’est pourquoi les exemples de cette leçon reposent sur des modèles sans hasard : la régression, kNN et la SVM.
Le code ci-dessous fait la même chose dans scikit-learn, sur d’autres découpages et avec des arbres exacts. La tête change : la SVM y a la meilleure moyenne sur quatre jeux, et la régression logistique sur les manchots. Le sens des paires de cette leçon reste, mais toutes les avances n’y passent pas le test des signes. Une raison de plus de ne pas appeler victoire un écart dans le bruit.
Une erreur fréquente
Vrai ou faux : « un modèle dont la moyenne est plus haute de 0,3 point est meilleur ». Faux. Sur les tumeurs, la SVM obtient 94,2 % et le gradient boosting 93,9 %, mais la SVM n’a plus de bonnes réponses que sur 10 découpages sur 20, le boosting sur 7. Dans le code ci-dessous, la même paire se partage les découpages 10 à 7, et l’écart des moyennes vaut 0,002.
Une deuxième erreur fréquente : « prenez toujours le boosting, XGBoost par exemple ». Dans ce zoo, avec les réglages par défaut, sur les vins la régression logistique a plus de bonnes réponses que le gradient boosting sur 15 découpages sur 20, et le boosting plus qu’elle sur 2. Ce n’est pas un verdict contre le boosting, seulement contre un choix sans validation.
Quiz
Trois questions pour vérifier vos acquis. Choisissez une réponse ou dépliez la solution sous chaque question. Au clavier : les flèches choisissent, Entrée ou Espace valide.
À retenir
- Aucun modèle n’est en tête partout : la SVM bat la régression logistique sur les chiffres (17 découpages contre 3) et perd sur les manchots (9 contre 0).
- Le découpage seul déplace le résultat de quelques points, donc un écart des moyennes de 0,3 point peut être un nul (10 découpages contre 7).
- Comparez les modèles sur les mêmes découpages et comptez où chacun gagne ; une avance petite mais répétée compte aussi (la SVM devant kNN sur les chiffres : 0,7 point, 16 à 2).
- Choisissez par validation sur vos données, prenez le modèle le plus simple en cas de nul, et regardez le test une fois, à la fin.
Pour aller plus loin : formule, code, pratique
Les maths
Pour les découpages k = 1, …, K, la différence dans une paire vaut d_k = acc_A(k) − acc_B(k) ; on regarde la moyenne d̄ = (1/K) · Σ_k d_k et le nombre de découpages avec d_k > 0.
Variance de la différence : Var(A − B) = Var(A) + Var(B) − 2 · Cov(A, B). Quand un découpage est difficile pour les deux modèles à la fois, la covariance est grande, donc la différence varie bien moins que chaque résultat seul.
Test des signes : le modèle A gagne sur w découpages, B sur l, égalités exclues. À modèles égaux, le nombre de victoires de A suit Bin(w + l, ½), et p = min(1, 2 · P(X ≤ min(w, l))). Pour 16 à 2, on obtient p ≈ 0,001.
En code (Python)
La même expérience dans scikit-learn : cinq modèles avec leurs réglages par défaut sur cinq jeux et 20 découpages, puis quatre paires découpage par découpage, avec le test des signes.
import pandas as pd
from scipy.stats import binomtest
from sklearn.datasets import load_iris, load_wine, load_breast_cancer, load_digits
from sklearn.model_selection import StratifiedShuffleSplit, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.svm import SVC
body = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
peng = pd.read_csv("data/raw/penguins.csv").dropna(subset=body)
cancer = load_breast_cancer()
data = {"iris": load_iris(return_X_y=True), "wine": load_wine(return_X_y=True), "cancer": (cancer.data[:, :10], cancer.target),
"penguins": (peng[body].values, peng["species"].values), "digits": load_digits(return_X_y=True)}
# le scaler est dans chaque pipeline, donc il n’apprend ses moyennes que sur la partie d’apprentissage de chaque découpage
models = {"logistic": make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000)),
"kNN": make_pipeline(StandardScaler(), KNeighborsClassifier()),
"forest": RandomForestClassifier(random_state=0),
"boosting": GradientBoostingClassifier(random_state=0),
"SVM": make_pipeline(StandardScaler(), SVC())}
splits = StratifiedShuffleSplit(n_splits=20, test_size=0.25, random_state=0)
acc = {}
for name, (X, y) in data.items():
acc[name] = {m: cross_val_score(model, X, y, cv=splits) for m, model in models.items()}
row = " | ".join(f"{m} {a.mean():.3f}" for m, a in acc[name].items())
best = max(acc[name], key=lambda m: acc[name][m].mean())
print(f"{name:8s} {row} best: {best}")
# test des signes : seulement les découpages sans égalité ; à modèles égaux, chacun serait un pile ou face
for name, a, b in [("digits", "SVM", "kNN"), ("digits", "SVM", "logistic"), ("penguins", "logistic", "SVM"), ("cancer", "SVM", "boosting")]:
d = acc[name][a] - acc[name][b]
win, lose = (d > 0).sum(), (d < 0).sum()
print(f"{name}: {a} beats {b} in {win} of 20 splits, loses in {lose}; sign test p = {binomtest(win, win + lose).pvalue:.3f}; mean difference {d.mean():.3f}")
Sortie
iris logistic 0.955 | kNN 0.945 | forest 0.949 | boosting 0.947 | SVM 0.959 best: SVM
wine logistic 0.982 | kNN 0.964 | forest 0.981 | boosting 0.946 | SVM 0.986 best: SVM
cancer logistic 0.931 | kNN 0.938 | forest 0.930 | boosting 0.939 | SVM 0.942 best: SVM
penguins logistic 0.988 | kNN 0.985 | forest 0.978 | boosting 0.973 | SVM 0.983 best: logistic
digits logistic 0.969 | kNN 0.974 | forest 0.975 | boosting 0.964 | SVM 0.979 best: SVM
digits: SVM beats kNN in 14 of 20 splits, loses in 4; sign test p = 0.031; mean difference 0.006
digits: SVM beats logistic in 17 of 20 splits, loses in 3; sign test p = 0.003; mean difference 0.010
penguins: logistic beats SVM in 7 of 20 splits, loses in 1; sign test p = 0.070; mean difference 0.005
cancer: SVM beats boosting in 10 of 20 splits, loses in 7; sign test p = 0.629; mean difference 0.002
Les découpages et l’implémentation des arbres diffèrent de ceux du lab, donc la tête aussi : la SVM a la meilleure moyenne sur quatre jeux, la régression logistique sur les manchots. Ici non plus, aucun modèle ne gagne partout. Le sens des paires de la leçon reste : sur les chiffres, la SVM bat la régression sur 17 découpages sur 20 et kNN sur 14, sur les manchots la régression bat la SVM sur 7 et perd sur 1. Seule la première paire passe ici le test des signes (p = 0,003). Les deux autres vont dans le même sens, mais avec trop peu de victoires sur ces découpages, donc une conclusion tirée d’un jeu de découpages mérite d’être vérifiée sur un autre. La SVM et le boosting se partagent à nouveau les découpages des tumeurs 10 à 7.
Télécharger le notebook (.ipynb). Ouvrez-le dans Jupyter ou importez-le dans Google Colab ; il télécharge lui-même les données manquantes.
Pour les praticiens
- Commencez par une référence (leçon 1.3), puis prenez quelques modèles de types différents : linéaire, voisins, arbres, noyau. Évaluez-les tous sur les mêmes découpages (
cross_validateavec un seulcv) et avec le prétraitement dans un pipeline (leçon 4.6). - Regardez la dispersion et les paires, pas seulement les moyennes. Vérifiez une avance avec le test des signes (
binomtestde SciPy) sur les découpages sans égalité. En cas de nul, choisissez le modèle le moins cher à maintenir ou le plus facile à expliquer. - N’ajustez que les finalistes (leçon 3.5). Les réglages par défaut peuvent être loin des meilleurs, surtout pour le boosting et les SVM.
- Traitez les classements « quel modèle, quand » trouvés sur Internet comme une liste de candidats à valider, pas comme un verdict. Gardez le test pour la toute fin et regardez-le une fois.
Cela vous a-t-il aidé ?
Merci ! Cela nous aide à nous améliorer.
Aller plus loin dans l’Atlas
Articles de l’encyclopédie sur les notions de cette leçon :