Le machine learning en partant de zéro · Leçon 1.3 · 4 sur 33 leçons prêtes · 12 min
La référence : à quoi comparer votre modèle ?
En bref
Avant de vanter un modèle, calculez le score sans apprentissage : classe la plus fréquente ou moyenne. Si les malades sont rares, « toujours sain » brille.
Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
Dans la leçon 0.1, l’arbre reconnaissait 95,1 % des manchots et deviner, 43,7 %. Ce second nombre est la référence (en anglais, baseline) : le score d’une réponse qui n’apprend rien. Sans elle, vous ne savez pas si un modèle a appris quoi que ce soit. Aujourd’hui, vous verrez comment la calculer dans deux tâches et quand l’exactitude seule vous trompe. Les données : 569 biopsies de tumeurs du sein et 442 patients diabétiques.
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 : Environ 99 %, plus que la règle apprise, et il n’en trouve aucune
107 biopsies sur 108, c’est 99,1 % d’exactitude, et la maligne passe inaperçue. La règle apprise à un seuil obtient 90,7 % sur ce test, moins, mais elle trouve bien cette biopsie maligne. Sur le test complet, avec 64 malignes, « toujours bénigne » n’obtient que 62,6 %.
À vous de jouer
- Commencez par les biopsies avec les 64 malignes. De combien la règle apprise bat-elle « toujours bénigne » ?
- Déplacez le curseur vers la droite jusqu’à 5 malignes, puis 1. Que devient l’exactitude de « toujours bénigne », et le nombre de malignes trouvées ?
- Passez au diabète. Comparez l’erreur de la droite sur l’IMC et du modèle à 10 mesures avec l’erreur de la moyenne seule.
Une fois vérifié dans le lab, nommons ce que vous voyez.
L’idée en quelques mots
La référence est la réponse la plus simple qu’on puisse donner sans apprendre. En classification, c’est la classe la plus fréquente : sur les 398 biopsies d’apprentissage, 250 sont bénignes, donc la réponse est toujours « bénigne ». En régression, c’est la moyenne : chaque patient reçoit la même progression prédite, la moyenne des patients d’apprentissage.
Un modèle n’a de sens que s’il bat nettement la référence sur les mêmes données de test. Sur les biopsies, la règle à une mesure et un seuil obtient 91,2 % contre 62,6 %. Pour le diabète, le modèle à 10 mesures a une erreur de 2827 contre 5076 pour la moyenne, soit 44,3 % de moins. Une droite sur l’IMC seul ne réduit l’erreur que de 19,3 %.
Il existe aussi une référence plus faible : deviner selon les proportions, c’est-à-dire « bénigne » avec une probabilité égale à la part de bénignes parmi les biopsies d’apprentissage. En moyenne, elle obtient 53,2 %, moins que « toujours bénigne ». C’est pourquoi on prend la classe la plus fréquente comme référence : le hasard est plus facile à battre qu’une vraie compréhension.
Jak to policzono
- Biopsies : Breast Cancer Wisconsin (Diagnostic), UCI, licence CC BY 4.0. 569 biopsies (357 bénignes, 212 malignes), 10 mesures des noyaux cellulaires.
- Diabète : le jeu Diabetes (Efron et al., 2004) fourni avec scikit-learn ; les auteurs n’ont indiqué aucune licence. 442 patients, 10 mesures, progression de la maladie un an plus tard.
- Découpage 70/30, le même que
train_test_split(test_size=0.3, random_state=1)dans scikit-learn ; biopsies stratifiées. Le test compte 171 biopsies et 133 patients. - Règle : un arbre de décision à une question (CART). Modèle de régression : moindres carrés.
Pourquoi ça marche
L’exactitude de « toujours la classe la plus fréquente » est simplement la part de cette classe dans le test. Sur le test complet, 107 biopsies sur 171 sont bénignes, d’où 62,6 %. Gardez 1 maligne et les bénignes font 107 sur 108, d’où 99,1 %. L’exactitude de la référence ne dit rien des biopsies. Elle dit seulement à quel point l’autre classe est rare.
C’est pourquoi, avec une classe rare, l’exactitude ne distingue plus un bon modèle d’un modèle inutile. Avec 5 malignes dans le test, « toujours bénigne » obtient 95,5 % et la règle 91,1 %, alors que seule la règle trouve les 5. Ce n’est pas un découpage chanceux : sur 100 découpages différents, « toujours bénigne » bat la règle en exactitude dans 82. Ce qui aide, c’est un second nombre à côté de l’exactitude : combien de cas de la classe rare le modèle a vraiment trouvés.
En régression, la moyenne est la meilleure réponse constante : aucun autre nombre unique ne donne une erreur quadratique moyenne plus basse sur les données d’apprentissage. Tout modèle qui dispose de mesures devrait la battre, et ici il le fait toujours. Sur 100 découpages, la droite sur l’IMC et le modèle à 10 mesures ont une erreur plus basse que la moyenne à chaque fois, en moyenne 33,7 % et 48,5 % de moins.
Erreur fréquente
Vrai ou faux : « 90 % d’exactitude, c’est beaucoup ». Faux, ou plutôt : le nombre seul ne le dit pas. Quand 1 personne sur 100 est malade, le test « toujours sain » a 99 % d’exactitude et ne trouve personne. Un modèle à 90 % serait alors pire que rien en exactitude, et pourtant il pourrait être très utile s’il trouve les malades. Donnez toujours la référence à côté du score et vérifiez combien de cas de la classe rare le modèle a trouvés.
Là où l’analogie a ses limites : la référence est un plancher, pas un objectif. La battre d’un cheveu ne veut généralement rien dire, car un autre découpage des données peut inverser le résultat.
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
- La référence est le score sans apprentissage : la classe la plus fréquente en classification, la moyenne en régression.
- On compare un modèle à la référence sur les mêmes données de test, pas à zéro.
- Quand une classe est rare, « toujours la classe fréquente » a une exactitude élevée et ne trouve personne ; indiquez aussi combien de cas rares le modèle a trouvés.
- Vérifiez l’avance sur de nombreux découpages, car un seul peut bien tomber par hasard.
Pour aller plus loin : formule, code, pratique
Les maths
L’exactitude de la réponse « toujours la classe k » est la part de cette classe dans le test : exactitude = n_k / n. Sur le test complet 107 / 171 ≈ 0,626, avec une seule maligne 107 / 108 ≈ 0,991.
Deviner « bénigne » avec la probabilité p (la part de bénignes à l’apprentissage, 250 / 398 ≈ 0,628) est juste en moyenne p · q + (1 − p) · (1 − q) du temps, où q est la part de bénignes dans le test. Sur le test complet, cela donne environ 0,532.
En régression, une réponse constante c a l’erreur MSE(c) = (1/n) · Σ (yᵢ − c)². Sa dérivée −(2/n) · Σ (yᵢ − c) s’annule en c = ȳ, donc la moyenne donne la plus petite erreur de toutes les constantes. L’amélioration relative vaut 1 − MSE(modèle) / MSE(moyenne) : pour 10 mesures, 1 − 2827 / 5076 ≈ 0,443.
En code (Python)
La même expérience dans scikit-learn : la référence et la règle à un seuil sur les biopsies avec 64, 5 et 1 malignes dans le test, la comparaison sur 100 découpages, puis la moyenne, la droite sur l’IMC et le modèle à 10 mesures pour le diabète.
import numpy as np
from sklearn.datasets import load_breast_cancer, load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LinearRegression
X, y = load_breast_cancer(return_X_y=True)
X = X[:, :10] # les 10 mesures « mean », comme dans le lab ; y : 0 = maligne, 1 = bénigne
def biopsies(seed, keep_malignant):
tr, te = train_test_split(np.arange(len(y)), test_size=0.3, stratify=y, random_state=seed)
te = np.sort(te) # lignes de test dans l’ordre du fichier, comme dans le lab
major = np.bincount(y[tr]).argmax() # référence : la classe la plus fréquente parmi les biopsies d’apprentissage
rule = DecisionTreeClassifier(max_depth=1, random_state=0).fit(X[tr], y[tr]) # une mesure, un seuil
rows = np.r_[te[y[te] == 1], te[y[te] == 0][:keep_malignant]] # toutes les bénignes + les m premières malignes
pred = rule.predict(X[rows])
return (y[rows] == major).mean(), ((major == 0) & (y[rows] == 0)).sum(), (pred == y[rows]).mean(), ((pred == 0) & (y[rows] == 0)).sum()
for m in (64, 5, 1):
base, base_found, acc, found = biopsies(1, m)
print(f"malignant {m}: always benign {base:.3f} (finds {base_found}), rule {acc:.3f} (finds {found})")
wins = sum(biopsies(s, 5)[0] > biopsies(s, 5)[2] for s in range(100))
print(f"100 splits, 5 malignant: always benign beats the rule in {wins}")
Xd, yd = load_diabetes(return_X_y=True)
def diabetes(seed):
a, b, c, e = train_test_split(Xd, yd, test_size=0.3, random_state=seed)
mse = lambda p: ((e - p) ** 2).mean()
return mse(c.mean()), mse(LinearRegression().fit(a[:, [2]], c).predict(b[:, [2]])), mse(LinearRegression().fit(a, c).predict(b))
mean, bmi, full = diabetes(1)
print(f"diabetes: mean {mean:.0f}, BMI {bmi:.0f} ({1 - bmi / mean:.1%} lower), all 10 {full:.0f} ({1 - full / mean:.1%} lower)")
r = np.array([diabetes(s) for s in range(100)])
print(f"100 splits: BMI beats the mean in {(r[:, 1] < r[:, 0]).sum()}, all 10 in {(r[:, 2] < r[:, 0]).sum()}; error lower by {1 - r[:, 1].mean() / r[:, 0].mean():.1%} and {1 - r[:, 2].mean() / r[:, 0].mean():.1%} on average")
Sortie
malignant 64: always benign 0.626 (finds 0), rule 0.912 (finds 59)
malignant 5: always benign 0.955 (finds 0), rule 0.911 (finds 5)
malignant 1: always benign 0.991 (finds 0), rule 0.907 (finds 1)
100 splits, 5 malignant: always benign beats the rule in 82
diabetes: mean 5076, BMI 4096 (19.3% lower), all 10 2827 (44.3% lower)
100 splits: BMI beats the mean in 100, all 10 in 100; error lower by 33.7% and 48.5% on average
Sur le découpage 1, les nombres sont les mêmes que dans le lab. Le modèle à 10 mesures du lab travaille sur des données arrondies à deux décimales, donc son erreur peut différer de ce code d’une fraction, mais arrondie elle vaut aussi 2827.
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
- Dans scikit-learn, la référence vient de
DummyClassifier(strategy="most_frequent")etDummyRegressor(strategy="mean"). Calculez-la sur le même découpage que le modèle. - Avec des classes déséquilibrées, donnez à côté de l’exactitude le rappel de la classe rare ou l’exactitude équilibrée ; « toujours la classe fréquente » a une exactitude équilibrée de 50 %.
- Une référence plus forte est souvent une règle simple à une mesure ou le modèle que l’entreprise utilise déjà. Un nouveau modèle doit battre le meilleur d’entre eux.
- Quand l’avance sur la référence est faible, vérifiez-la sur de nombreux découpages ou par validation croisée avant de l’annoncer.
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 :