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.
📋 Au programme
- Les lois usuelles comme briques de modélisation
- Vraisemblance, MLE, MAP
- Bayes, avec un exemple chiffré
- Conjugaison et A/B test bayésien
- MCMC : échantillonner un a posteriori
- Modèles hiérarchiques
- Inférence variationnelle
- Aléatoire contre épistémique
- Quantifier l'incertitude d'un modèle
- Prédiction conforme
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.
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 à 1Le 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 :
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.
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 :
3. Bayes, avec un exemple chiffré
Le MAP ne retient qu'un point. L'approche bayésienne complète conserve toute la distribution :
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 :
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 :
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.
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.
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é.
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, visible7. 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 :
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 :
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.
9. Quantifier l'incertitude d'un modèle
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).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édastique10. 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 :
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.
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èleDeux 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 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.