Probabilités & Statistiques
“Le langage de l'incertitude — distributions de probabilité, MLE et raisonnement bayésien”
Distributions de probabilité, MLE, théorème de Bayes, tests d'hypothèse et théorème de la limite centrale — le langage de l'incertitude.
Prérequis
Concepts Couverts
∑Formules Clés
Théorème de Bayes
Mettre à jour la croyance a priori P(H) avec une preuve E pour obtenir le posterior P(H|E)
EMV
Trouver les paramètres rendant les données observées les plus probables — équivalent à minimiser le NLL
Densité de Probabilité Normale
Courbe en cloche — entièrement spécifiée par la moyenne μ et l'écart-type σ
Théorème Central Limite
La somme de n variables i.i.d. converge vers la Normale quand n→∞ — pourquoi la distribution normale est partout
▶Simulation Interactive
L'Incertitude Est Partout en ML
Le machine learning est fondamentalement une question de prédictions dans l'incertitude. La classification produit des probabilités (pas seulement des étiquettes). Les modèles bayésiens maintiennent des distributions complètes sur les paramètres. Sans théorie des probabilités, vous ne pouvez pas raisonner sur : si un modèle est faussement confiant, si votre découpage train/test donne une estimation fiable, ou si deux modèles sont réellement différents.
La log loss (entropie croisée) est la log-vraisemblance négative d'une distribution de Bernoulli. Minimiser l'entropie croisée, c'est faire de l'estimation du maximum de vraisemblance.
Les Distributions — Les Plus Importantes
**Normale (Gaussienne) :** En cloche, symétrique. Omniprésente par le TCL. Paramétrée par μ (localisation) et σ (dispersion). **Binomiale :** Nombre de succès en n essais binaires avec probabilité p. **Poisson :** Nombre d'événements dans un intervalle fixe. **Bernoulli :** Essai binaire unique. **Student-t :** Comme la Normale mais avec des queues plus lourdes — pour les tests sur petits échantillons. Comprendre quelle distribution utiliser pour votre problème est une compétence essentielle.
Si X₁, X₂, …, Xₙ sont i.i.d. avec moyenne μ et variance finie σ², alors √n(X̄-μ)/σ → N(0,1). C'est pourquoi presque tout est gaussien après avoir fait la moyenne de suffisamment d'échantillons.
Estimation du Maximum de Vraisemblance (EMV)
Choisir un modèle de probabilité p(x|θ) pour vos données (ex. : Normale, Binomiale).
Écrire la vraisemblance : L(θ) = ∏ᵢ p(xᵢ|θ) — probabilité des données observées sous θ.
Prendre le log : ℓ(θ) = Σᵢ log p(xᵢ|θ) — la log-vraisemblance est plus facile à optimiser (somme vs produit).
Dériver ∂ℓ/∂θ, égaler à zéro, résoudre pour θ̂_EMV.
Pour la Normale : θ̂_EMV = (μ̂=x̄, σ̂²=Σ(xᵢ-x̄)²/n) — moyenne et variance biaisée empiriques.
Pour la régression logistique : pas de forme fermée → utiliser la descente de gradient sur la log-perte = -ℓ(θ).
Probabilité avec SciPy & NumPy
import numpy as np from scipy import stats import matplotlib.pyplot as plt class="tok-comment"># ── Distribution normale ─────────────────────────────────────────────────────── mu, sigma = class="tok-num">170, class="tok-num">10 class="tok-comment"># tailles en cm dist_norm = stats.norm(mu, sigma) x = np.linspace(class="tok-num">135, class="tok-num">205, class="tok-num">500) pdf = dist_norm.pdf(x) class="tok-comment"># Probabilités p_grand = class="tok-num">1 - dist_norm.cdf(class="tok-num">190) class="tok-comment"># P(X > class="tok-num">190) p_intervalle = dist_norm.cdf(class="tok-num">180) - dist_norm.cdf(class="tok-num">160) class="tok-comment"># P(class="tok-num">160 < X < class="tok-num">180) print(fclass="tok-str">"P(taille > 190cm) = {p_grand:.4f}") print(fclass="tok-str">"P(class="tok-num">160 < taille < class="tok-num">180) = {p_intervalle:.4f}") class="tok-comment"># Règle class="tok-num">68-class="tok-num">95-class="tok-num">99.7 for k in [class="tok-num">1, class="tok-num">2, class="tok-num">3]: p = dist_norm.cdf(mu + k*sigma) - dist_norm.cdf(mu - k*sigma) print(fclass="tok-str">"P(μ ± {k}σ) = {p:.4f}") class="tok-comment"># ≈ class="tok-num">0.68, class="tok-num">0.95, class="tok-num">0.997 class="tok-comment"># ── EMV — ajustement dclass="tok-str">'une distribution normale ────────────────────────────── donnees = np.random.normal(class="tok-num">170, class="tok-num">10, size=class="tok-num">100) mu_mle, sigma_mle = donnees.mean(), donnees.std() print(f"\nAjustement EMV : μ̂={mu_mle:.2f}, σ̂={sigma_mle:.2f}") mu_fit, sigma_fit = stats.norm.fit(donnees) print(f"Ajustement SciPy : μ={mu_fit:.2f}, σ={sigma_fit:.2f}") class="tok-comment"># ── Théorème de Bayes ──────────────────────────────────────────────────────── class="tok-comment"># Test de maladie : prévalence class="tok-num">1%, sensibilité class="tok-num">99%, spécificité class="tok-num">95% p_maladie = class="tok-num">0.01 p_pos_sachant_maladie = class="tok-num">0.99 class="tok-comment"># sensibilité p_neg_sachant_sain = class="tok-num">0.95 class="tok-comment"># spécificité → P(pos|sain) = class="tok-num">0.05 p_sain = class="tok-num">1 - p_maladie p_pos_sachant_sain = class="tok-num">1 - p_neg_sachant_sain class="tok-comment"># P(positif) = P(pos|maladie)*P(maladie) + P(pos|sain)*P(sain) p_pos = p_pos_sachant_maladie * p_maladie + p_pos_sachant_sain * p_sain class="tok-comment"># Bayes : P(maladie | test positif) p_maladie_sachant_pos = (p_pos_sachant_maladie * p_maladie) / p_pos print(f"\nP(maladie | test positif) = {p_maladie_sachant_pos:.4f}") class="tok-comment"># ~class="tok-num">16.4% ! class="tok-comment"># Contre-intuitif : malgré class="tok-num">99% de précision, seulement class="tok-num">16% de chance avec + class="tok-comment"># dû au faible taux de base (prior) — biais du taux de base class="tok-comment"># ── Test d'hypothèse ───────────────────────────────────────────────────────── groupe_a = np.random.normal(class="tok-num">5.0, class="tok-num">1.5, class="tok-num">50) groupe_b = np.random.normal(class="tok-num">5.5, class="tok-num">1.5, class="tok-num">50) t_stat, p_valeur = stats.ttest_ind(groupe_a, groupe_b) print(fclass="tok-str">"\nt-test : t={t_stat:.3f}, p={p_valeur:.4f}") print(class="tok-str">"Significatif à α=class="tok-num">0.05 :", p_valeur < class="tok-num">0.05) class="tok-comment"># Intervalle de confiance bootstrap (sans hypothèse de distribution) np.random.seed(class="tok-num">42) moyennes_boot = [np.random.choice(groupe_a, size=len(groupe_a), replace=True).mean() for _ in range(class="tok-num">10000)] ic_bas, ic_haut = np.percentile(moyennes_boot, [class="tok-num">2.5, class="tok-num">97.5]) print(fclass="tok-str">"IC class="tok-num">95% groupe A : [{ic_bas:.3f}, {ic_haut:.3f}]")
Les p-valeurs Ne Sont Pas Ce Que Vous Croyez
Une p-valeur < 0.05 ne signifie PAS 'il y a 95% de chances que l'effet soit réel.' Elle signifie : 'si l'hypothèse nulle était vraie, nous verrions des données aussi extrêmes moins de 5% du temps.' Pièges spécifiques au ML : (1) Comparaisons multiples : si vous testez 20 configurations et rapportez la meilleure, corrigez avec Bonferroni. (2) Confondre la signification statistique avec la signification pratique. (3) Data dredging : tester de nombreuses divisions jusqu'à en trouver une où votre modèle 'bat significativement' la ligne de base.
La taille de l'effet (d de Cohen = (μ₁-μ₂)/σ) vous indique si une différence est pratiquement importante. Un p=0.0001 avec d=0.02 est statistiquement significatif mais pratiquement sans intérêt.
?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.