Le machine learning en partant de zéro · Leçon 5.4 · 29 sur 33 leçons prêtes · 12 min
Bayes naïf : une hypothèse fausse, de bonnes décisions
En bref
Le Bayes naïf suppose les variables indépendantes. Sur les pétales d’iris (r = 0,80) : 93,3 % ; sur 171 tumeurs de validation, il déclare 98,3 % pour 88,3 %.
Échauffement Deux questions de leçons précédentes. Une minute, sans jamais bloquer la leçon.
Une médecin voit de la fièvre et une toux. À quel point cela indique-t-il la grippe ? Le Bayes naïf répond ainsi : prenez la fréquence de la grippe en général (c’est le prior), multipliez par à quel point la fièvre est typique chez les grippés, et par à quel point la toux l’est chez eux. Faites de même pour d’autres maladies et choisissez le plus grand produit. Le modèle est « naïf » parce qu’il multiplie les symptômes comme si, au sein de chaque maladie, ils étaient indépendants les uns des autres. Dans les vraies données, ils ne le sont presque jamais.
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, car pour décider il suffit que la bonne espèce obtienne le plus grand produit
Non : sur les pétales, le modèle reconnaît 93,3 % des fleurs de test, 3 erreurs sur 45. Ce que l’hypothèse fausse gâche, ce sont les pourcentages. Dans la leçon 2.4, le Bayes naïf sur 171 biopsies de validation déclarait en moyenne 98,3 % de certitude et avait raison à 88,3 %.
À vous d’essayer
- Commencez par les sépales. Comment sont placées les ellipses des espèces, et où est la sonde quand le modèle hésite ?
- Passez aux pétales. Chez quelle espèce les mesures sont-elles le plus corrélées, et combien le modèle a-t-il juste en validation ?
- Allez aux tumeurs. Comparez le rayon seul au trio rayon, périmètre, aire. Que devient la certitude, et que devient l’exactitude ?
- Avec les 10 mesures, comptez combien de tumeurs de calibration reçoivent une certitude supérieure à 99 %.
Une fois vérifié dans le lab, mettons des mots sur ce que vous voyez.
L’idée en termes simples
Pour chaque espèce, le Bayes naïf ne garde que deux nombres par mesure : la moyenne et la dispersion (variance). Il en tire une courbe en cloche : à quel point une longueur de pétale donnée est typique pour setosa, pour versicolor, pour virginica. Une nouvelle fleur reçoit un produit par espèce : prior × densité de la longueur × densité de la largeur. Le plus grand gagne. Si l’on divise chaque produit par la somme des trois, on obtient les probabilités des espèces, le postérieur.
L’indépendance est une hypothèse sur la forme : les ellipses des espèces sont alignées sur les axes, pas penchées. Sur les pétales c’est faux, chez versicolor r = 0,80. Et pourtant le modèle a raison à 97,1 % en validation et à 93,3 % au test. Une décision n’a pas besoin de produits exacts, seulement que la bonne espèce ait le plus grand. Sur les pétales, les espèces sont assez séparées pour que même des ellipses mal dessinées pointent en général dans la bonne direction.
Les pourcentages s’en sortent moins bien. Pour les tumeurs du sein, le rayon, le périmètre et l’aire sont presque une seule mesure : le rayon est corrélé au périmètre avec r = 0,998 et à l’aire avec r = 0,987. Le Bayes naïf les multiplie comme trois preuves indépendantes, donc il compte trois fois la même preuve. Sur les 132 biopsies de calibration de la leçon 2.4, le rayon seul donne une exactitude de 88,6 % et une certitude moyenne déclarée de 89,2 %. Rayon, périmètre et aire ensemble : exactitude 86,4 %, certitude 96,5 %. Trois copies font donc monter la certitude, pas l’exactitude. Les 10 mesures apportent aussi une information nouvelle, comme la texture et la régularité : l’exactitude monte à 93,9 %, mais la certitude (98,5 %) la dépasse toujours.
Jak to policzono
- Iris : Iris (Fisher, 1936 ; UCI, licence CC BY 4.0), 150 fleurs, 3 espèces. Découpage stratifié : 105 fleurs pour apprendre, 45 pour le test. Validation : validation croisée en 5 parties à l’intérieur des 105 fleurs.
- Tumeurs : Breast Cancer Wisconsin (Diagnostic) (Wolberg et al., 1993 ; UCI, licence CC BY 4.0), 569 biopsies, 10 mesures « mean ». Découpage et noms comme dans la leçon 2.4 : 266 biopsies pour apprendre, 132 de calibration (le labo y compare les ensembles de mesures) et 171 de validation, seulement pour regarder.
- Modèle : Bayes naïf avec la loi normale, comme
GaussianNBde scikit-learn ; les chiffres du lab lui correspondent.
Pourquoi ça marche
Un classifieur ne se trompe que lorsqu’une mauvaise espèce obtient le plus grand produit. Domingos et Pazzani (1997) ont montré que, selon ce critère, le Bayes naïf peut être le meilleur possible même avec des variables fortement dépendantes : ce qui compte, c’est l’ordre des produits, pas leur valeur. L’hypothèse a tout de même un prix. Un modèle qui tient compte de la corrélation (ellipses penchées, ce qu’on appelle l’analyse discriminante quadratique, QDA) a raison sur les pétales en moyenne à 97,1 % sur 20 autres découpages, contre 95,8 % pour le Bayes naïf. Il est meilleur dans 11 découpages et moins bon dans aucun. Sur les sépales, le Bayes naïf fait en moyenne mieux : 80,0 % contre 78,8 %. On l’explique d’habitude par le fait qu’il a moins de nombres à estimer à partir de 105 fleurs.
L’excès de certitude n’est pas un caprice d’un découpage. Sur 20 autres découpages des tumeurs, le rayon seul donne un écart entre certitude et exactitude de −3,6 à 2,2 points. Rayon, périmètre et aire ensemble donnent à chaque fois plus de certitude que d’exactitude : de 4,9 à 11,5 points. Les 10 mesures : de 4,7 à 10,8 points.
Une erreur fréquente
Vrai ou faux : « une hypothèse fausse, c’est un modèle inutile ». Faux. Sur les pétales, l’hypothèse d’indépendance est clairement fausse, et le modèle reconnaît 93,3 % des fleurs de test. Dans le code ci-dessous, il obtient 0,960 en validation croisée, presque autant que le modèle avec corrélations (0,973). Ce que l’hypothèse fausse gâche, ce sont les pourcentages : avec les 10 mesures de la tumeur, le modèle déclare 0,990 et a raison à 0,906.
La conclusion pratique : faites confiance aux décisions du Bayes naïf autant que la validation le montre. Ne faites pas confiance à ses pourcentages sans les calibrer sur des données séparées (leçon 2.4).
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
- Le Bayes naïf multiplie le prior et les densités des variables prises une à une, comme si, au sein d’une classe, elles étaient indépendantes.
- Une hypothèse fausse ne ruine pas les décisions : sur les pétales d’iris (r = 0,80), le modèle reconnaît 93,3 % des fleurs de test.
- Elle gâche en revanche les pourcentages : des variables corrélées comptent plusieurs fois la même preuve, donc sur 171 biopsies de validation le modèle déclare 98,3 % pour 88,3 % d’exactitude.
- Faites confiance aux décisions autant que la validation le montre ; aux pourcentages, seulement après calibration sur des données séparées.
Pour aller plus loin : formule, code, pratique
Les maths
Le théorème de Bayes avec l’hypothèse d’indépendance : P(c | x) ∝ P(c) · ∏ⱼ p(xⱼ | c), et avec la loi normale p(xⱼ | c) = N(xⱼ; μ_cj, σ²_cj). Le modèle choisit la classe au plus grand log P(c) + Σⱼ log p(xⱼ | c).
Copies d’une variable : si la même information entre k fois, sa contribution à la différence des logarithmes entre classes est multipliée par k. L’ordre des scores reste proche, mais les écarts grandissent, donc le postérieur file vers 0 ou 1.
En code (Python)
La même expérience dans scikit-learn : le Bayes naïf et un modèle avec corrélations (QDA) sur deux paires de mesures d’iris en validation croisée, puis certitude et exactitude sur les tumeurs avec 1, 3 et 10 mesures.
from sklearn.datasets import load_iris, load_breast_cancer
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis
iris = load_iris(as_frame=True)
for part in ["sepal", "petal"]:
cols = [f"{part} length (cm)", f"{part} width (cm)"]
r = iris.data[iris.target == 1][cols].corr().iloc[0, 1] # corrélation au sein de versicolor
nb = cross_val_score(GaussianNB(), iris.data[cols], iris.target, cv=10).mean()
qda = cross_val_score(QuadraticDiscriminantAnalysis(), iris.data[cols], iris.target, cv=10).mean()
print(f"{part}s: versicolor r = {r:.2f}; 10-fold CV accuracy: naive Bayes {nb:.3f}, with correlations (QDA) {qda:.3f}")
bc = load_breast_cancer(as_frame=True)
X, y = bc.data.iloc[:, :10], 1 - bc.target
X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, stratify=y, random_state=0)
for cols in [["mean radius"], ["mean radius", "mean perimeter", "mean area"], list(X.columns)]:
p = GaussianNB().fit(X_tr[cols], y_tr).predict_proba(X_te[cols])
acc, conf = (p.argmax(1) == y_te).mean(), p.max(1).mean()
print(f"{len(cols):2d} of 10 measurements: accuracy {acc:.3f}, mean declared confidence {conf:.3f}, over 99% sure: {(p.max(1) > 0.99).sum()} of {len(y_te)}")
Sortie
sepals: versicolor r = 0.53; 10-fold CV accuracy: naive Bayes 0.793, with correlations (QDA) 0.773
petals: versicolor r = 0.79; 10-fold CV accuracy: naive Bayes 0.960, with correlations (QDA) 0.973
1 of 10 measurements: accuracy 0.883, mean declared confidence 0.884, over 99% sure: 26 of 171
3 of 10 measurements: accuracy 0.895, mean declared confidence 0.969, over 99% sure: 127 of 171
10 of 10 measurements: accuracy 0.906, mean declared confidence 0.990, over 99% sure: 150 of 171
Les découpages diffèrent de ceux du lab, et la corrélation est calculée ici sur les 50 fleurs versicolor (0,79), donc les chiffres diffèrent un peu. Le tableau est le même : sur les pétales, le Bayes naïf obtient 0,960, presque comme la QDA (0,973), et sur les sépales même davantage (0,793 contre 0,773). Sur les tumeurs, la certitude monte de 0,884 à 0,990, l’exactitude seulement de 0,883 à 0,906.
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 :
GaussianNBpour des nombres,MultinomialNBetComplementNBpour des comptages de mots dans du texte,BernoulliNBpour des variables oui/non. Le modèle apprend en un seul passage sur les données, c’est donc un point de référence rapide, surtout pour le texte (filtres anti-spam). - Quand les pourcentages comptent, calibrez :
CalibratedClassifierCV(GaussianNB(), method="sigmoid")ajuste la calibration en validation croisée. - Parmi des variables presque identiques (rayon, périmètre, aire), gardez-en une ou fusionnez-les. Le Bayes naïf comptera chaque copie comme une preuve à part.
var_smoothingajoute un peu à chaque variance, pour qu’une mesure qui varie à peine dans une classe ne donne pas une densité proche de zéro pour chaque nouvel exemple.
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 :