Formation ML / Statistiques bayésiennes

Inférence bayésienne

Intermédiaire 45 min 13 sections

Le paramètre cesse d'être un nombre pour devenir une distribution, mise à jour à chaque nouvelle donnée.

Objectifs d'apprentissage

  • Comprendre le trio prior, vraisemblance, posterior
  • Calculer un posterior exact avec la conjugaison bêta-binomiale
  • Mettre à jour une croyance séquentiellement quand les données arrivent
  • Distinguer intervalle de crédibilité et intervalle de confiance
  • Prendre une décision A/B en raisonnant en probabilités

Prérequis

Notions de base en probabilités (module Naive Bayes recommandé)

Le code de cette page s'exécute dans votre navigateur. Le premier lancement télécharge Python et ses bibliothèques.

Théorie

Prior, vraisemblance, posterior: la machine à apprendre

Dans le module Naive Bayes, le théorème de Bayes servait à classifier une observation. L'inférence bayésienne l'utilise pour quelque chose de plus général: mettre à jour une croyance sur un paramètre inconnu $\theta$ (un taux de conversion, un coefficient, une moyenne...) à mesure que les données arrivent.

Le théorème de Bayes version inférence:

$$P(\theta \mid \text{données}) = \frac{P(\text{données} \mid \theta) \cdot P(\theta)}{P(\text{données})}$$

Chaque terme à un nom et un rôle:

  • $P(\theta)$ = prior: ce que l'on croit sur $\theta$ AVANT de voir les données (connaissance métier, études passées, ou ignorance assumée)
  • $P(\text{données} \mid \theta)$ = vraisemblance: à quel point les données observées sont plausibles pour chaque valeur possible de $\theta$
  • $P(\theta \mid \text{données})$ = posterior: la croyance mise à jour, le résultat de l'inférence
  • $P(\text{données})$ = evidence: une constante de normalisation (elle ne dépend pas de $\theta$)

La différence fondamentale avec l'approche classique:

ApprocheLe paramètre $\theta$ est...Résultat de l'estimation
Fréquentiste (modules 1 à 16)une valeur fixe inconnueun nombre (estimation ponctuelle)
Bayésienneune variable aléatoireune distribution entière

Au lieu de dire "le taux de conversion est 8.5%", on dira "le taux de conversion suit cette distribution, centrée sur 8.5%, avec 95% de chances d'être entre 6% et 12%". Toute l'incertitude est conservée et exploitable pour la décision.

Théorie

Schéma: le cycle de mise à jour bayésienne

Le cycle prior, données, posterior:

flowchart LR PRIOR["Prior P(theta)
croyance initiale"] LIKE["Vraisemblance
P(données | theta)"] BAYES["Théorème
de Bayes"] POST["Posterior
P(theta | données)"] PRIOR --> BAYES LIKE --> BAYES BAYES --> POST POST -.->|"nouvelles données ?
le posterior devient le prior"| PRIOR class PRIOR ml-node-secondary class LIKE ml-node-success class BAYES ml-node-main class POST ml-node-accent

Exemple concret: le taux de conversion d'une page web

On veut estimer $p$, la probabilité qu'un visiteur convertisse. La loi Beta est parfaite pour représenter une croyance sur une proportion (elle vit entre 0 et 1), et la loi Binomiale décrit le nombre de succès observés.

On choisit un prior $\textcolor{#9B7AC4}{\text{Beta}(a=2, b=2)}$ (léger doute symétrique autour de 50%), puis on observe $\textcolor{#3498db}{k = 3}$ conversions sur $\textcolor{#3498db}{n = 10}$ visiteurs.

Magie de la conjugaison (démontrée dans une section avancée plus bas): le posterior est encore une Beta, avec des paramètres simplement additionnes:

$$\text{Posterior} = \text{Beta}(\textcolor{#9B7AC4}{a} + \textcolor{#3498db}{k},\; \textcolor{#9B7AC4}{b} + \textcolor{#3498db}{n - k}) = \text{Beta}(\textcolor{#9B7AC4}{2} + \textcolor{#3498db}{3},\; \textcolor{#9B7AC4}{2} + \textcolor{#3498db}{7}) = \textcolor{#27ae60}{\text{Beta}(5, 9)}$$

La moyenne du posterior vaut:

$$\mathbb{E}[p] = \frac{a + k}{a + b + n} = \frac{5}{14} \approx \textcolor{#27ae60}{0.357}$$

Légende des couleurs:

  • $\textcolor{#9B7AC4}{Violet}$ : paramètres du prior (croyance initiale)
  • $\textcolor{#3498db}{Bleu}$ : données observées (3 succès, 7 échecs)
  • $\textcolor{#27ae60}{Vert}$ : posterior (croyance mise à jour)

Interprétation: les données brutes suggèrent 30% (3/10), le prior tirait vers 50%, le posterior fait le compromis à 35.7%. Plus il y aura de données, plus le poids du prior deviendra négligeable: avec 1000 visiteurs, prior Beta(2,2) ou Beta(20,20) donneraient quasiment le même posterior.

Avancé Exercice manuel: À vous de calculer!

Calculez un posterior à la main

Pas besoin d'ordinateur, juste des additions!

Contexte: vous testez un nouveau bouton d'achat. Votre expérience passée sur des boutons similaires vous fait partir d'un prior $\text{Beta}(a=3, b=17)$ (croyance: taux autour de 15%).

Vous observez 40 visiteurs dont 9 conversions.

Question 1: quels sont les paramètres du posterior $\text{Beta}(a', b')$ ?

Question 2: quelle est la moyenne du posterior $\mathbb{E}[p] = \frac{a'}{a' + b'}$ ?

Question 3: comparez trois estimations du taux:

  • la moyenne du prior: $\frac{3}{20}$
  • la fréquence observée: $\frac{9}{40}$
  • la moyenne du posterior

Où se situe le posterior par rapport aux deux autres ? Pourquoi ?

Question 4 (bonus): si vous aviez utilise le prior "je ne sais rien" $\text{Beta}(1, 1)$ (uniforme entre 0 et 1), quelle serait la moyenne du posterior ?

Avancé Solution de l'exercice manuel

Solution détaillée

Question 1: paramètres du posterior

La règle de conjugaison: on ajoute les succès à $a$ et les échecs à $b$.

$$a' = a + k = 3 + 9 = 12$$

$$b' = b + (n - k) = 17 + 31 = 48$$

Le posterior est $\text{Beta}(12, 48)$.

Question 2: moyenne du posterior

$$\mathbb{E}[p] = \frac{12}{12 + 48} = \frac{12}{60} = 0.20$$

Question 3: comparaison

EstimationValeur
Moyenne du prior$3/20 = 0.15$
Fréquence observée$9/40 = 0.225$
Moyenne du posterior$12/60 = 0.20$

Le posterior est entre le prior et les données: c'est une moyenne pondérée. Le prior "pèse" $a + b = 20$ observations virtuelles, les données pèsent $n = 40$ observations réelles. Les données pèsent deux fois plus lourd, donc le posterior est deux fois plus proche de la fréquence observée que du prior:

$$\mathbb{E}[p] = \frac{20}{60} \times 0.15 + \frac{40}{60} \times 0.225 = 0.05 + 0.15 = 0.20$$

Question 4: avec le prior uniforme Beta(1, 1)

$$\text{Posterior} = \text{Beta}(1 + 9, 1 + 31) = \text{Beta}(10, 32)$$

$$\mathbb{E}[p] = \frac{10}{42} \approx 0.238$$

Avec un prior quasi neutre, le posterior colle presque à la fréquence observée (0.225). C'est la leçon clé: le prior compte quand les données sont rares, il s'efface quand elles abondent.

Code

Explorer les données

print("=" * 70)
print("       EXPLORATION DES DONNEES DU TEST A/B")
print("=" * 70)

print("""
Une equipe web teste deux variantes d'une page (A = actuelle, B = nouvelle).
Chaque ligne est un visiteur: sa variante et s'il a converti (1) ou non (0).
Objectif du module: estimer les taux de conversion AVEC leur incertitude,
puis decider si B est vraiment meilleure que A.
""")

display(df.head(10), title="Apercu du dataset A/B")

print("\n" + "=" * 70)
print("1. COMPTAGES PAR VARIANTE")
print("=" * 70)

resume = df.groupby("variant")["converted"].agg(["count", "sum", "mean"])
resume.columns = ["visiteurs", "conversions", "taux_observe"]
display(resume.round(4), title="Resume par variante")

for variant in ["A", "B"]:
    sub = df[df["variant"] == variant]
    n = len(sub)
    k = int(sub["converted"].sum())
    print(f"  Variante {variant}: {k:3d} conversions sur {n} visiteurs "
          f"→ taux observe = {k / n:.2%}")

print("\n" + "=" * 70)
print("2. LA QUESTION QUE TOUT LE MONDE SE POSE")
print("=" * 70)
print("""
B affiche un meilleur taux que A. Mais avec quelques centaines de
visiteurs seulement, est-ce un vrai effet ou de la chance ?

L'approche bayesienne va repondre directement a la vraie question:
"Quelle est la probabilite que B soit meilleure que A ?"
""")

# Visualisation simple des comptages
fig, ax = plt.subplots(figsize=(8, 5))
resume["taux_observe"].plot(kind="bar", ax=ax, color=["#9B7AC4", "#F7E64D"],
                            edgecolor="#3A3A3A")
ax.set_title("Taux de conversion observes (estimations ponctuelles)")
ax.set_ylabel("Taux de conversion")
ax.set_xlabel("Variante")
ax.tick_params(axis="x", rotation=0)
for i, v in enumerate(resume["taux_observe"]):
    ax.text(i, v + 0.003, f"{v:.2%}", ha="center", fontweight="bold")
plt.tight_layout()
plt.show()

print("Ces barres cachent l'essentiel: l'INCERTITUDE autour de chaque taux.")
print("La suite du module va la rendre visible.")
Ctrl+Entrée

Cliquez sur « Exécuter » pour voir le résultat.

Contenu verrouillé
5 / 13

Continuez votre apprentissage

Vous avez exploré 5 sections de ce module. Connectez-vous pour débloquer le reste du cours, incluant les exercices pratiques et les solutions.

Ctrl ou Cmd plus Entrée exécute le code. Tab indente ; Échap puis Tab quitte l'éditeur.