ML Learning Hub
Appliquédébutant

Classifieurs Naïfs Bayésiens

Théorème de Bayes + une hypothèse audacieuse = un classifieur étonnamment puissant

Théorème de Bayes, hypothèse d'indépendance conditionnelle, variantes Gaussian/Multinomial/Complement, lissage de Laplace et classification de texte.

30 min
7 diagrammes
7 Concepts Couverts

Prérequis

Probability & Statistics

Concepts Couverts

Bayes TheoremMAP DecisionLaplace SmoothingGaussianNBMultinomialNBComplementNBCalibration

Formules Clés

Théorème de Bayes

Posterior = Vraisemblance × A priori / Evidence

Hypothèse Naïve

Les caractéristiques sont conditionnellement indépendantes étant donné la classe — la partie 'naïve'

Décision MAP

Maximum a posteriori — supprimer P(x) puisqu'il est identique pour toutes les classes

Vraisemblance Gaussienne

NB Gaussien suppose que chaque caractéristique est normalement distribuée dans chaque classe

Simulation Interactive

Loading visualization…
🎯

Pourquoi Apprendre Naïve Bayes ?

motivation

Naïve Bayes classifie les emails de spam mieux que beaucoup de modèles complexes, s'exécute en microsecondes, nécessite presque aucune donnée d'entraînement, gère gracieusement les caractéristiques manquantes et produit des probabilités calibrées. Le filtre anti-spam original de Gmail utilisait Naïve Bayes. C'est la référence pour les problèmes de classification de texte. Le comprendre donne une intuition profonde sur les classificateurs probabilistes et pourquoi une hypothèse « naïve » (indépendance conditionnelle) peut quand même produire des modèles utiles en pratique.

Malgré l'hypothèse d'indépendance 'naïve' presque toujours fausse en pratique, Naïve Bayes atteint systématiquement une précision de classification proche de l'optimal dans les tâches de classification de texte et de documents.

💡

L'Intuition Probabiliste

intuition

Supposez que vous voulez classer un email comme Spam ou Légitime. Vous avez vu 1000 emails : 300 étaient du spam. Le mot 'Viagra' apparaît dans 250 des 300 emails spam et seulement 1 des 700 emails légitimes. Le mot 'réunion' apparaît dans 5 spam et 400 légitimes. Pour un nouvel email contenant les deux mots, Naïve Bayes multiplie : P(spam) × P(Viagra|spam) × P(réunion|spam). Ce produit est le posterior non normalisé — comparez-le à P(légitime) × P(Viagra|légitime) × P(réunion|légitime). Le plus grand l'emporte. L'hypothèse 'naïve' rend cette multiplication valide.

Dérivation de la Règle de Décision

math

Par le théorème de Bayes : P(C|x) ∝ P(x|C)P(C). L'hypothèse naïve factorise P(x|C) = ∏ P(xⱼ|C). Puisque P(x) est constant entre les classes, on n'a besoin que du numérateur. En prenant les logs (pour la stabilité numérique — les produits de petites probabilités dépassent) : log P(C|x) = log P(C) + Σⱼ log P(xⱼ|C). Pour NB Gaussien, P(xⱼ|C) est une gaussienne avec moyenne et variance estimées par classe. Pour NB Multinomial (texte), P(xⱼ|C) est la fréquence lissée du mot dans la classe C.

Règle de décision MAP dans l'espace logarithmique
🔬

Lissage de Laplace : Éviter les Probabilités Nulles

deepdive

Si un mot n'apparaît jamais dans les emails spam d'entraînement, P(mot|spam)=0 et le produit entier devient 0 — un seul mot non vu fait ignorer toutes les autres preuves. Le lissage de Laplace ajoute α (habituellement 1) à tous les comptes de mots : P(xⱼ|C) = (compte(xⱼ,C) + α) / (compte(C) + α × |V|) où |V| est la taille du vocabulaire. Cela garantit qu'aucune probabilité n'est exactement 0. α plus grand = plus de lissage = plus proche d'une distribution uniforme.

Le lissage de Laplace est une forme de régularisation L1 dans le simplexe de probabilité. Il empêche le sur-apprentissage sur les mots rares et est crucial pour NB Multinomial sur les données textuelles.

⚖️

Quelle Variante de Naïve Bayes Utiliser ?

comparison

GaussianNB : caractéristiques continues supposées gaussiennes par classe. Bon pour les données de capteurs, les mesures médicales. MultinomialNB : caractéristiques de comptage entier (comptes de mots, TF-IDF×N). Standard pour la classification de documents. BernoulliNB : caractéristiques binaires (présence/absence de mots). Bon pour les textes courts. ComplementNB : traite le biais de MultinomialNB sur les données déséquilibrées — souvent le meilleur pour la classification de texte.

1

Caractéristiques continues → GaussianNB

2

Comptage de mots / caractéristiques TF-IDF → MultinomialNB (nécessite des valeurs non négatives)

3

Caractéristiques binaires (mot présent/absent) → BernoulliNB

4

Classification de texte déséquilibrée → ComplementNB

5

Types mixtes → utiliser ColumnTransformer + différent NB par type de colonne

</>

Classification de Texte avec Naïve Bayes

code
python54 lines
from sklearn.naive_bayes import MultinomialNB, ComplementNB, GaussianNB
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.calibration import CalibratedClassifierCV
import numpy as np

class="tok-comment"># ── Données texte dclass="tok-str">'exemple ────────────────────────────────────────────
X_texte = [
    "acheter des pilules pas chères maintenant",  "devenir riche rapidement",
    "argent gratuit cliquer ici",                 "réunion à 15h demain",
    "rapport trimestriel en pièce jointe",        "déjeuner d'équipe vendrediclass="tok-str">",
    "gagner un prix inscrivez-vous maintenantclass="tok-str">",   "offre limitée agissez viteclass="tok-str">",
    "opportunité dclass="tok-str">'investissement",               "délai projet semaine prochaine",
    "révision budgétaire planifiée",              "veuillez examiner le document",
] * class="tok-num">20   class="tok-comment"># class="tok-num">240 exemples
y = np.array(([class="tok-num">1, class="tok-num">1, class="tok-num">1, class="tok-num">0, class="tok-num">0, class="tok-num">0, class="tok-num">1, class="tok-num">1, class="tok-num">1, class="tok-num">0, class="tok-num">0, class="tok-num">0] * class="tok-num">20))  class="tok-comment"># class="tok-num">1=spam, class="tok-num">0=ham
X_train, X_test, y_train, y_test = train_test_split(
    X_texte, y, test_size=class="tok-num">0.2, random_state=class="tok-num">42)

class="tok-comment"># ── Classification de texte (détection de spam) ───────────────────
pipeline = Pipeline([
    ('tfidfclass="tok-str">', TfidfVectorizer(
        ngram_range=(class="tok-num">1,class="tok-num">2),       class="tok-comment"># unigrammes + bigrammes
        max_features=50_000,
        sublinear_tf=True,       class="tok-comment"># log(class="tok-num">1+tf)
        min_df=class="tok-num">3,
    )),
    ('clfclass="tok-str">', ComplementNB(alpha=class="tok-num">0.1)),  class="tok-comment"># meilleur pour le texte
])

scores = cross_val_score(pipeline, X_texte, y, cv=class="tok-num">5, scoring='f1_macroclass="tok-str">')
print(f"F1 : {scores.mean():.3f} ± {scores.std():.3f}")

class="tok-comment"># ── Probabilités calibrées ─────────────────────────────────────────
class="tok-comment"># Les probabilités NB sont souvent mal calibrées (trop confiantes)
class="tok-comment"># Utiliser la calibration isotonique pour de meilleures estimations
pipeline_cal = CalibratedClassifierCV(pipeline, cv=class="tok-num">5, method='isotonicclass="tok-str">')
pipeline_cal.fit(X_train, y_train)
probas = pipeline_cal.predict_proba(X_test)

class="tok-comment"># ── Caractéristiques continues : GaussianNB ────────────────────────
from sklearn.preprocessing import StandardScaler
gnb = Pipeline([
    ('echelleclass="tok-str">', StandardScaler()),
    ('clfclass="tok-str">',     GaussianNB(var_smoothing=class="tok-num">1e-9)),
])
gnb.fit(X_train, y_train)
print(f"Précision GaussianNB : {gnb.score(X_test, y_test):.3f}")

class="tok-comment"># ── Inspecter les paramètres appris ────────────────────────────────
nb = gnb.named_steps['clf']
print(class="tok-str">"A priori des classes :", nb.class_prior_)
print(class="tok-str">"Moyennes des caractéristiques par classe :", nb.theta_)
⚠️

Pièges de Naïve Bayes

pitfall

L'hypothèse d'indépendance signifie que les caractéristiques corrélées sont comptées en double. Si 'Viagra' et 'pilule' co-occurrent toujours dans le spam, leurs preuves combinées sont comptées deux fois, conduisant à des posteriors trop confiants. C'est pourquoi les probabilités NB sont généralement mal calibrées même quand les classifications sont correctes — toujours utiliser CalibratedClassifierCV pour les sorties de probabilité. Aussi : MultinomialNB nécessite des caractéristiques non négatives.

Naïve Bayes est une excellente référence et souvent difficile à battre sur les petits ensembles de données textuelles. Si elle score 85% et votre modèle complexe 87%, demandez : le gain de 2% vaut-il 10× la complexité et le temps d'entraînement ?

?Vérification des Connaissances

La progression est sauvegardée dans votre navigateur — aucun compte requis.

Besoin d'un ingénieur IA ou data scientist ?

Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.