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.
Prérequis
Concepts Couverts
∑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
Pourquoi Apprendre Naïve Bayes ?
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
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
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.
Lissage de Laplace : Éviter les Probabilités Nulles
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 ?
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.
Caractéristiques continues → GaussianNB
Comptage de mots / caractéristiques TF-IDF → MultinomialNB (nécessite des valeurs non négatives)
Caractéristiques binaires (mot présent/absent) → BernoulliNB
Classification de texte déséquilibrée → ComplementNB
Types mixtes → utiliser ColumnTransformer + différent NB par type de colonne
Classification de Texte avec Naïve Bayes
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
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.