ML Atlas

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.
De la leçon 5.3 : Gradient boosting : des arbres qui se corrigent Qu’apprend le deuxième arbre dans le gradient boosting ?

Voir la réponse

Bonne réponse : Les résidus du premier arbre, c’est-à-dire de combien il se trompe encore

Chaque arbre suivant reçoit les résidus de l’ensemble précédent et ajoute une correction multipliée par le taux d’apprentissage. Les échantillons aléatoires et les arbres indépendants, c’est la forêt aléatoire.

De la leçon 5.2 : Ensembles : pourquoi une forêt bat un seul arbre Qu’est-ce qu’un échantillon bootstrap ?

Voir la réponse

Bonne réponse : Des lignes tirées au hasard dans le jeu d’entraînement avec remise

Le tirage avec remise donne à chaque arbre un jeu de données légèrement différent, ce qui fait diverger les arbres de façon utile.

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.

Prédisez, puis vérifiez Le Bayes naïf doit reconnaître l’espèce d’un iris d’après la longueur et la largeur de son pétale. Il suppose qu’au sein d’une espèce ces deux mesures sont indépendantes. Chez les iris versicolor, elles sont pourtant corrélées avec r = 0,80 : un pétale plus long est en général plus large. L’hypothèse doit-elle être vraie pour que le modèle reconnaisse bien les espèces ?
Quel est votre degré de certitude ?

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 GaussianNB de 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.

1. Que multiplie le Bayes naïf pour juger si une fleur est versicolor ?
Voir la réponse

Bonne réponse : Le prior de versicolor et la densité de chaque mesure chez versicolor, à part

Prior × densité de la longueur × densité de la largeur, chacune calculée seulement à partir de la moyenne et de la variance de cette mesure chez versicolor. L’espèce au plus grand produit gagne.

2. Chez versicolor, la longueur et la largeur du pétale sont corrélées avec r = 0,80, et le modèle reconnaît 93,3 % des fleurs de test. Qu’en déduire ?
Voir la réponse

Bonne réponse : Pour décider, il suffit que la bonne espèce obtienne le plus grand produit

L’hypothèse fausse change les valeurs des produits, mais rarement leur ordre quand les espèces sont éloignées. Le modèle avec corrélations n’a raison en moyenne qu’un peu plus souvent.

3. Vrai ou faux : « une hypothèse fausse, c’est un modèle inutile ».
Voir la réponse

Bonne réponse : Faux, car l’exactitude peut être haute même si l’hypothèse gâche les pourcentages

Sur les pétales, le modèle a raison à 93,3 % malgré r = 0,80. Il ment en revanche sur les pourcentages : avec 10 mesures, sur les 171 biopsies de validation de la leçon 2.4, il déclare 98,3 % et a raison à 88,3 %.

À 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.

Pour les praticiens
  • Dans scikit-learn : GaussianNB pour des nombres, MultinomialNB et ComplementNB pour des comptages de mots dans du texte, BernoulliNB pour 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_smoothing ajoute 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.

Aller plus loin dans l’Atlas

Articles de l’encyclopédie sur les notions de cette leçon :