LangueFR
Français
English
Retour au sommaire du cours

Probabilités, inférence bayésienne et quantification d'incertitude

Le module 9 traite l'inférence fréquentiste : tests, intervalles de confiance, décisions binaires. Ce module prend l'autre point de vue — traiter les paramètres eux-mêmes comme des variables aléatoires — et aboutit à la question qui manque à la plupart des modèles de machine learning : à quel point cette prédiction est-elle sûre, et pourquoi ? Pour un ingénieur qui doit dimensionner une marge de sécurité, c'est souvent plus important que la précision moyenne.

1. Les lois usuelles comme briques de modélisation

Choisir une loi, c'est faire une hypothèse sur le mécanisme qui a engendré les données. L'essentiel du travail de modélisation probabiliste tient dans ce choix, et il se raisonne à partir du phénomène physique, pas à partir de l'allure de l'histogramme.

quelle loi pour quel mécanisme
Bernoulli / Binomiale   succès-échec ; nombre de succès sur n essais indépendants
Poisson                 comptage d'événements RARES et INDÉPENDANTS dans un
                        intervalle fixe (désintégrations, pannes, arrivées).
                        Propriété : variance = espérance.
Binomiale négative      comptage SURDISPERSÉ (variance > espérance) : le cas réel
                        le plus fréquent, quand le taux varie d'une unité à l'autre.
Exponentielle           temps d'attente entre événements poissoniens. SANS MÉMOIRE :
                        avoir attendu 10 min ne change pas l'attente restante.
Weibull                 durée de vie à taux de défaillance variable : LA loi de la
                        fiabilité (k < 1 mortalité infantile, k > 1 usure) — module 17
Gamma                   somme d'exponentielles ; temps de service ; a priori de précision
Beta                    une proportion inconnue dans [0,1] : l'a priori naturel d'un taux
Normale                 SOMME de nombreux effets indépendants (TCL, module 9)
Log-normale             PRODUIT de nombreux effets : tailles, revenus, durées, prix
Student                 normale à queues épaisses : régression robuste aux aberrants
Dirichlet               une distribution sur des proportions qui somment à 1

Le réflexe qui évite les erreurs

Une variable strictement positive et très asymétrique n'est presque jamais normale : elle est souvent log-normale ou gamma. Modéliser un temps de réparation par une loi normale attribue une probabilité non nulle à des durées négatives, ce qui se voit immédiatement dans les prédictions absurdes. De même, un comptage modélisé par une loi de Poisson alors que les données sont surdispersées produit des intervalles beaucoup trop étroits, donc une fausse confiance — et c'est le cas dès que le taux d'événements varie entre individus, ce qui est la règle plutôt que l'exception.

2. Vraisemblance, MLE, MAP

La vraisemblance est la probabilité des données observées, vue comme une fonction du paramètre : \(\mathcal{L}(\theta) = p(y \mid \theta)\). Attention au renversement de perspective — ce n'est pas une densité de probabilité en \(\theta\), c'est la même formule lue « à l'envers » : les données sont fixées, le paramètre varie.

L'estimation du maximum de vraisemblance consiste à prendre le \(\theta\) qui rend les données observées les plus probables :

\[ \hat\theta_{\text{MLE}} = \arg\max_\theta \sum_{i=1}^{n} \log p(y_i \mid \theta) \]

On travaille sur le logarithme pour deux raisons : il transforme un produit en somme (plus stable numériquement, un produit de milliers de probabilités valant zéro en virgule flottante), et il ne change pas l'argmax puisque le logarithme est croissant.

toutes les pertes du cours sont des log-vraisemblances
Bruit gaussien homoscédastique   → -log p ∝ (y - ŷ)²        = perte quadratique
Bernoulli                        → -log p = entropie croisée
Poisson                          → -log p = perte de Poisson (comptages)
Student                          → -log p ≈ perte robuste (queues épaisses)
Laplace                          → -log p ∝ |y - ŷ|         = MAE

Autrement dit : choisir une perte, c'est choisir un modèle de bruit. L'expliciter permet de le choisir correctement plutôt que par habitude — si les erreurs de mesure ont des queues épaisses, minimiser un MSE revient à supposer un bruit gaussien qu'on sait faux, et le modèle sera tiré par les aberrants.

En ajoutant un a priori \(p(\theta)\), on obtient l'estimateur du maximum a posteriori :

\[ \hat\theta_{\text{MAP}} = \arg\max_\theta \big[\log p(y\mid\theta) + \log p(\theta)\big] \]
La régularisation est un a priori déguisé. Avec un a priori gaussien \(\theta \sim \mathcal{N}(0,\tau^2)\), le terme \(\log p(\theta)\) vaut \(-\|\theta\|^2/2\tau^2\) : le MAP est la régression ridge, avec \(\lambda = \sigma^2/\tau^2\). Avec un a priori de Laplace (pic en zéro, queues lourdes), on retrouve exactement le lasso. Les modules 8 et 14 présentent la régularisation comme un procédé numérique ; c'est en réalité une déclaration de croyance sur l'ordre de grandeur des coefficients. Ce point de vue dit aussi quand elle est légitime — et pourquoi un \(\lambda\) énorme revient à affirmer une conviction très forte que rien n'a d'effet.

3. Bayes, avec un exemple chiffré

Le MAP ne retient qu'un point. L'approche bayésienne complète conserve toute la distribution :

\[ \underbrace{p(\theta\mid y)}_{\text{a posteriori}} = \frac{\overbrace{p(y\mid\theta)}^{\text{vraisemblance}}\;\overbrace{p(\theta)}^{\text{a priori}}}{\underbrace{p(y)}_{\text{évidence}}} \;\propto\; p(y\mid\theta)\,p(\theta) \]

L'interprétation est opérationnelle : l'a priori encode ce qu'on sait avant de regarder les données, la vraisemblance ce que les données disent, et l'a posteriori combine les deux en pondérant chacun par sa précision. Avec peu de données, l'a priori domine ; avec beaucoup, il s'efface. C'est un mécanisme de régularisation qui s'adapte automatiquement à la quantité d'information disponible.

L'exemple qui rend le théorème concret

Un test de dépistage détecte 99 % des malades (sensibilité) et se trompe dans 1 % des cas chez les sains (faux positifs). La maladie touche 0,1 % de la population. Votre test est positif : quelle est la probabilité que vous soyez malade ?

L'intuition répond « 99 % ». Le calcul répond autrement. Sur 100 000 personnes : 100 sont malades, dont 99 sont détectées ; 99 900 sont saines, dont 999 sont faussement positives. Parmi les 1 098 positifs, 99 sont réellement malades :

\[ P(\text{malade}\mid +) = \frac{0{,}99 \times 0{,}001}{0{,}99 \times 0{,}001 + 0{,}01 \times 0{,}999} = \frac{0{,}00099}{0{,}01098} \approx 9\,\% \]

Neuf pour cent, pas quatre-vingt-dix-neuf. L'a priori — la rareté de la maladie — écrase la qualité du test. C'est exactement le mécanisme qui explique pourquoi un détecteur de fraude à 99 % de précision apparente produit une majorité de fausses alertes quand la fraude est rare (module 8, PR-AUC), et pourquoi la question « quelle proportion de mes alertes sont justes ? » n'a pas la même réponse que « quelle proportion des fraudes est-ce que j'attrape ? ».

4. Conjugaison et A/B test bayésien

Dans quelques cas heureux, l'a posteriori appartient à la même famille que l'a priori : on parle de conjugaison, et le calcul se réduit à une mise à jour de paramètres. Le cas Beta-Binomial est le plus utile :

\[ p \sim \text{Beta}(\alpha,\beta), \quad k \mid p \sim \text{Bin}(n,p) \;\Longrightarrow\; p \mid k \sim \text{Beta}(\alpha + k,\; \beta + n - k) \]

La lecture est intuitive : \(\alpha\) et \(\beta\) se comportent comme des succès et des échecs « virtuels » observés avant l'expérience. Un a priori Beta(1,1) est uniforme — aucune opinion ; un Beta(30,70) affirme qu'on croit le taux proche de 30 %, avec la force de 100 observations.

Python — A/B test bayésien, en dix lignes
import numpy as np
from scipy import stats

# mêmes données qu'au module 9, autre lecture
a_post = stats.beta(1 + 1183, 1 + 20_143 - 1183)      # variante A
b_post = stats.beta(1 + 1279, 1 + 20_089 - 1279)      # variante B

rng = np.random.default_rng(0)
ta, tb = a_post.rvs(200_000, random_state=rng), b_post.rvs(200_000, random_state=rng)

print(f"P(B meilleure que A)         = {(tb > ta).mean():.3f}")      # 0.982
print(f"gain relatif médian          = {np.median((tb - ta) / ta):+.2%}")
print(f"P(gain > 5 %)                = {((tb - ta) / ta > 0.05).mean():.3f}")
print(f"perte espérée si on choisit B = {np.maximum(ta - tb, 0).mean():.5f}")

La dernière ligne est ce qui manque à l'approche fréquentiste : la perte espérée en cas de mauvais choix, exprimée dans l'unité de la métrique. Elle transforme un résultat statistique en critère de décision — on arrête l'expérience quand le risque résiduel devient négligeable devant le coût d'attendre, et non quand une p-value franchit un seuil conventionnel. C'est le pont naturel vers le module 24.

5. MCMC : échantillonner un a posteriori

Dès que le modèle sort des cas conjugués, l'évidence \(p(y) = \int p(y\mid\theta)p(\theta)\,d\theta\) devient une intégrale incalculable : en dimension 50, aucune quadrature ne tient. La solution consiste à renoncer à calculer l'a posteriori pour se contenter d'y échantillonner — ce qui suffit, puisqu'avec des échantillons on obtient moyennes, quantiles, intervalles et probabilités par simple comptage.

Le procédé : construire une chaîne de Markov — une marche aléatoire dont chaque pas ne dépend que du précédent — conçue de sorte que, après une phase de chauffe, la fréquence de passage dans chaque région soit proportionnelle à la densité a posteriori. On laisse la chaîne courir, et les positions visitées sont l'échantillon recherché.

  • Metropolis-Hastings — proposer un déplacement, l'accepter avec une probabilité qui compare les densités du point proposé et du point courant. La beauté du procédé : le rapport élimine la constante de normalisation inconnue, celle-là même qu'on ne sait pas calculer. Mais la marche aléatoire explore mal en grande dimension, où presque toutes les directions mènent vers des zones de faible densité.
  • Gibbs — mettre à jour chaque coordonnée selon sa loi conditionnelle aux autres. Efficace si ces conditionnelles sont connues, très lent si les paramètres sont fortement corrélés.
  • Hamiltonien (HMC) et NUTS — la méthode moderne. On introduit une variable d'impulsion et l'on simule une dynamique physique sur le paysage \(-\log p(\theta\mid y)\), vu comme une énergie potentielle : la « bille » suit les vallées au lieu de tâtonner. Le gradient guide la trajectoire, ce qui permet de parcourir de longues distances avec un taux d'acceptation élevé. NUTS choisit automatiquement la longueur de trajectoire, supprimant le principal réglage manuel. C'est ce qui a rendu l'inférence bayésienne praticable sur des modèles à centaines de paramètres.

Diagnostics : une chaîne qui a convergé, ça se vérifie

  • \(\hat{R}\) (Gelman-Rubin) — compare la variance entre plusieurs chaînes lancées de points différents à la variance à l'intérieur de chacune. Il faut \(\hat R \lt 1{,}01\) ; au-delà, les chaînes n'explorent pas la même région et rien ne doit être interprété.
  • ESS (taille d'échantillon effective) — les tirages MCMC sont autocorrélés : 10 000 tirages peuvent n'en valoir que 200 d'indépendants. Viser au moins quelques centaines par quantité d'intérêt.
  • Divergences (HMC) — signalent une géométrie trop courbée pour le pas d'intégration, typiquement l'« entonnoir » des modèles hiérarchiques. Le remède est presque toujours une reparamétrisation (forme non centrée, section suivante), pas une augmentation du nombre d'itérations.
  • Prédictif a posteriori — simuler des jeux de données depuis le modèle ajusté et les comparer aux vraies données. C'est le test le plus parlant : si les simulations ne ressemblent pas aux observations, le modèle est faux, quelle que soit la qualité de la convergence.

6. Modèles hiérarchiques

C'est l'apport le plus utile du cadre bayésien en pratique. Situation typique : estimer un taux par site, par machine ou par client, alors que certains groupes n'ont que trois observations. Deux extrêmes également mauvais :

  • Aucun regroupement — un modèle indépendant par groupe : un groupe avec 1 succès sur 1 essai affiche 100 %, ce qui est absurde.
  • Regroupement total — une seule estimation globale : on efface toute différence réelle entre groupes.

Le modèle hiérarchique fait le regroupement partiel : les paramètres de groupe sont tirés d'une loi commune dont les paramètres sont eux-mêmes estimés à partir des données.

\[ y_{ij} \sim \mathcal{N}(\theta_j, \sigma^2), \qquad \theta_j \sim \mathcal{N}(\mu, \tau^2), \qquad \mu,\sigma,\tau \sim \text{a priori} \]

Chaque estimation de groupe est automatiquement tirée vers la moyenne globale, d'autant plus fortement que le groupe est petit ou bruité — un groupe de 3 observations sera presque ramené à la moyenne, un groupe de 3 000 gardera sa valeur propre. Le degré de rétrécissement n'est pas choisi à la main : il est appris à travers \(\tau\), qui mesure la dispersion réelle entre groupes. C'est exactement l'effet du lissage du target encoding (module 12), mais dérivé du modèle au lieu d'être un paramètre réglé au jugé.

Python — PyMC, modèle hiérarchique non centré
import pymc as pm, arviz as az

with pm.Model(coords={"groupe": noms_groupes}) as modele:
    mu    = pm.Normal("mu", 0, 5)                 # moyenne globale
    tau   = pm.HalfNormal("tau", 2)               # dispersion ENTRE groupes
    sigma = pm.HalfNormal("sigma", 2)             # bruit INTRA-groupe

    # paramétrage NON CENTRÉ : on tire un z standard puis on le décale.
    # Mathématiquement équivalent, mais la géométrie devient beaucoup plus
    # facile à explorer pour NUTS (évite l'entonnoir et les divergences).
    z     = pm.Normal("z", 0, 1, dims="groupe")
    theta = pm.Deterministic("theta", mu + tau * z, dims="groupe")

    pm.Normal("obs", mu=theta[idx_groupe], sigma=sigma, observed=y)

    trace = pm.sample(2000, tune=1000, chains=4, target_accept=0.9)

print(az.summary(trace, var_names=["mu", "tau"]))   # r_hat, ess_bulk, intervalles
az.plot_forest(trace, var_names=["theta"])          # le rétrécissement, visible

7. Inférence variationnelle

MCMC est asymptotiquement exact mais coûteux : chaque itération évalue la vraisemblance sur toutes les données, ce qui devient impraticable sur des millions d'observations ou sur un réseau de neurones. L'inférence variationnelle transforme l'inférence en optimisation : on cherche, dans une famille paramétrée \(q_\phi\) (souvent des gaussiennes indépendantes), celle qui approche le mieux l'a posteriori au sens de la divergence de Kullback-Leibler. Cela revient à maximiser la borne inférieure de l'évidence :

\[ \text{ELBO}(\phi) = \mathbb{E}_{q_\phi}\big[\log p(y\mid\theta)\big] - \operatorname{KL}\!\big(q_\phi(\theta)\,\|\,p(\theta)\big) \]

Le premier terme demande de bien expliquer les données, le second de ne pas trop s'écarter de l'a priori : on retrouve la structure « ajustement + régularisation » de tout le cours. Avantage : un problème d'optimisation classique, compatible avec les mini-lots et le GPU (module 8). Inconvénient à connaître : une famille de gaussiennes indépendantes sous-estime systématiquement la variance a posteriori et ignore les corrélations entre paramètres. Les intervalles produits sont donc trop étroits — utilisables pour un ordre de grandeur, pas pour une marge de sécurité.

Les outils : PyMC (le plus accessible), NumPyro (sur JAX, très rapide), Stan (la référence historique). Tous partagent la même logique : on écrit le modèle génératif — comment les données auraient pu être produites — et l'inférence est prise en charge.

8. Aléatoire contre épistémique

Distinction fondamentale, et régulièrement ignorée :

deux incertitudes de nature différente
ALÉATOIRE (aleatoric)            ÉPISTÉMIQUE (epistemic)
bruit intrinsèque du phénomène   ignorance du modèle
deux essais identiques donnent   le modèle n'a pas vu de données dans cette région
deux résultats différents
NE diminue PAS avec plus         DIMINUE avec plus de données
de données
ex : dispersion d'une mesure,    ex : prédire hors du domaine d'entraînement,
variabilité d'un matériau        extrapolation, régime jamais observé

La conséquence opérationnelle est directe. Une incertitude aléatoire élevée signifie qu'il faut dimensionner une marge : collecter plus de données n'y changera rien. Une incertitude épistémique élevée signifie que le modèle est hors de son domaine de validité : sa prédiction ne doit pas être utilisée, et c'est un signal pour collecter des données dans cette région (module 13) ou pour se replier sur une procédure de référence (module 24). Confondre les deux conduit soit à sur-dimensionner inutilement, soit à faire confiance à une extrapolation.

Le défaut structurel des réseaux de neurones. Un réseau standard ne modélise aucune des deux : il produit un point, et son softmax n'est pas une probabilité calibrée. Il reste très confiant sur des entrées totalement hors distribution — un classificateur d'images entraîné sur des chiens et des chats attribue 99 % de confiance à une photo de voiture. C'est le comportement le plus dangereux pour un usage industriel. Les processus gaussiens (module 19), eux, fournissent nativement l'incertitude épistémique : leur variance croît mécaniquement loin des données observées.

9. Quantifier l'incertitude d'un modèle

méthodes, du plus simple au plus coûteux
Régression quantile      entraîner sur la perte pinball aux quantiles 5 % et 95 %.
                         Capture l'incertitude ALÉATOIRE, y compris hétéroscédastique.
                         Disponible dans LightGBM et HistGradientBoosting : le
                         meilleur rapport effort/résultat sur données tabulaires.
Ensembles profonds       entraîner 5 réseaux avec des graines différentes ; la
                         dispersion des prédictions estime l'incertitude ÉPISTÉMIQUE.
                         Simple, robuste, la référence empirique — coût ×5.
MC dropout               laisser le dropout actif à l'inférence et échantillonner.
                         Bon marché, mais approximation grossière.
Sortie probabiliste      faire prédire au réseau moyenne ET variance (perte de
                         log-vraisemblance gaussienne) : sépare les deux incertitudes.
Bayésien complet         poids traités comme variables aléatoires (VI, SWAG).
                         Élégant, coûteux, rarement meilleur qu'un ensemble profond.
Processus gaussien       incertitude exacte par construction (module 19) — mais O(n³).
Prédiction conforme      garantie de couverture sur n'importe quel modèle déjà
                         entraîné (section suivante).
Python — régression quantile, immédiatement applicable
from lightgbm import LGBMRegressor

modeles = {}
for alpha in (0.05, 0.5, 0.95):
    modeles[alpha] = LGBMRegressor(objective="quantile", alpha=alpha,
                                   n_estimators=500).fit(X_tr, y_tr)

bas  = modeles[0.05].predict(X_te)
med  = modeles[0.50].predict(X_te)
haut = modeles[0.95].predict(X_te)

couverture = np.mean((y_te >= bas) & (y_te <= haut))
print(f"couverture empirique : {couverture:.1%}")   # visée : 90 %
# largeur variable selon les points : c'est le signe d'un bruit hétéroscédastique

10. Prédiction conforme

La prédiction conforme est, à mon sens, la technique la plus sous-utilisée du domaine. Elle fournit un intervalle de prédiction avec une garantie de couverture valable à échantillon fini, sans aucune hypothèse sur la distribution des données ni sur le modèle — seulement l'échangeabilité des observations, c'est-à-dire le fait que l'ordre n'a pas d'importance.

La version par découpage tient en trois étapes. On met de côté un jeu de calibration, disjoint de l'entraînement. On y calcule les scores de non-conformité \(s_i = |y_i - \hat f(x_i)|\) — à quel point le modèle s'est trompé sur chaque point. On prend le quantile empirique \(\hat q\) d'ordre \(\lceil (n+1)(1-\alpha)\rceil / n\). L'intervalle \(\hat f(x) \pm \hat q\) vérifie alors, pour un nouveau point :

\[ \mathbb{P}\big(y_{\text{nouveau}} \in \hat{C}(x_{\text{nouveau}})\big) \;\geq\; 1-\alpha \]

L'intuition : si le modèle s'est trompé de moins de \(\hat q\) sur 90 % des points de calibration, et que le nouveau point est échangeable avec ceux-là, il a 90 % de chances de tomber dans la même marge.

Python — conformaliser n'importe quel modèle
import numpy as np

modele.fit(X_train, y_train)                       # GBM, réseau, n'importe quoi

scores = np.abs(y_calib - modele.predict(X_calib))            # non-conformité
n, alpha = len(scores), 0.1
q = np.quantile(scores, np.ceil((n + 1) * (1 - alpha)) / n, method="higher")

pred = modele.predict(X_test)
bas, haut = pred - q, pred + q
print(f"couverture empirique : {np.mean((y_test >= bas) & (y_test <= haut)):.1%}")
# ≈ 90 %, par construction — quelle que soit la qualité du modèle

Deux raffinements importants. L'intervalle ci-dessus est de largeur constante, ce qui est peu satisfaisant quand le bruit varie : la variante CQR (conformalized quantile regression) conformalise les quantiles prédits par la section précédente, et produit des intervalles adaptatifs tout en conservant la garantie. En classification, on construit des ensembles de classes : sur un cas facile l'ensemble contient une seule classe, sur un cas ambigu il en contient plusieurs — une façon honnête de dire « je ne sais pas trancher », bien plus utile qu'un score de confiance non calibré, et directement exploitable pour décider de transmettre le cas à un humain (module 24).

Ce que la garantie couvre, et ce qu'elle ne couvre pas. La couverture est marginale : elle vaut en moyenne sur l'ensemble des points, pas nécessairement pour chaque sous-groupe — d'où les variantes conditionnées par groupe. Elle suppose l'échangeabilité : si la distribution dérive (module 26) ou si les données sont temporelles, la garantie tombe, et il faut des versions adaptatives en ligne. Enfin, elle ne rend pas un mauvais modèle bon : un modèle imprécis produira simplement des intervalles très larges — ce qui est déjà une information utile, et honnête.

Ce qu'il faut retenir du module

  • Choisir une loi, c'est faire une hypothèse sur le mécanisme ; choisir une perte, c'est choisir un modèle de bruit.
  • Ridge et lasso sont des MAP avec a priori gaussien et laplacien : la régularisation est une croyance explicite.
  • Bayes renverse la conditionnelle : avec un événement rare, un test très précis produit surtout des faux positifs.
  • L'a posteriori combine a priori et données en pondérant par la précision ; il s'efface quand les données abondent.
  • NUTS/HMC rend l'inférence praticable ; toujours vérifier \(\hat R\), l'ESS, les divergences et le prédictif a posteriori.
  • Les modèles hiérarchiques font du regroupement partiel : la meilleure réponse aux groupes à faibles effectifs.
  • Distinguer incertitude aléatoire (irréductible, à dimensionner) et épistémique (réductible, signal de hors-domaine).
  • Sur un modèle existant, la prédiction conforme donne une garantie de couverture pour cinq lignes de code.

BayésienMCMCPyMCHiérarchiqueIncertitudeConformal