{"id":5145,"date":"2026-10-14T18:01:57","date_gmt":"2026-10-14T18:01:57","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-calculer-score-f1-python-exemple\/"},"modified":"2026-10-14T18:01:57","modified_gmt":"2026-10-14T18:01:57","slug":"comment-calculer-score-f1-python-exemple","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-calculer-score-f1-python-exemple","title":{"rendered":"Comment calculer le score F1 en Python (avec exemple)"},"content":{"rendered":"<p>L&rsquo;\u00e9valuation de la performance des mod\u00e8les pr\u00e9dictifs constitue l&rsquo;un des piliers fondamentaux de la science des donn\u00e9es contemporaine, de l&rsquo;apprentissage automatique et de l&rsquo;intelligence artificielle. Dans le cadre de la mod\u00e9lisation supervis\u00e9e, et plus particuli\u00e8rement des t\u00e2ches de classification binaire et multiclasse, le choix des m\u00e9triques d&rsquo;\u00e9valuation ne repr\u00e9sente pas un simple arbitrage technique, mais oriente fondamentalement le comportement d&rsquo;optimisation des algorithmes. Longtemps pl\u00e9biscit\u00e9e pour sa simplicit\u00e9 d&rsquo;interpr\u00e9tation, l&rsquo;exactitude brute (commun\u00e9ment d\u00e9sign\u00e9e sous l&rsquo;anglicisme <em>accuracy<\/em>) a r\u00e9v\u00e9l\u00e9 de profondes lacunes th\u00e9oriques et pratiques lorsqu&rsquo;elle est confront\u00e9e \u00e0 des donn\u00e9es asym\u00e9triques ou \u00e0 des co\u00fbts d&rsquo;erreurs diff\u00e9rentiels.<\/p>\n<p>Face \u00e0 ces limites conceptuelles, le score F1 s&rsquo;est impos\u00e9 au fil des d\u00e9cennies comme l&rsquo;instrument de r\u00e9f\u00e9rence privil\u00e9gi\u00e9 par les chercheurs, ing\u00e9nieurs et analystes de donn\u00e9es. Con\u00e7u pour synth\u00e9tiser en une valeur scalaire unique deux dimensions orthogonales de la qualit\u00e9 pr\u00e9dictive \u2014 \u00e0 savoir la pr\u00e9cision (ou valeur pr\u00e9dictive positive) et le rappel (ou sensibilit\u00e9 empirique) \u2014, le score F1 repose sur l&rsquo;\u00e9l\u00e9gance de la moyenne harmonique. Cette formulation math\u00e9matique conf\u00e8re \u00e0 la m\u00e9trique une s\u00e9v\u00e9rit\u00e9 salutaire : elle p\u00e9nalise impitoyablement les mod\u00e8les d\u00e9faillants sur l&rsquo;une des dimensions, interdisant toute compensation artificielle d&rsquo;un d\u00e9ficit de d\u00e9tection par une s\u00e9lectivit\u00e9 excessive, ou inversement.<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;analyser l&rsquo;int\u00e9gralit\u00e9 du cycle de vie du score F1 en environnement Python. Depuis les fondements \u00e9pist\u00e9mologiques de la th\u00e9orie de d\u00e9tection du signal jusqu&rsquo;aux arcanes de l&rsquo;optimisation dynamique des seuils de d\u00e9cision probabilistes, en passant par le calcul manuel rigoureux sur un \u00e9chantillon empirique de 400 observations et l&rsquo;impl\u00e9mentation algorithmique native vectoris\u00e9e sans d\u00e9pendance externe, nous explorerons chaque facette de cette m\u00e9trique ma\u00eetresse. Que vous op\u00e9riez dans le domaine de la bio-informatique, du diagnostic m\u00e9dical, de la d\u00e9tection de fraudes bancaires ou de la mod\u00e9lisation psychom\u00e9trique, la ma\u00eetrise math\u00e9matique et computationnelle du score F1 constitue un imp\u00e9ratif m\u00e9thodologique incontournable.<\/p>\n<h2>1. 1. Introduction th\u00e9orique au score F1 et fondements de l&rsquo;\u00e9valuation de classification<\/h2>\n<h3>1.1 1.1 D\u00e9finition \u00e9pist\u00e9mologique et pertinence en mod\u00e9lisation pr\u00e9dictive<\/h3>\n<p>D&rsquo;un point de vue \u00e9pist\u00e9mologique, la validation d&rsquo;un mod\u00e8le d&rsquo;apprentissage supervis\u00e9 ne consiste pas simplement \u00e0 mesurer la fr\u00e9quence brute de concordance entre une r\u00e9alit\u00e9 objective et une hypoth\u00e8se pr\u00e9dictive. L&rsquo;exactitude globale, formul\u00e9e comme le rapport arithm\u00e9tique entre le volume total des pr\u00e9dictions correctes et l&rsquo;effectif complet de la cohorte d&rsquo;\u00e9valuation, postule implicitement une sym\u00e9trie parfaite de l&rsquo;espace d&rsquo;\u00e9tat. Elle suppose que la pr\u00e9valence des classes est \u00e9quilibr\u00e9e et que l&rsquo;omission d&rsquo;un \u00e9v\u00e9nement critique pr\u00e9sente une gravit\u00e9 identique \u00e0 l&rsquo;\u00e9mission d&rsquo;une fausse alerte. En pratique statistique r\u00e9elle, cette hypoth\u00e8se de sym\u00e9trie est presque syst\u00e9matiquement viol\u00e9e. D\u00e8s lors qu&rsquo;une classe cible devient rare \u2014 qu&rsquo;il s&rsquo;agisse d&rsquo;une pathologie neurod\u00e9g\u00e9n\u00e9rative, d&rsquo;une tentative d&rsquo;intrusion cybern\u00e9tique ou d&rsquo;une transaction financi\u00e8re frauduleuse \u2014, un estimateur na\u00eff se bornant \u00e0 pr\u00e9dire exclusivement la classe majoritaire affiche une exactitude spectaculaire, souvent sup\u00e9rieure \u00e0 99 %, tout en s&rsquo;av\u00e9rant totalement d\u00e9nu\u00e9 de pouvoir explicatif ou op\u00e9rationnel.<\/p>\n<p>Le score F1 na\u00eet de la n\u00e9cessit\u00e9 de subvertir ce paradoxe en \u00e9tablissant un \u00e9quilibre rigoureux entre la s\u00e9lectivit\u00e9 du classifieur et son exhaustivit\u00e9. Dans les domaines de la psychom\u00e9trie exp\u00e9rimentale et des sciences cognitives, la construction de tests diagnostics requiert une vigilance analogue : un outil de d\u00e9pistage cognitif ne peut se contenter d&rsquo;\u00eatre fid\u00e8le sans \u00eatre valide, de m\u00eame qu&rsquo;il ne peut privil\u00e9gier la minimisation des faux positifs au d\u00e9triment de l&rsquo;identification des sujets v\u00e9ritablement vuln\u00e9rables. La pertinence du score F1 repose sur l&rsquo;utilisation d\u00e9lib\u00e9r\u00e9e de la <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/fr.wikipedia.org\/wiki\/Moyenne_harmonique\">moyenne harmonique<\/a>, laquelle est structurellement conditionn\u00e9e par la plus faible de ses composantes. Contrairement \u00e0 la moyenne arithm\u00e9tique qui autoriserait un compromis additif trompeur, la structure harmonique impose que le syst\u00e8me n&rsquo;obtienne un score \u00e9lev\u00e9 que s&rsquo;il d\u00e9montre conjointement une haute fid\u00e9lit\u00e9 d&rsquo;alerte et un large spectre de capture.<\/p>\n<h3>1.2 1.2 Le compromis pr\u00e9cision-rappel en inf\u00e9rence statistique<\/h3>\n<p>L&rsquo;inf\u00e9rence statistique appliqu\u00e9e \u00e0 la classification binaire se heurte invariablement \u00e0 un arbitrage irr\u00e9ductible entre deux pathologies de l&rsquo;estimation : l&rsquo;erreur de Type I (le faux positif) et l&rsquo;erreur de Type II (le faux n\u00e9gatif). La pr\u00e9cision mesure la probabilit\u00e9 <em>a posteriori<\/em> qu&rsquo;une observation \u00e9tiquet\u00e9e positivement par le mod\u00e8le appartienne effectivement \u00e0 la population d&rsquo;int\u00e9r\u00eat, quantifiant ainsi la cr\u00e9dibilit\u00e9 de l&rsquo;assignation positive. En contrepartie, le rappel \u00e9value la probabilit\u00e9 conditionnelle qu&rsquo;un \u00e9v\u00e9nement positif r\u00e9el soit formellement identifi\u00e9 par l&rsquo;estimateur, refl\u00e9tant son exhaustivit\u00e9 empirique. La tension structurelle qui unit ces deux dimensions d\u00e9coule du d\u00e9placement de la fronti\u00e8re de d\u00e9cision au sein de l&rsquo;espace des distributions conditionnelles.<\/p>\n<p>En modifiant le seuil de discrimination probabiliste, l&rsquo;analyste alt\u00e8re m\u00e9caniquement la balance : l&rsquo;\u00e9l\u00e9vation du seuil exige un niveau de certitude accru pour classifier une entit\u00e9 comme positive, ce qui rar\u00e9fie les faux positifs et maximise la pr\u00e9cision, mais pr\u00e9cipite en corollaire une inflation des faux n\u00e9gatifs, d\u00e9gradant le rappel. Inversement, l&rsquo;abaissement du seuil amplifie la sensibilit\u00e9 du filtre, capturant la quasi-totalit\u00e9 des occurrences r\u00e9elles au prix d&rsquo;une contamination accrue par des fausses alertes. Cet arbitrage n&rsquo;est pas neutre sur le plan d\u00e9cisionnel : dans un contexte \u00e9pid\u00e9miologique d&rsquo;urgence, un faux n\u00e9gatif peut entra\u00eener une l\u00e9talit\u00e9 directe, tandis que dans un syst\u00e8me automatis\u00e9 de filtrage de pourriels, un faux positif peut annihiler une communication professionnelle critique. Le score F1 intervient alors comme l&rsquo;arbitre formel de ce compromis, attribuant une p\u00e9nalisation sym\u00e9trique aux deux d\u00e9rives.<\/p>\n<h3>1.3 1.3 Contexte applicatif : De la pr\u00e9diction comportementale au machine learning<\/h3>\n<p>Les racines conceptuelles du score F1 plongent dans la th\u00e9orie de d\u00e9tection du signal formul\u00e9e \u00e0 l&rsquo;origine en psychophysique et en neuropsychologie par des auteurs pionniers tels que Green et Swets. Dans cette approche classique, la capacit\u00e9 d&rsquo;un op\u00e9rateur ou d&rsquo;un syst\u00e8me biologique \u00e0 distinguer un signal informatif \u00e9mergeant d&rsquo;un bruit de fond al\u00e9atoire est quantifi\u00e9e au travers de matrices de contingence discriminantes. Les sciences du comportement exploitent ces m\u00e9canismes pour \u00e9valuer la validit\u00e9 pr\u00e9dictive des tests de recrutement, les outils de d\u00e9tection pr\u00e9coce des troubles de l&rsquo;attention ou les algorithmes de pr\u00e9diction du d\u00e9crochage scolaire. Dans l&rsquo;ensemble de ces contextes, les co\u00fbts associ\u00e9s aux erreurs de jugement demeurent fondamentalement asym\u00e9triques et requi\u00e8rent des m\u00e9triques robustes aux d\u00e9s\u00e9quilibres d\u00e9mographiques.<\/p>\n<p>Au cours des ann\u00e9es 1970 et 1980, le traitement automatique du langage naturel (NLP) et la recherche documentaire (<em>Information Retrieval<\/em>) ont formalis\u00e9 ces concepts sous l&rsquo;impulsion de C. J. van Rijsbergen. L&rsquo;av\u00e8nement subs\u00e9quent de l&rsquo;apprentissage automatique moderne a consacr\u00e9 cette m\u00e9trique comme le crit\u00e8re de r\u00e9f\u00e9rence pour l&rsquo;optimisation des hyperparam\u00e8tres, la validation crois\u00e9e et la s\u00e9lection d&rsquo;architectures pr\u00e9dictives complexes. L&rsquo;objectif de ce manuel m\u00e9thodologique est de fournir une trajectoire p\u00e9dagogique et technique rigoureuse, permettant \u00e0 l&rsquo;analyste de ma\u00eetriser l&rsquo;ensemble de la cha\u00eene de calcul en langage Python. Nous irons de la manipulation de primitives num\u00e9riques pures jusqu&rsquo;au d\u00e9ploiement de pipelines scikit-learn hautement configurables, garantissant une reproductibilit\u00e9 exp\u00e9rimentale absolue.<\/p>\n<h2>2. 2. D\u00e9composition math\u00e9matique : Pr\u00e9cision, rappel et moyenne harmonique<\/h2>\n<h3>2.1 2.1 Formulation analytique de la pr\u00e9cision (valeur pr\u00e9dictive positive)<\/h3>\n<p>D&rsquo;un point de vue probabiliste, la pr\u00e9cision \u2014 assimil\u00e9e dans la litt\u00e9rature biostatistique \u00e0 la valeur pr\u00e9dictive positive (VPP) \u2014 est la probabilit\u00e9 que la variable cible <span class=\"arabpsy-math-inline\" data-latex=\"Y\">$Y$<\/span> soit \u00e9gale \u00e0 $1$, sachant que la pr\u00e9diction <span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y}\">$\\hat{Y}$<\/span> formul\u00e9e par l&rsquo;algorithme est \u00e9gale \u00e0 $1$. Dans le formalisme d&rsquo;une matrice de confusion empirique, elle s&rsquo;exprime comme le quotient de la cardinalit\u00e9 des vrais positifs (VP) par la somme totale des instances assign\u00e9es \u00e0 la classe positive, c&rsquo;est-\u00e0-dire l&rsquo;ensemble constitu\u00e9 des vrais positifs et des faux positifs (FP) :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Pr\u00e9cision} = \\frac{\\text{VP}}{\\text{VP} + \\text{FP}}\">$$\\text{Pr\u00e9cision} = \\frac{\\text{VP}}{\\text{VP} + \\text{FP}}$$<\/span><\/p>\n<p>Sur le plan s\u00e9mantique, la pr\u00e9cision quantifie la puret\u00e9 de la pr\u00e9diction positive. Un syst\u00e8me affichant une pr\u00e9cision parfaite de <span class=\"arabpsy-math-inline\" data-latex=\"1{,}0\">$1{,}0$<\/span> garantit que chaque observation signal\u00e9e comme positive est rigoureusement conforme \u00e0 la v\u00e9rit\u00e9 terrain, excluant tout faux positif. N\u00e9anmoins, cette m\u00e9trique demeure totalement aveugle aux \u00e9v\u00e9nements positifs omis par le mod\u00e8le. Un estimateur ultra-conservateur qui n&rsquo;\u00e9mettrait qu&rsquo;une seule pr\u00e9diction positive tout au long de sa trajectoire de test, mais dont cette pr\u00e9diction unique s&rsquo;av\u00e9rerait exacte, obtiendrait une pr\u00e9cision unitaire parfaite (<span class=\"arabpsy-math-inline\" data-latex=\"100,%\">$100,%$<\/span>), masquant ainsi son incapacit\u00e9 syst\u00e9mique \u00e0 capturer le reste de la population cible. Les cons\u00e9quences d&rsquo;une faible pr\u00e9cision se traduisent par une saturation op\u00e9rationnelle : multiplication des interventions manuelles inutiles, dilution de la confiance des utilisateurs et co\u00fbts d&rsquo;investigation prohibitifs.<\/p>\n<h3>2.2 2.2 Formulation analytique du rappel (sensibilit\u00e9 empirique)<\/h3>\n<p>Le rappel, rigoureusement \u00e9quivalent \u00e0 la sensibilit\u00e9 diagnostique ou au taux de vrais positifs (<em>True Positive Rate<\/em>), mod\u00e9lise la probabilit\u00e9 conditionnelle que le mod\u00e8le pr\u00e9dise <span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y} = 1\">$\\hat{Y} = 1$<\/span> sachant que l&rsquo;\u00e9tat r\u00e9el sous-jacent est <span class=\"arabpsy-math-inline\" data-latex=\"Y = 1\">$Y = 1$<\/span>. Son expression math\u00e9matique met en rapport la cardinalit\u00e9 des vrais positifs avec la somme exhaustive des observations positives r\u00e9elles, incluant tant les instances correctement identifi\u00e9es que celles tragiquement ignor\u00e9es, \u00e0 savoir les faux n\u00e9gatifs (FN) :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Rappel} = \\frac{\\text{VP}}{\\text{VP} + \\text{FN}}\">$$\\text{Rappel} = \\frac{\\text{VP}}{\\text{VP} + \\text{FN}}$$<\/span><\/p>\n<p>Le rappel constitue ainsi l&rsquo;indice par excellence de l&rsquo;exhaustivit\u00e9 de la couverture algorithmique. Un score de rappel de <span class=\"arabpsy-math-inline\" data-latex=\"1{,}0\">$1{,}0$<\/span> implique que l&rsquo;int\u00e9gralit\u00e9 des manifestations de la classe cible a \u00e9t\u00e9 d\u00e9tect\u00e9e sans exception aucune. \u00c0 l&rsquo;instar de la pr\u00e9cision, cette grandeur statistique ne saurait \u00eatre interpr\u00e9t\u00e9e de fa\u00e7on isol\u00e9e : un classifieur d\u00e9g\u00e9n\u00e9r\u00e9 formulant syst\u00e9matiquement et aveugl\u00e9ment la pr\u00e9diction <span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y} = 1\">$\\hat{Y} = 1$<\/span> pour l&rsquo;ensemble des enregistrements de la base de donn\u00e9es obtiendrait un rappel parfait de <span class=\"arabpsy-math-inline\" data-latex=\"100,%\">$100,%$<\/span>, les faux n\u00e9gatifs \u00e9tant nuls par construction (<span class=\"arabpsy-math-inline\" data-latex=\"\\text{FN} = 0\">$\\text{FN} = 0$<\/span>). Dans les contextes cliniques, industriels ou s\u00e9curitaires, un taux \u00e9lev\u00e9 de faux n\u00e9gatifs repr\u00e9sente la d\u00e9faillance la plus critique, laissant des \u00e9tats pathologiques se propager sans traitement curatif ou des failles critiques s&rsquo;exploiter sans contre-mesures pr\u00e9ventives.<\/p>\n<h3>2.3 2.3 La moyenne harmonique et l&rsquo;\u00e9quation canonique du score F1<\/h3>\n<p>Afin de fusionner ces deux m\u00e9triques antagonistes en un indicateur synth\u00e9tique univoque sans c\u00e9der aux illusions de la lin\u00e9arit\u00e9, la statistique math\u00e9matique a recours \u00e0 la moyenne harmonique. Par d\u00e9finition, la moyenne harmonique <span class=\"arabpsy-math-inline\" data-latex=\"H\">$H$<\/span> de deux r\u00e9els strictement positifs <span class=\"arabpsy-math-inline\" data-latex=\"x_1\">$x_1$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"x_2\">$x_2$<\/span> est \u00e9gale \u00e0 l&rsquo;inverse de la moyenne arithm\u00e9tique de leurs inverses :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\frac{1}{H} = \\frac{\\frac{1}{x_1} + \\frac{1}{x_2}}{2} implies H = \\frac{2}{\\frac{1}{x_1} + \\frac{1}{x_2}} = \\frac{2 \\cdot x_1 \\cdot x_2}{x_1 + x_2}\">$$\\frac{1}{H} = \\frac{\\frac{1}{x_1} + \\frac{1}{x_2}}{2} implies H = \\frac{2}{\\frac{1}{x_1} + \\frac{1}{x_2}} = \\frac{2 \\cdot x_1 \\cdot x_2}{x_1 + x_2}$$<\/span><\/p>\n<p>En substituant la pr\u00e9cision (<span class=\"arabpsy-math-inline\" data-latex=\"P\">$P$<\/span>) et le rappel (<span class=\"arabpsy-math-inline\" data-latex=\"R\">$R$<\/span>) dans cette relation structurelle, nous d\u00e9rivons directement l&rsquo;\u00e9quation canonique du score F1 :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_1 = 2 \\cdot \\frac{P \\cdot R}{P + R} = \\frac{2 \\cdot \\text{VP}}{2 \\cdot \\text{VP} + \\text{FP} + \\text{FN}}\">$$F_1 = 2 \\cdot \\frac{P \\cdot R}{P + R} = \\frac{2 \\cdot \\text{VP}}{2 \\cdot \\text{VP} + \\text{FP} + \\text{FN}}$$<\/span><\/p>\n<p>La sup\u00e9riorit\u00e9 de la moyenne harmonique sur la moyenne arithm\u00e9tique r\u00e9side dans sa sensibilit\u00e9 aigu\u00eb aux d\u00e9s\u00e9quilibres extr\u00eames. Consid\u00e9rons un mod\u00e8le pathologique dont le rappel serait de <span class=\"arabpsy-math-inline\" data-latex=\"1{,}0\">$1{,}0$<\/span> et la pr\u00e9cision de <span class=\"arabpsy-math-inline\" data-latex=\"0{,}05\">$0{,}05$<\/span>. Une moyenne arithm\u00e9tique na\u00efve lui accorderait une note respectable de <span class=\"arabpsy-math-inline\" data-latex=\"(1{,}0 + 0{,}05)\/2 = 0{,}525\">$(1{,}0 + 0{,}05)\/2 = 0{,}525$<\/span>, dissimulant la d\u00e9faillance r\u00e9dhibitoire du syst\u00e8me. La moyenne harmonique, en revanche, calcule un score F1 effondr\u00e9 \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"2 \\cdot (1{,}0 \\cdot 0{,}05) \/ (1{,}0 + 0{,}05) \\approx 0{,}0952\">$2 \\cdot (1{,}0 \\cdot 0{,}05) \/ (1{,}0 + 0{,}05) \\approx 0{,}0952$<\/span>, sanctionnant s\u00e9v\u00e8rement l&rsquo;asym\u00e9trie.<\/p>\n<p>Cette formulation est un cas particulier de la famille param\u00e9trique du score <span class=\"arabpsy-math-inline\" data-latex=\"F_\\beta\">$F_\\beta$<\/span> th\u00e9oris\u00e9e par <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/F-score\">C. J. van Rijsbergen<\/a>, qui introduit un coefficient r\u00e9el <span class=\"arabpsy-math-inline\" data-latex=\"\\beta &gt; 0\">$\\beta &gt; 0$<\/span> destin\u00e9 \u00e0 moduler le poids relatif attribu\u00e9 au rappel par rapport \u00e0 la pr\u00e9cision :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_\\beta = (1 + \\beta^2) \\cdot \\frac{P \\cdot R}{(\\beta^2 \\cdot P) + R}\">$$F_\\beta = (1 + \\beta^2) \\cdot \\frac{P \\cdot R}{(\\beta^2 \\cdot P) + R}$$<\/span><\/p>\n<p>Lorsque <span class=\"arabpsy-math-inline\" data-latex=\"\\beta = 1\">$\\beta = 1$<\/span>, les deux dimensions jouissent d&rsquo;une pond\u00e9ration \u00e9quivalente. Une valeur <span class=\"arabpsy-math-inline\" data-latex=\"\\beta = 2\">$\\beta = 2$<\/span> (<span class=\"arabpsy-math-inline\" data-latex=\"F_2\">$F_2$<\/span>) accorde une priorit\u00e9 accentu\u00e9e au rappel, particuli\u00e8rement pris\u00e9e lors des diagnostics oncologiques d&rsquo;urgence, tandis qu&rsquo;une valeur <span class=\"arabpsy-math-inline\" data-latex=\"\\beta = 0{,}5\">$\\beta = 0{,}5$<\/span> (<span class=\"arabpsy-math-inline\" data-latex=\"F_{0{,}5}\">$F_{0{,}5}$<\/span>) favorise la pr\u00e9cision statistique, pr\u00e9conis\u00e9e lorsque le co\u00fbt marginal d&rsquo;une fausse alerte s&rsquo;av\u00e8re prohibitif.<\/p>\n<h2>3. 3. Structure et analyse de la matrice de confusion<\/h2>\n<h3>3.1 3.1 Topologie de la matrice de contingence binaire<\/h3>\n<p>La matrice de confusion, \u00e9galement qualifi\u00e9e de matrice de contingence ou table de croisement d\u00e9cisionnelle, constitue l&rsquo;armature empirique sur laquelle repose l&rsquo;ensemble des m\u00e9triques d&rsquo;\u00e9valuation supervis\u00e9e. Pour un espace de sortie binaire ordonn\u00e9 conventionnellement en classes positive ($1$) et n\u00e9gative ($0$), la matrice d\u00e9limite un r\u00e9seau bidimensionnel cartographiant les concordances et les discordances entre les \u00e9tiquettes de v\u00e9rit\u00e9 terrain (<span class=\"arabpsy-math-inline\" data-latex=\"Y\">$Y$<\/span>) et les inf\u00e9rences g\u00e9n\u00e9r\u00e9es par l&rsquo;algorithme (<span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y}\">$\\hat{Y}$<\/span>).<\/p>\n<p>Cette topologie quadripartite se structure autour des segments suivants :<\/p>\n<ul>\n<li><strong>Vrais Positifs (VP) :<\/strong> Nombre d&rsquo;observations o\u00f9 la condition r\u00e9elle est positive (<span class=\"arabpsy-math-inline\" data-latex=\"Y = 1\">$Y = 1$<\/span>) et o\u00f9 l&rsquo;estimateur a formul\u00e9 avec succ\u00e8s une pr\u00e9diction positive (<span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y} = 1\">$\\hat{Y} = 1$<\/span>).<\/li>\n<li><strong>Vrais N\u00e9gatifs (VN) :<\/strong> Nombre d&rsquo;observations o\u00f9 l&rsquo;absence de condition est av\u00e9r\u00e9e (<span class=\"arabpsy-math-inline\" data-latex=\"Y = 0\">$Y = 0$<\/span>) et o\u00f9 l&rsquo;estimateur a correctement conclu \u00e0 la n\u00e9gativit\u00e9 (<span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y} = 0\">$\\hat{Y} = 0$<\/span>).<\/li>\n<li><strong>Faux Positifs (FP) :<\/strong> Erreur de Type I ou rejet \u00e0 tort de l&rsquo;hypoth\u00e8se nulle ; l&rsquo;entit\u00e9 est intrins\u00e8quement n\u00e9gative (<span class=\"arabpsy-math-inline\" data-latex=\"Y = 0\">$Y = 0$<\/span>), mais le syst\u00e8me d\u00e9clenche ind\u00fbment un signal positif (<span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y} = 1\">$\\hat{Y} = 1$<\/span>).<\/li>\n<li><strong>Faux N\u00e9gatifs (FN) :<\/strong> Erreur de Type II ou non-rejet fautif de l&rsquo;hypoth\u00e8se nulle ; l&rsquo;entit\u00e9 pr\u00e9sente la condition d&rsquo;int\u00e9r\u00eat (<span class=\"arabpsy-math-inline\" data-latex=\"Y = 1\">$Y = 1$<\/span>), mais le mod\u00e8le \u00e9choue \u00e0 l&rsquo;identifier, concluant \u00e0 tort \u00e0 la n\u00e9gativit\u00e9 (<span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y} = 0\">$\\hat{Y} = 0$<\/span>).<\/li>\n<\/ul>\n<p>La normalisation conditionnelle de cette matrice permet d&rsquo;extraire des perspectives diagnostiques cibl\u00e9es : une normalisation selon les lignes de v\u00e9rit\u00e9 empirique met en lumi\u00e8re les taux structurels d&rsquo;\u00e9chappement (sensibilit\u00e9 et sp\u00e9cificit\u00e9), tandis qu&rsquo;une normalisation par colonne r\u00e9v\u00e8le la composition interne des d\u00e9cisions positives et n\u00e9gatives rendues par l&rsquo;architecture logicielle.<\/p>\n<h3>3.2 3.2 Extraction des grandeurs statistiques \u00e9l\u00e9mentaires<\/h3>\n<p>L&rsquo;exploitation rigoureuse de la matrice de contingence requiert le calcul syst\u00e9matique des totaux marginaux r\u00e9gissant ses dimensions horizontales et verticales. La somme marginale de la premi\u00e8re ligne repr\u00e9sente l&rsquo;effectif r\u00e9el des instances positives dans la population \u00e9chantillonn\u00e9e, not\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"N_+ = \\text{VP} + \\text{FN}\">$N_+ = \\text{VP} + \\text{FN}$<\/span>. La somme marginale de la seconde ligne correspond \u00e0 l&rsquo;effectif r\u00e9el des instances n\u00e9gatives, not\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"N_- = \\text{FP} + \\text{VN}\">$N_- = \\text{FP} + \\text{VN}$<\/span>. Le cumul de ces deux grandeurs restitue la taille totale de l&rsquo;\u00e9chantillon d&rsquo;\u00e9valuation : <span class=\"arabpsy-math-inline\" data-latex=\"N = N_+ + N_- = \\text{VP} + \\text{FP} + \\text{FN} + \\text{VN}\">$N = N_+ + N_- = \\text{VP} + \\text{FP} + \\text{FN} + \\text{VN}$<\/span>.<\/p>\n<p>De ces marges d\u00e9coule imm\u00e9diatement la pr\u00e9valence empirique de la condition au sein de la cohorte \u00e9tudi\u00e9e, formul\u00e9e par le ratio :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Pr\u00e9valence} = \\frac{N_+}{N} = \\frac{\\text{VP} + \\text{FN}}{\\text{VP} + \\text{FP} + \\text{FN} + \\text{VN}}\">$$\\text{Pr\u00e9valence} = \\frac{N_+}{N} = \\frac{\\text{VP} + \\text{FN}}{\\text{VP} + \\text{FP} + \\text{FN} + \\text{VN}}$$<\/span><\/p>\n<p>Parall\u00e8lement, les marges de colonnes d\u00e9finissent le volume d&rsquo;intervention pr\u00e9dictive du mod\u00e8le : la somme <span class=\"arabpsy-math-inline\" data-latex=\"\\hat{N}_+ = \\text{VP} + \\text{FP}\">$\\hat{N}_+ = \\text{VP} + \\text{FP}$<\/span> exprime le taux de s\u00e9lection globale d&rsquo;alertes positives, tandis que <span class=\"arabpsy-math-inline\" data-latex=\"\\hat{N}_- = \\text{FN} + \\text{VN}\">$\\hat{N}_- = \\text{FN} + \\text{VN}$<\/span> comptabilise les assignations de neutralit\u00e9. Avant toute exploitation num\u00e9rique avanc\u00e9e, l&rsquo;analyste se doit de v\u00e9rifier la coh\u00e9rence interne des comptages : toute divergence entre la somme des \u00e9l\u00e9ments int\u00e9rieurs de la matrice et l&rsquo;effectif global des observations signale une anomalie d&rsquo;\u00e9chantillonnage ou une fuite de donn\u00e9es lors de la vectorisation.<\/p>\n<h3>3.3 3.3 Interpr\u00e9tation qualitative des quadrants d\u00e9cisionnels<\/h3>\n<p>L&rsquo;interpr\u00e9tation qualitative des quadrants de la matrice de confusion \u00e9claire directement la validit\u00e9 de construit de la cha\u00eene de traitement pr\u00e9dictif. Les quadrants de concordance diagonale (<span class=\"arabpsy-math-inline\" data-latex=\"\\text{VP}\">$\\text{VP}$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"\\text{VN}\">$\\text{VN}$<\/span>) mat\u00e9rialisent la stabilit\u00e9 du consensus empirique entre les caract\u00e9ristiques multidimensionnelles extraites par le mod\u00e8le et la r\u00e9alit\u00e9 du ph\u00e9nom\u00e8ne physique ou psychologique observ\u00e9. En revanche, les quadrants antidiagonaux r\u00e9v\u00e8lent la nature et la g\u00e9om\u00e9trie des incertitudes aux fronti\u00e8res de d\u00e9cision statistique.<\/p>\n<p>Une pr\u00e9dominance anormale de faux positifs trahit un syst\u00e8me hypersensible ou mal calibr\u00e9, captant des art\u00e9facts al\u00e9atoires et les interpr\u00e9tant comme du signal discriminant. Dans les mod\u00e8les param\u00e9triques probabilistes, cela d\u00e9coule fr\u00e9quemment d&rsquo;un d\u00e9calage structural des probabilit\u00e9s <em>a posteriori<\/em> induit par un surajustement (<em>overfitting<\/em>) sur le bruit d&rsquo;apprentissage. Inversement, une accumulation disproportionn\u00e9e de faux n\u00e9gatifs d\u00e9note un conservatisme outrancier, caract\u00e9ristique d&rsquo;un mod\u00e8le brid\u00e9 par une r\u00e9gularisation excessive (p\u00e9nalit\u00e9s L1 ou L2 trop intenses) ou incapable de capturer les corr\u00e9lations non-lin\u00e9aires complexes faute d&rsquo;une capacit\u00e9 repr\u00e9sentationnelle suffisante. Il convient de souligner le r\u00f4le d\u00e9terminant de la distribution <em>a priori<\/em> : en pr\u00e9sence d&rsquo;une pr\u00e9valence infime, m\u00eame un classifieur poss\u00e9dant d&rsquo;excellentes caract\u00e9ristiques intrins\u00e8ques produira une proportion substantielle de faux positifs parmi ses alarmes, illustrant le paradoxe classique des tests de d\u00e9pistage de masse.<\/p>\n<h2>4. 4. Exemple concret guid\u00e9 : Calcul manuel \u00e9tape par \u00e9tape<\/h2>\n<h3>4.1 4.1 Pr\u00e9sentation de l&rsquo;\u00e9tude de cas (400 observations)<\/h3>\n<p>Afin d&rsquo;ancrer ces d\u00e9veloppements th\u00e9oriques dans une r\u00e9alit\u00e9 tangible et v\u00e9rifiable, d\u00e9ployons une \u00e9tude de cas num\u00e9rique contr\u00f4l\u00e9e. Imaginons un protocole pr\u00e9dictif en sciences m\u00e9dicales portant sur la d\u00e9tection automatis\u00e9e d&rsquo;un biomarqueur indicateur d&rsquo;un d\u00e9ficit cognitif pr\u00e9coce, appliqu\u00e9 \u00e0 une cohorte standardis\u00e9e de <span class=\"arabpsy-math-inline\" data-latex=\"N = 400\">$N = 400$<\/span> patients \u00e9valu\u00e9s par r\u00e9gression logistique. \u00c0 l&rsquo;issue de la phase d&rsquo;inf\u00e9rence statistique sur un jeu de test ind\u00e9pendant herm\u00e9tique, les observations sont ventil\u00e9es selon les quatre quadrants de la matrice de confusion :<\/p>\n<ul>\n<li><strong>Vrais Positifs (<span class=\"arabpsy-math-inline\" data-latex=\"\\text{VP}\">$\\text{VP}$<\/span>) :<\/strong> $120$ patients porteurs du d\u00e9ficit sont correctement identifi\u00e9s.<\/li>\n<li><strong>Faux Positifs (<span class=\"arabpsy-math-inline\" data-latex=\"\\text{FP}\">$\\text{FP}$<\/span>) :<\/strong> $70$ patients sains sont faussement d\u00e9clar\u00e9s porteurs du d\u00e9ficit.<\/li>\n<li><strong>Faux N\u00e9gatifs (<span class=\"arabpsy-math-inline\" data-latex=\"\\text{FN}\">$\\text{FN}$<\/span>) :<\/strong> $40$ patients r\u00e9ellement atteints sont omis par le syst\u00e8me de d\u00e9tection.<\/li>\n<li><strong>Vrais N\u00e9gatifs (<span class=\"arabpsy-math-inline\" data-latex=\"\\text{VN}\">$\\text{VN}$<\/span>) :<\/strong> $170$ patients sains sont correctement classifi\u00e9s comme indemnes.<\/li>\n<\/ul>\n<p>La pr\u00e9valence empirique de la pathologie s&rsquo;\u00e9tablit \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"(\\text{VP} + \\text{FN}) \/ N = (120 + 40) \/ 400 = 160 \/ 400 = 0{,}40\">$(\\text{VP} + \\text{FN}) \/ N = (120 + 40) \/ 400 = 160 \/ 400 = 0{,}40$<\/span>, soit exactement <span class=\"arabpsy-math-inline\" data-latex=\"40,%\">$40,%$<\/span> de la population. Le mod\u00e8le g\u00e9n\u00e8re un volume d&rsquo;alertes positives s&rsquo;\u00e9levant \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"\\text{VP} + \\text{FP} = 120 + 70 = 190\">$\\text{VP} + \\text{FP} = 120 + 70 = 190$<\/span> cas, repr\u00e9sentant un taux de s\u00e9lection globale de <span class=\"arabpsy-math-inline\" data-latex=\"190 \/ 400 = 47{,}5,%\">$190 \/ 400 = 47{,}5,%$<\/span>. Ces grandeurs pos\u00e9es, proc\u00e9dons \u00e0 la d\u00e9composition analytique pas \u00e0 pas.<\/p>\n<h3>4.2 4.2 Calcul manuel rigoureux de la pr\u00e9cision<\/h3>\n<p>La pr\u00e9cision statistique du mod\u00e8le s&rsquo;obtient en isolant le quadrant des vrais positifs et en le rapportant au total de la marge pr\u00e9dictive positive. En appliquant formellement la formule d\u00e9finie pr\u00e9c\u00e9demment :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Pr\u00e9cision} = \\frac{\\text{VP}}{\\text{VP} + \\text{FP}}\">$$\\text{Pr\u00e9cision} = \\frac{\\text{VP}}{\\text{VP} + \\text{FP}}$$<\/span><\/p>\n<p>Ins\u00e9rons les valeurs num\u00e9riques issues de notre cohorte de 400 sujets :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Pr\u00e9cision} = \\frac{120}{120 + 70} = \\frac{120}{190}\">$$\\text{Pr\u00e9cision} = \\frac{120}{120 + 70} = \\frac{120}{190}$$<\/span><\/p>\n<p>La r\u00e9solution de cette fraction rationnelle produit la valeur d\u00e9cimale suivante :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Pr\u00e9cision} = \\frac{12}{19} \\approx 0{,}631578947...\">$$\\text{Pr\u00e9cision} = \\frac{12}{19} \\approx 0{,}631578947&#8230;$$<\/span><\/p>\n<p>En arrondissant cette grandeur \u00e0 cinq d\u00e9cimales significatives, nous \u00e9tablissons que la pr\u00e9cision op\u00e9rationnelle est de <span class=\"arabpsy-math-inline\" data-latex=\"0{,}63158\">$0{,}63158$<\/span>, soit un taux d&rsquo;exactitude positive de <span class=\"arabpsy-math-inline\" data-latex=\"63{,}16,%\">$63{,}16,%$<\/span>. Cela signifie concr\u00e8tement que lorsqu&rsquo;un clinicien re\u00e7oit une notification positive \u00e9mise par l&rsquo;algorithme, il existe une probabilit\u00e9 d&rsquo;environ <span class=\"arabpsy-math-inline\" data-latex=\"63{,}2,%\">$63{,}2,%$<\/span> que le patient pr\u00e9sente effectivement l&rsquo;anomalie neurocognitive, et une probabilit\u00e9 compl\u00e9mentaire de <span class=\"arabpsy-math-inline\" data-latex=\"36{,}8,%\">$36{,}8,%$<\/span> que cette alerte corresponde \u00e0 une d\u00e9faillance de Type I mobilisant des investigations compl\u00e9mentaires st\u00e9riles.<\/p>\n<h3>4.3 4.3 Calcul manuel rigoureux du rappel<\/h3>\n<p>Examinons \u00e0 pr\u00e9sent la capacit\u00e9 d&rsquo;interception du syst\u00e8me diagnostique en calculant le rappel empirique. Nous confrontons les vrais positifs \u00e0 l&rsquo;int\u00e9gralit\u00e9 des manifestations pathologiques r\u00e9elles pr\u00e9sentes dans la cohorte :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Rappel} = \\frac{\\text{VP}}{\\text{VP} + \\text{FN}}\">$$\\text{Rappel} = \\frac{\\text{VP}}{\\text{VP} + \\text{FN}}$$<\/span><\/p>\n<p>La substitution arithm\u00e9tique donne :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Rappel} = \\frac{120}{120 + 40} = \\frac{120}{160}\">$$\\text{Rappel} = \\frac{120}{120 + 40} = \\frac{120}{160}$$<\/span><\/p>\n<p>Cette fraction se simplifie imm\u00e9diatement sous forme exacte :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Rappel} = \\frac{3}{4} = 0{,}75000\">$$\\text{Rappel} = \\frac{3}{4} = 0{,}75000$$<\/span><\/p>\n<p>Le rappel s&rsquo;\u00e9tablit rigoureusement \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"75{,}0,%\">$75{,}0,%$<\/span>. D&rsquo;un point de vue clinique, le mod\u00e8le capture avec succ\u00e8s les trois quarts des individus manifestant la pathologie sous-jacente. Cependant, un quart (<span class=\"arabpsy-math-inline\" data-latex=\"25,%\">$25,%$<\/span>) des patients atteints \u00e9chappe \u00e0 l&rsquo;algorithme, constituant un r\u00e9servoir de 40 faux n\u00e9gatifs dont la prise en charge th\u00e9rapeutique se verra diff\u00e9r\u00e9e. Cette d\u00e9perdition de 25 % fixe la limite de couverture op\u00e9rationnelle de l&rsquo;estimateur.<\/p>\n<h3>4.4 4.4 Synth\u00e8se manuelle du score F1<\/h3>\n<p>Ayant quantifi\u00e9 avec pr\u00e9cision les deux composantes vectorielles de notre syst\u00e8me pr\u00e9dictif (<span class=\"arabpsy-math-inline\" data-latex=\"P \\approx 0{,}631579\">$P \\approx 0{,}631579$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"R = 0{,}75\">$R = 0{,}75$<\/span>), nous proc\u00e9dons \u00e0 l&rsquo;assemblage harmonique destin\u00e9 \u00e0 produire le score F1 final :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_1 = 2 \\cdot \\frac{\\text{Pr\u00e9cision} \\cdot \\text{Rappel}}{\\text{Pr\u00e9cision} + \\text{Rappel}}\">$$F_1 = 2 \\cdot \\frac{\\text{Pr\u00e9cision} \\cdot \\text{Rappel}}{\\text{Pr\u00e9cision} + \\text{Rappel}}$$<\/span><\/p>\n<p>D\u00e9composons les op\u00e9rations interm\u00e9diaires afin de garantir une transparence arithm\u00e9tique totale :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Num\u00e9rateur} = 2 \\cdot (0{,}63157895 \\cdot 0{,}75) = 2 \\cdot 0{,}47368421 = 0{,}94736842\">$$\\text{Num\u00e9rateur} = 2 \\cdot (0{,}63157895 \\cdot 0{,}75) = 2 \\cdot 0{,}47368421 = 0{,}94736842$$<\/span><\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{D\u00e9nominateur} = 0{,}63157895 + 0{,}75 = 1{,}38157895\">$$\\text{D\u00e9nominateur} = 0{,}63157895 + 0{,}75 = 1{,}38157895$$<\/span><\/p>\n<p>En effectuant la division finale :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_1 = \\frac{0{,}94736842}{1{,}38157895} \\approx 0{,}68571428...\">$$F_1 = \\frac{0{,}94736842}{1{,}38157895} \\approx 0{,}68571428&#8230;$$<\/span><\/p>\n<p>Alternativement, le calcul direct via la formule matricielle brute valide sans \u00e9quivoque cette convergence :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_1 = \\frac{2 \\cdot \\text{VP}}{2 \\cdot \\text{VP} + \\text{FP} + \\text{FN}} = \\frac{2 \\cdot 120}{(2 \\cdot 120) + 70 + 40} = \\frac{240}{240 + 110} = \\frac{240}{350} = \\frac{24}{35} \\approx 0{,}685714...\">$$F_1 = \\frac{2 \\cdot \\text{VP}}{2 \\cdot \\text{VP} + \\text{FP} + \\text{FN}} = \\frac{2 \\cdot 120}{(2 \\cdot 120) + 70 + 40} = \\frac{240}{240 + 110} = \\frac{240}{350} = \\frac{24}{35} \\approx 0{,}685714&#8230;$$<\/span><\/p>\n<p>Le score F1 arrondi \u00e0 quatre d\u00e9cimales est donc de <strong>0,6857<\/strong>. L&rsquo;\u00e9valuation critique de cette m\u00e9trique d\u00e9montre que le mod\u00e8le offre une performance interm\u00e9diaire : bien que son rappel (<span class=\"arabpsy-math-inline\" data-latex=\"0{,}75\">$0{,}75$<\/span>) soit relativement robuste, sa pr\u00e9cision m\u00e9diocre (<span class=\"arabpsy-math-inline\" data-latex=\"0{,}6316\">$0{,}6316$<\/span>) d\u00e9grade substantiellement son harmonisation globale, ramenant la performance effective en de\u00e7\u00e0 du seuil usuel d&rsquo;excellence industrielle g\u00e9n\u00e9ralement situ\u00e9 \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"0{,}80\">$0{,}80$<\/span>.<\/p>\n<h2>5. 5. Configuration de l&rsquo;environnement de d\u00e9veloppement Python<\/h2>\n<h3>5.1 5.1 Gestion des d\u00e9pendances logicielles et environnements virtuels<\/h3>\n<p>La reproductibilit\u00e9 exp\u00e9rimentale en science des donn\u00e9es moderne impose une isolation stricte des environnements d&rsquo;ex\u00e9cution logicielle. L&rsquo;utilisation indiscrimin\u00e9e de l&rsquo;interpr\u00e9teur Python global du syst\u00e8me d&rsquo;exploitation expose l&rsquo;infrastructure \u00e0 des collisions de d\u00e9pendances et \u00e0 des ruptures de compatibilit\u00e9 ascendante cons\u00e9cutives aux mises \u00e0 jour des biblioth\u00e8ques scientifiques tierces. Deux m\u00e9thodologies dominent le paysage technique : l&rsquo;utilitaire standardis\u00e9 <code>venv<\/code> int\u00e9gr\u00e9 \u00e0 la biblioth\u00e8que standard Python et la plateforme de gestion d&rsquo;environnements et de paquets distribu\u00e9e <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/docs.conda.io\/en\/latest\/\">Conda<\/a>.<\/p>\n<p>Pour initialiser un environnement herm\u00e9tique reposant sur les outils natifs de Python 3, la s\u00e9quence de commandes dans un terminal shell s&rsquo;articule comme suit :<\/p>\n<p><code>python3 -m venv f1_evaluation_env<\/code><\/p>\n<p><code>source f1_evaluation_env\/bin\/activate<\/code> (sur distributions Linux\/macOS) ou <code>f1_evaluation_envScriptsactivate.bat<\/code> (sous environnement Microsoft Windows).<\/p>\n<p>Une fois l&rsquo;environnement activ\u00e9, l&rsquo;installation d\u00e9terministe des versions stables et v\u00e9rifi\u00e9es des d\u00e9pendances de calcul num\u00e9rique et d&rsquo;apprentissage statistique s&rsquo;ex\u00e9cute par l&rsquo;entremise du gestionnaire de paquets <code>pip<\/code> :<\/p>\n<p><code>pip install --upgrade pip<\/code><\/p>\n<p><code>pip install numpy==1.26.4 scipy==1.13.0 scikit-learn==1.4.2 pandas==2.2.2 matplotlib==3.8.4 seaborn==0.13.2<\/code><\/p>\n<p>Cette rigueur de versionnage garantit que les algorithmes d&rsquo;arrondi d\u00e9cimal sous-jacents, les routines d&rsquo;alg\u00e8bre lin\u00e9aire compil\u00e9es en Fortran ou C (BLAS\/LAPACK) et les conventions matricielles restent strictement stables d&rsquo;une machine \u00e0 une autre.<\/p>\n<h3>5.2 5.2 Importation des modules analytiques n\u00e9cessaires<\/h3>\n<p>La mise en place d&rsquo;un script d&rsquo;analyse statistique conforme aux normes architecturales requiert une structuration claire des importations en t\u00eate de fichier, en dissociant les primitives de manipulation vectorielle des fonctions d\u00e9di\u00e9es \u00e0 l&rsquo;\u00e9valuation psychom\u00e9trique ou algorithmique. Nous mobilisons principalement l&rsquo;API <code>metrics<\/code> de la suite logicielle <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/scikit-learn.org\/stable\/\">Scikit-Learn<\/a> conjointement au moteur de calcul tensoriel <code>NumPy<\/code>.<\/p>\n<p>L&rsquo;en-t\u00eate programmatique s&rsquo;\u00e9tablit selon les meilleures pratiques du typage statique moderne (PEP 484) :<\/p>\n<p><code>import numpy as np<\/code><\/p>\n<p><code>import pandas as pd<\/code><\/p>\n<p><code>from typing import Tuple, Dict, Any, Union<\/code><\/p>\n<p><code>from sklearn.metrics import f1_score, precision_score, recall_score, confusion_matrix, classification_report<\/code><\/p>\n<p>L&rsquo;int\u00e9gration du module <code>typing<\/code> conf\u00e8re aux fonctions une documentation intrins\u00e8que facilitant la maintenance logicielle et l&rsquo;int\u00e9gration continue au sein de pipelines de production. NumPy fournit l&rsquo;infrastructure vectorielle pour la gestion des tableaux contigus en m\u00e9moire, optimisant les op\u00e9rations bool\u00e9ennes par vectorisation SIMD (<em>Single Instruction, Multiple Data<\/em>), tandis que Scikit-Learn apporte des routines industrielles optimis\u00e9es pour le calcul des scores statistiques.<\/p>\n<h2>6. 6. Impl\u00e9mentation du score F1 avec Scikit-Learn (Exemple complet)<\/h2>\n<h3>6.1 6.1 Reconstruction programmatique du jeu de donn\u00e9es vectoriel<\/h3>\n<p>Afin de reproduire informatiquement l&rsquo;\u00e9tude de cas des 400 observations men\u00e9e manuellement au chapitre pr\u00e9c\u00e9dent, nous devons construire deux vecteurs unidimensionnels : le vecteur des \u00e9tiquettes de r\u00e9f\u00e9rence empirique (v\u00e9rit\u00e9 terrain, couramment d\u00e9sign\u00e9 <code>y_true<\/code>) et le vecteur des assignations mod\u00e9lis\u00e9es (pr\u00e9dictions algorithmiques, d\u00e9sign\u00e9 <code>y_pred<\/code>). Ces structures doivent refl\u00e9ter rigoureusement la distribution des quatre quadrants : 120 vrais positifs, 70 faux positifs, 40 faux n\u00e9gatifs et 170 vrais n\u00e9gatifs.<\/p>\n<p>La g\u00e9n\u00e9ration vectorielle programmatique s&rsquo;op\u00e8re par concat\u00e9nation de tableaux contigus via NumPy :<\/p>\n<p><code>y_true = np.concatenate([np.ones(120, dtype=int), np.zeros(70, dtype=int), np.ones(40, dtype=int), np.zeros(170, dtype=int)])<\/code><\/p>\n<p><code>y_pred = np.concatenate([np.ones(120, dtype=int), np.ones(70, dtype=int), np.zeros(40, dtype=int), np.zeros(170, dtype=int)])<\/code><\/p>\n<p>Une \u00e9tape de v\u00e9rification d&rsquo;int\u00e9grit\u00e9 structurelle s&rsquo;impose imm\u00e9diatement :<\/p>\n<p><code>assert len(y_true) == 400, \"L'effectif total diverge de la cohorte th\u00e9orique de 400\"<\/code><\/p>\n<p><code>assert len(y_pred) == 400, \"Incompatibilit\u00e9 dimensionnelle entre v\u00e9rit\u00e9 terrain et pr\u00e9diction\"<\/code><\/p>\n<p><code>print(f\"Dimensions valid\u00e9es : y_true.shape = {y_true.shape}, y_pred.shape = {y_pred.shape}\")<\/code><\/p>\n<p>Cette approche vectorielle garantit que les observations sont formellement index\u00e9es de 0 \u00e0 399, simulant fid\u00e8lement la restitution brute des sorties d&rsquo;un estimateur binaire.<\/p>\n<h3>6.2 6.2 Utilisation de la fonction <code>f1_score<\/code><\/h3>\n<p>La biblioth\u00e8que Scikit-Learn encapsule l&rsquo;\u00e9valuation de cette m\u00e9trique au sein de la fonction universelle <code>f1_score<\/code> localis\u00e9e dans le sous-module <code>sklearn.metrics<\/code>. Dans une configuration binaire classique o\u00f9 la classe cible est conventionnellement encod\u00e9e par l&rsquo;entier $1$, l&rsquo;invocation canonique n\u00e9cessite simplement la transmission des tableaux de v\u00e9rit\u00e9s et d&rsquo;inf\u00e9rences :<\/p>\n<p><code>score_f1_sklearn = f1_score(y_true, y_pred)<\/code><\/p>\n<p><code>print(f\"Score F1 calcul\u00e9 via scikit-learn : {score_f1_sklearn:.6f}\")<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de cette instruction dans l&rsquo;interpr\u00e9teur Python affiche la sortie suivante :<\/p>\n<p><code>Score F1 calcul\u00e9 via scikit-learn : 0.685714<\/code><\/p>\n<p>Par d\u00e9faut, l&rsquo;argument <code>pos_label<\/code> est fix\u00e9 \u00e0 <code>1<\/code> et le param\u00e8tre d&rsquo;agr\u00e9gation <code>average<\/code> est configur\u00e9 sur <code>'binary'<\/code>. Cette valeur num\u00e9rique concorde scrupuleusement, au dix-millioni\u00e8me pr\u00e8s, avec la fraction rationnelle <span class=\"arabpsy-math-inline\" data-latex=\"24\/35 \\approx 0{,}6857142857\">$24\/35 \\approx 0{,}6857142857$<\/span> \u00e9tablie lors du calcul manuel pas \u00e0 pas. La routine interne de Scikit-Learn calcule implicitement la pr\u00e9cision et le rappel interm\u00e9diaires avant d&rsquo;appliquer la formule harmonique avec gestion native des arrondis en virgule flottante double pr\u00e9cision (IEEE 754).<\/p>\n<h3>6.3 6.3 Extraction conjointe via <code>classification_report<\/code><\/h3>\n<p>Bien que l&rsquo;extraction isol\u00e9e du score F1 offre une synth\u00e8se pr\u00e9cieuse, le diagnostic holistique d&rsquo;un mod\u00e8le pr\u00e9dictif gagne \u00e0 \u00eatre contextualis\u00e9 au moyen d&rsquo;un tableau d&rsquo;\u00e9valuation matriciel complet. La fonction <code>classification_report<\/code> g\u00e9n\u00e8re une synth\u00e8se textuelle structur\u00e9e restituant les valeurs de pr\u00e9cision, de rappel, de score F1 ainsi que le support empirique (le volume d&rsquo;occurrences r\u00e9elles) pour l&rsquo;int\u00e9gralit\u00e9 des classes du syst\u00e8me :<\/p>\n<p><code>rapport = classification_report(y_true, y_pred, digits=4)<\/code><\/p>\n<p><code>print(rapport)<\/code><\/p>\n<p>Le r\u00e9sultat g\u00e9n\u00e9r\u00e9 en console s&rsquo;articule comme suit :<\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;precision&nbsp;&nbsp;&nbsp;&nbsp;recall&nbsp;&nbsp;f1-score&nbsp;&nbsp;&nbsp;support<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.8095&nbsp;&nbsp;&nbsp;&nbsp;0.7083&nbsp;&nbsp;&nbsp;&nbsp;0.7556&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;240<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.6316&nbsp;&nbsp;&nbsp;&nbsp;0.7500&nbsp;&nbsp;&nbsp;&nbsp;0.6857&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;&nbsp;accuracy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.7250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;400<\/code><\/p>\n<p><code>&nbsp;&nbsp;&nbsp;macro avg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.7206&nbsp;&nbsp;&nbsp;&nbsp;0.7292&nbsp;&nbsp;&nbsp;&nbsp;0.7206&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;400<\/code><\/p>\n<p><code>weighted avg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.7384&nbsp;&nbsp;&nbsp;&nbsp;0.7250&nbsp;&nbsp;&nbsp;&nbsp;0.7276&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;400<\/code><\/p>\n<p>Cette restitution met en \u00e9vidence la dualit\u00e9 du mod\u00e8le : la classe n\u00e9gative ($0$) dispose d&rsquo;un F1 sup\u00e9rieur (<span class=\"arabpsy-math-inline\" data-latex=\"0{,}7556\">$0{,}7556$<\/span>) port\u00e9 par une forte pr\u00e9cision (<span class=\"arabpsy-math-inline\" data-latex=\"0{,}8095\">$0{,}8095$<\/span>), tandis que la classe positive ($1$) subit une p\u00e9nalisation de sa pr\u00e9cision (<span class=\"arabpsy-math-inline\" data-latex=\"0{,}6316\">$0{,}6316$<\/span>). L&rsquo;exactitude globale (<em>accuracy<\/em>) s&rsquo;\u00e9tablit \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"72{,}5,%\">$72{,}5,%$<\/span>, une valeur interm\u00e9diaire qui masque la dynamique diff\u00e9rentielle sous-jacente des taux d&rsquo;erreur.<\/p>\n<h2>7. 7. Impl\u00e9mentation algorithmique native (From Scratch) en Python et NumPy<\/h2>\n<h3>7.1 7.1 Conception de la fonction matricielle personnalis\u00e9e<\/h3>\n<p>L&rsquo;impl\u00e9mentation native sans recours aux modules sp\u00e9cialis\u00e9s d&rsquo;apprentissage automatique constitue un exercice fondamental pour valider la compr\u00e9hension algorithmique interne et se pr\u00e9munir contre les comportements de type \u00ab bo\u00eete noire \u00bb. En s&rsquo;appuyant sur l&rsquo;alg\u00e8bre bool\u00e9enne vectoris\u00e9e offerte par NumPy, il est possible de formuler une fonction personnalis\u00e9e hautement performante, capable de traiter des millions d&rsquo;\u00e9l\u00e9ments en quelques millisecondes.<\/p>\n<p>Consid\u00e9rons la fonction suivante, incluant la gestion d&rsquo;un epsilon infinit\u00e9simal destin\u00e9 \u00e0 neutraliser les ind\u00e9terminations statistiques lors d&rsquo;\u00e9ventuelles divisions par z\u00e9ro :<\/p>\n<p><code>def calculer_score_f1_natif(y_reel: np.ndarray, y_predit: np.ndarray, zero_division: float = 0.0) -&gt; float:<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;y_reel = np.asarray(y_reel, dtype=bool)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;y_predit = np.asarray(y_predit, dtype=bool)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;vrais_positifs = np.sum(y_reel &amp; y_predit)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;faux_positifs = np.sum(~y_reel &amp; y_predit)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;faux_negatifs = np.sum(y_reel &amp; ~y_predit)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;denominateur = (2 * vrais_positifs) + faux_positifs + faux_negatifs<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;if denominateur == 0:<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return zero_division<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;return float((2 * vrais_positifs) \/ denominateur)<\/code><\/p>\n<p>Cette approche convertit les vecteurs num\u00e9riques en tableaux bool\u00e9ens contigus en m\u00e9moire. Les op\u00e9rations logiques <code>&amp;<\/code> (conjonction) et <code>~<\/code> (n\u00e9gation unaire) g\u00e9n\u00e8rent des masques de s\u00e9lection instantan\u00e9s dont la sommation matricielle restitue les grandeurs fondamentales <span class=\"arabpsy-math-inline\" data-latex=\"\\text{VP}\">$\\text{VP}$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"\\text{FP}\">$\\text{FP}$<\/span> et <span class=\"arabpsy-math-inline\" data-latex=\"\\text{FN}\">$\\text{FN}$<\/span> sans mobiliser aucune boucle it\u00e9rative explicite en Python pur, \u00e9vitant ainsi le surco\u00fbt de l&rsquo;interpr\u00e9teur.<\/p>\n<h3>7.2 7.2 Benchmark et validation crois\u00e9e avec Scikit-Learn<\/h3>\n<p>Pour attester de la validit\u00e9 math\u00e9matique et de la rigueur de notre impl\u00e9mentation native, nous proc\u00e9dons \u00e0 une comparaison crois\u00e9e directe sur le jeu de donn\u00e9es de notre \u00e9tude de cas, suivie d&rsquo;un banc d&rsquo;essai comparatif de v\u00e9locit\u00e9 (<em>benchmark<\/em>).<\/p>\n<p><code>score_natif = calculer_score_f1_natif(y_true, y_pred)<\/code><\/p>\n<p><code>score_sklearn = f1_score(y_true, y_pred)<\/code><\/p>\n<p><code>tolerance_absolue = 1e-12<\/code><\/p>\n<p><code>assert abs(score_natif - score_sklearn) &lt; tolerance_absolue, \"Divergence num\u00e9rique constat\u00e9e\"<\/code><\/p>\n<p><code>print(f\"Validation crois\u00e9e r\u00e9ussie : \u00c9cart = {abs(score_natif - score_sklearn):.2e}\")<\/code><\/p>\n<p>La concordance num\u00e9rique est absolue, l&rsquo;\u00e9cart \u00e9tant inf\u00e9rieur \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"10^{-16}\">$10^{-16}$<\/span>, correspondant \u00e0 la limite de pr\u00e9cision machine pour les calculs en virgule flottante double pr\u00e9cision 64 bits. Lorsqu&rsquo;il s&rsquo;agit d&rsquo;\u00e9valuer le temps d&rsquo;ex\u00e9cution sur un \u00e9chantillon massif de <span class=\"arabpsy-math-inline\" data-latex=\"10^7\">$10^7$<\/span> observations g\u00e9n\u00e9r\u00e9es al\u00e9atoirement, la fonction native vectoris\u00e9e s&rsquo;av\u00e8re particuli\u00e8rement comp\u00e9titive :<\/p>\n<p><code>y_large_true = np.random.randint(0, 2, size=10_000_000)<\/code><\/p>\n<p><code>y_large_pred = np.random.randint(0, 2, size=10_000_000)<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de la routine native via <code>timeit<\/code> requiert approximativement 18 millisecondes, d\u00e9montrant que le traitement vectoris\u00e9 pur sans surcharge d&rsquo;abstraction logicielle permet des calculs \u00e0 haute cadence dans le cadre d&rsquo;optimisations g\u00e9n\u00e9tiques d&rsquo;hyperparam\u00e8tres ou de simulations de Monte-Carlo intensives.<\/p>\n<h2>8. 8. Extension aux classifications multiclasses et strat\u00e9gies d&rsquo;agr\u00e9gation<\/h2>\n<h3>8.1 8.1 La moyenne macro (<code>average='macro'<\/code>)<\/h3>\n<p>Lorsque la variable d\u00e9pendante s&rsquo;\u00e9tend au-del\u00e0 du cadre binaire pour embrasser un espace polytomique \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"K\">$K$<\/span> modalit\u00e9s discr\u00e8tes, l&rsquo;\u00e9valuation par le score F1 requiert une strat\u00e9gie d&rsquo;agr\u00e9gation explicite. La premi\u00e8re m\u00e9thodologie canonique est la moyenne macro (<em>Macro-average<\/em>). Son principe math\u00e9matique consiste \u00e0 scinder le probl\u00e8me multiclasse en <span class=\"arabpsy-math-inline\" data-latex=\"K\">$K$<\/span> sous-probl\u00e8mes binaires ind\u00e9pendants selon le paradigme \u00ab Un contre Tous \u00bb (<em>One-vs-Rest<\/em>). Pour chaque modalit\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"k in {1, dots, K}\">$k in {1, dots, K}$<\/span>, la classe <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> est trait\u00e9e comme la classe positive et l&rsquo;ensemble des autres classes comme la classe n\u00e9gative, permettant de calculer un score individuel <span class=\"arabpsy-math-inline\" data-latex=\"F_1^{(k)}\">$F_1^{(k)}$<\/span>.<\/p>\n<p>La moyenne macro est simplement la moyenne arithm\u00e9tique non pond\u00e9r\u00e9e de ces <span class=\"arabpsy-math-inline\" data-latex=\"K\">$K$<\/span> scores ind\u00e9pendants :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_1^{\\text{macro}} = \\frac{1}{K} \\sum_{k=1}^{K} F_1^{(k)}\">$$F_1^{\\text{macro}} = \\frac{1}{K} \\sum_{k=1}^{K} F_1^{(k)}$$<\/span><\/p>\n<p>Cette approche conf\u00e8re un poids strictement identique \u00e0 chaque classe, ind\u00e9pendamment de son effectif ou de sa raret\u00e9 dans l&rsquo;\u00e9chantillon d&rsquo;\u00e9valuation. Par cons\u00e9quent, la moyenne macro p\u00e9nalise tr\u00e8s lourdement les mod\u00e8les d\u00e9faillants sur une classe marginale ou minoritaire. Elle constitue le choix m\u00e9thodologique privil\u00e9gi\u00e9 en recherche acad\u00e9mique fondamentale, o\u00f9 l&rsquo;exhaustivit\u00e9 de la d\u00e9couverte conceptuelle pr\u00e9vaut sur la pr\u00e9dominance quantitative des classes majoritaires.<\/p>\n<h3>8.2 8.2 La moyenne micro (<code>average='micro'<\/code>)<\/h3>\n<p>\u00c0 l&rsquo;oppos\u00e9 structurel de la moyenne macro, la strat\u00e9gie de la moyenne micro (<em>Micro-average<\/em>) n&rsquo;agr\u00e8ge pas des scores locaux, mais mutualise directement les comptages bruts des quadrants de confusion \u00e0 l&rsquo;\u00e9chelle de l&rsquo;espace d&rsquo;\u00e9chantillonnage global. Pour chaque classe <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>, les vrais positifs <span class=\"arabpsy-math-inline\" data-latex=\"\\text{VP}_k\">$\\text{VP}_k$<\/span>, faux positifs <span class=\"arabpsy-math-inline\" data-latex=\"\\text{FP}_k\">$\\text{FP}_k$<\/span> et faux n\u00e9gatifs <span class=\"arabpsy-math-inline\" data-latex=\"\\text{FN}_k\">$\\text{FN}_k$<\/span> sont extraits, puis somm\u00e9s unitairement :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{VP}_{\\text{total}} = \\sum_{k=1}^K \\text{VP}_k, \\quad \\text{FP}_{\\text{total}} = \\sum_{k=1}^K \\text{FP}_k, \\quad \\text{FN}_{\\text{total}} = \\sum_{k=1}^K \\text{FN}_k\">$$\\text{VP}_{\\text{total}} = \\sum_{k=1}^K \\text{VP}_k, \\quad \\text{FP}_{\\text{total}} = \\sum_{k=1}^K \\text{FP}_k, \\quad \\text{FN}_{\\text{total}} = \\sum_{k=1}^K \\text{FN}_k$$<\/span><\/p>\n<p>Le score F1 micro est ensuite calcul\u00e9 \u00e0 partir de ces totaux cumul\u00e9s :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_1^{\\text{micro}} = \\frac{2 \\cdot \\text{VP}_{\\text{total}}}{2 \\cdot \\text{VP}_{\\text{total}} + \\text{FP}_{\\text{total}} + \\text{FN}_{\\text{total}}}\">$$F_1^{\\text{micro}} = \\frac{2 \\cdot \\text{VP}_{\\text{total}}}{2 \\cdot \\text{VP}_{\\text{total}} + \\text{FP}_{\\text{total}} + \\text{FN}_{\\text{total}}}$$<\/span><\/p>\n<p>Une propri\u00e9t\u00e9 alg\u00e9brique fondamentale lie le score F1 micro \u00e0 la classification multiclasse standard (\u00e0 \u00e9tiquette unique exclusive) : dans cette configuration, chaque pr\u00e9diction incorrecte constitue simultan\u00e9ment un faux positif pour la classe pr\u00e9dite et un faux n\u00e9gatif pour la classe v\u00e9ritable. Il en r\u00e9sulte que <span class=\"arabpsy-math-inline\" data-latex=\"\\text{FP}_{\\text{total}} = \\text{FN}_{\\text{total}}\">$\\text{FP}_{\\text{total}} = \\text{FN}_{\\text{total}}$<\/span>, ce qui entra\u00eene math\u00e9matiquement l&rsquo;\u00e9galit\u00e9 stricte entre la pr\u00e9cision micro, le rappel micro, le score F1 micro et l&rsquo;exactitude brute (<em>accuracy<\/em>). La moyenne micro refl\u00e8te fid\u00e8lement la performance globale par observation, mais elle est domin\u00e9e par les cat\u00e9gories dominantes au d\u00e9triment des \u00e9v\u00e9nements rares.<\/p>\n<h3>8.3 8.3 La moyenne pond\u00e9r\u00e9e (<code>average='weighted'<\/code>)<\/h3>\n<p>La moyenne pond\u00e9r\u00e9e (<em>Weighted-average<\/em>) cherche \u00e0 op\u00e9rer une synth\u00e8se pragmatique entre l&rsquo;isolation par classe propre \u00e0 la macro-moyenne et la prise en compte de la repr\u00e9sentativit\u00e9 statistique propre \u00e0 la micro-moyenne. Dans ce protocole, le score F1 individuel <span class=\"arabpsy-math-inline\" data-latex=\"F_1^{(k)}\">$F_1^{(k)}$<\/span> de chaque modalit\u00e9 est calcul\u00e9 de fa\u00e7on autonome selon le sch\u00e9ma <em>One-vs-Rest<\/em>, mais son int\u00e9gration dans l&rsquo;indicateur final fait intervenir une pond\u00e9ration proportionnelle \u00e0 son support empirique <span class=\"arabpsy-math-inline\" data-latex=\"N_k\">$N_k$<\/span> (l&rsquo;effectif r\u00e9el d&rsquo;observations appartenant \u00e0 la classe <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>) :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"F_1^{\\text{weighted}} = \\sum_{k=1}^K \\left( \\frac{N_k}{N} \\cdot F_1^{(k)} \\right)\">$$F_1^{\\text{weighted}} = \\sum_{k=1}^K \\left( \\frac{N_k}{N} \\cdot F_1^{(k)} \\right)$$<\/span><\/p>\n<p>Cette m\u00e9trique s&rsquo;av\u00e8re particuli\u00e8rement pertinente en environnement industriel de production lorsque les donn\u00e9es de test reproduisent fid\u00e8lement la distribution d\u00e9mographique du monde r\u00e9el et que l&rsquo;optimisation \u00e9conomique commande de privil\u00e9gier les volumes transactionnels les plus denses. N\u00e9anmoins, elle pr\u00e9sente un risque m\u00e9thodologique notable : elle peut masquer de graves contre-performances sur des classes marginales si celles-ci ne contribuent que marginalement au d\u00e9nominateur du support global. L&rsquo;analyste doit donc faire preuve de discernement en confrontant syst\u00e9matiquement les variantes macro et pond\u00e9r\u00e9e.<\/p>\n<h2>9. 9. \u00c9valuation face au d\u00e9s\u00e9quilibre des classes et comparaison m\u00e9trique<\/h2>\n<h3>9.1 9.1 Vuln\u00e9rabilit\u00e9 de l&rsquo;exactitude (Accuracy Paradox)<\/h3>\n<p>L&rsquo;un des \u00e9cueils les plus pernicieux en statistique appliqu\u00e9e et en apprentissage automatique r\u00e9side dans le ph\u00e9nom\u00e8ne formalis\u00e9 sous l&rsquo;appellation de paradoxe de l&rsquo;exactitude (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Accuracy_paradox\">Accuracy Paradox<\/a>). Ce paradoxe \u00e9merge avec acuit\u00e9 lors du traitement de populations hautement asym\u00e9triques o\u00f9 la pr\u00e9valence de la classe positive est n\u00e9gligeable par rapport \u00e0 la classe n\u00e9gative. Consid\u00e9rons un \u00e9chantillon de validation clinique comprenant $10,000$ sujets au sein duquel seulement $50$ individus pr\u00e9sentent un gliome c\u00e9r\u00e9bral de bas grade, les $9,950$ autres sujets \u00e9tant sains.<\/p>\n<p>Un mod\u00e8le trivial, se bornant \u00e0 pr\u00e9dire de mani\u00e8re d\u00e9terministe la n\u00e9gativit\u00e9 (<span class=\"arabpsy-math-inline\" data-latex=\"\\hat{Y} = 0\">$\\hat{Y} = 0$<\/span>) pour l&rsquo;ensemble des cas, obtiendrait la matrice de confusion suivante : <span class=\"arabpsy-math-inline\" data-latex=\"\\text{VP} = 0\">$\\text{VP} = 0$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"\\text{FP} = 0\">$\\text{FP} = 0$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"\\text{FN} = 50\">$\\text{FN} = 50$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"\\text{VN} = 9,950\">$\\text{VN} = 9,950$<\/span>. L&rsquo;exactitude globale de ce pr\u00e9dicteur nul est \u00e9clatante :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{Exactitude} = \\frac{0 + 9,950}{10,000} = 99{,}5,%\">$$\\text{Exactitude} = \\frac{0 + 9,950}{10,000} = 99{,}5,%$$<\/span><\/p>\n<p>Un rapport d&rsquo;\u00e9valuation na\u00eff conclurait \u00e0 un syst\u00e8me quasi infaillible. Or, son utilit\u00e9 clinique est strictement nulle. Calculons \u00e0 pr\u00e9sent son score F1 :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"P = \\frac{0}{0 + 0} implies 0, \\quad R = \\frac{0}{0 + 50} = 0 implies F_1 = 0{,}0000\">$$P = \\frac{0}{0 + 0} implies 0, \\quad R = \\frac{0}{0 + 50} = 0 implies F_1 = 0{,}0000$$<\/span><\/p>\n<p>Le score F1 d\u00e9masque instantan\u00e9ment la faillite op\u00e9rationnelle compl\u00e8te de l&rsquo;estimateur. En excluant les vrais n\u00e9gatifs de son \u00e9quation, le score F1 concentre exclusivement son \u00e9valuation sur la dynamique de d\u00e9tection de la classe critique, fournissant un rempart m\u00e9thodologique contre les illusions statistiques g\u00e9n\u00e9r\u00e9es par le d\u00e9s\u00e9quilibre de classes.<\/p>\n<h3>9.2 9.2 Confrontation avec le score ROC-AUC et le coefficient de Matthews (MCC)<\/h3>\n<p>Le score F1 ne constitue pas l&rsquo;unique alternative \u00e0 l&rsquo;exactitude brute. Deux autres m\u00e9triques occupent une place pr\u00e9pond\u00e9rante dans la litt\u00e9rature : l&rsquo;aire sous la courbe des caract\u00e9ristiques d&rsquo;exploitation du r\u00e9cepteur (ROC-AUC) et le coefficient de corr\u00e9lation de Matthews (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Phi_coefficient\">Matthews Correlation Coefficient, MCC<\/a>).<\/p>\n<p>La courbe ROC met en relation le taux de vrais positifs (rappel) et le taux de faux positifs (<span class=\"arabpsy-math-inline\" data-latex=\"\\text{TFP} = \\text{FP} \/ (\\text{FP} + \\text{VN})\">$\\text{TFP} = \\text{FP} \/ (\\text{FP} + \\text{VN})$<\/span>). La pr\u00e9sence du terme <span class=\"arabpsy-math-inline\" data-latex=\"\\text{VN}\">$\\text{VN}$<\/span> au d\u00e9nominateur du TFP rend le score ROC-AUC remarquablement insensible \u00e0 la prolif\u00e9ration des faux positifs en situation d&rsquo;extr\u00eame asym\u00e9trie. Dans ces conditions, un mod\u00e8le peut afficher une aire ROC-AUC tr\u00e8s flatteuse (ex. <span class=\"arabpsy-math-inline\" data-latex=\"0{,}95\">$0{,}95$<\/span>) tout en d\u00e9livrant des alertes positives satur\u00e9es de bruit. Le score F1, quant \u00e0 lui, est directement affect\u00e9 par l&rsquo;\u00e9rosion de la pr\u00e9cision d\u00e8s que des faux positifs apparaissent.<\/p>\n<p>Le MCC, issu des travaux de Brian Matthews en 1975, pr\u00e9sente une sym\u00e9trie quadripartite absolue en mobilisant simultan\u00e9ment l&rsquo;int\u00e9gralit\u00e9 des quatre quadrants de la matrice de confusion :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\text{MCC} = \\frac{(\\text{VP} \\cdot \\text{VN}) - (\\text{FP} \\cdot \\text{FN})}{\\sqrt{(\\text{VP} + \\text{FP})(\\text{VP} + \\text{FN})(\\text{VN} + \\text{FP})(\\text{VN} + \\text{FN})}}\">$$\\text{MCC} = \\frac{(\\text{VP} \\cdot \\text{VN}) &#8211; (\\text{FP} \\cdot \\text{FN})}{\\sqrt{(\\text{VP} + \\text{FP})(\\text{VP} + \\text{FN})(\\text{VN} + \\text{FP})(\\text{VN} + \\text{FN})}}$$<\/span><\/p>\n<p>\u00c9voluant dans l&rsquo;intervalle <span class=\"arabpsy-math-inline\" data-latex=\"[-1, +1]\">$[-1, +1]$<\/span>, le MCC est math\u00e9matiquement \u00e9quivalent au coefficient phi de Pearson appliqu\u00e9 \u00e0 deux variables binaires. De r\u00e9centes analyses bio-informatiques (notamment Chicco &amp; Jurman, 2020) d\u00e9montrent que le MCC offre une robustesse th\u00e9orique sup\u00e9rieure au score F1 lorsque la classe n\u00e9gative poss\u00e8de une importance s\u00e9mantique \u00e9gale \u00e0 la classe positive, car le score F1 reste invariant par permutation des vrais n\u00e9gatifs. Toutefois, lorsque l&rsquo;int\u00e9r\u00eat de la mod\u00e9lisation se focalise principalement sur la d\u00e9tection r\u00e9ussie de la classe rare, le score F1 demeure la m\u00e9trique la plus pragmatique et la plus lisible op\u00e9rationnellement.<\/p>\n<h2>10. 10. Pipeline complet : Mod\u00e9lisation logistique et \u00e9valuation du score F1<\/h2>\n<h3>10.1 10.1 Pr\u00e9paration et partitionnement des donn\u00e9es<\/h3>\n<p>Afin d&rsquo;illustrer la conduite d&rsquo;un pipeline complet en langage Python, d\u00e9veloppons un cadre exp\u00e9rimental rigoureux int\u00e9grant la synth\u00e8se d&rsquo;un espace multidimensionnel d\u00e9s\u00e9quilibr\u00e9, la standardisation des pr\u00e9dicteurs continus et le partitionnement stratifi\u00e9. L&rsquo;utilisation de donn\u00e9es simul\u00e9es permet de contr\u00f4ler l&rsquo;asym\u00e9trie structurelle et le niveau de bruit aux fronti\u00e8res de d\u00e9cision.<\/p>\n<p><code>from sklearn.datasets import make_classification<\/code><br \/>\n<code>from sklearn.model_selection import train_test_split<\/code><br \/>\n<code>from sklearn.preprocessing import StandardScaler<\/code><\/p>\n<p><code># G\u00e9n\u00e9ration d'un ensemble de donn\u00e9es synth\u00e9tique asym\u00e9trique (pr\u00e9valence de 15 %)<\/code><br \/>\n<code>X, y = make_classification(n_samples=2000, n_features=10, n_informative=6, n_redundant=2, weights=[0.85, 0.15], random_state=42)<\/code><\/p>\n<p><code># Partitionnement stratifi\u00e9 herm\u00e9tique (80 % apprentissage, 20 % test)<\/code><br \/>\n<code>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, stratify=y, random_state=42)<\/code><\/p>\n<p><code># Standardisation pr\u00e9ventive pour optimiser la convergence du gradient<\/code><br \/>\n<code>scaler = StandardScaler()<\/code><br \/>\n<code>X_train_scaled = scaler.fit_transform(X_train)<\/code><br \/>\n<code>X_test_scaled = scaler.transform(X_test)<\/code><\/p>\n<p>L&rsquo;argument <code>stratify=y<\/code> s&rsquo;av\u00e8re indispensable : il impose que la proportion critique de <span class=\"arabpsy-math-inline\" data-latex=\"15,%\">$15,%$<\/span> d&rsquo;observations positives soit scrupuleusement r\u00e9pliqu\u00e9e au sein du sous-ensemble d&rsquo;apprentissage (<span class=\"arabpsy-math-inline\" data-latex=\"N=1600\">$N=1600$<\/span>) et de l&rsquo;ensemble de test ind\u00e9pendant (<span class=\"arabpsy-math-inline\" data-latex=\"N=400\">$N=400$<\/span>), neutralisant tout biais d&rsquo;\u00e9chantillonnage.<\/p>\n<h3>10.2 10.2 Ajustement de l&rsquo;estimateur et g\u00e9n\u00e9ration des pr\u00e9dictions<\/h3>\n<p>Nous s\u00e9lectionnons un mod\u00e8le classique de r\u00e9gression logistique, param\u00e9tr\u00e9 pour converger via l&rsquo;algorithme d&rsquo;optimisation L-BFGS avec une r\u00e9gularisation mod\u00e9r\u00e9e de type L2. La d\u00e9marche s&rsquo;articule autour de l&rsquo;ajustement du classifieur sur l&rsquo;ensemble d&rsquo;entra\u00eenement standardis\u00e9, suivi de l&rsquo;extraction des pr\u00e9dictions cat\u00e9gorielles et des probabilit\u00e9s d&rsquo;appartenance calibr\u00e9es :<\/p>\n<p><code>from sklearn.linear_model import LogisticRegression<\/code><\/p>\n<p><code># Instanciation et entra\u00eenement de l'estimateur<\/code><br \/>\n<code>modele_logistique = LogisticRegression(penalty='l2', C=1.0, solver='lbfgs', random_state=42)<\/code><br \/>\n<code>modele_logistique.fit(X_train_scaled, y_train)<\/code><\/p>\n<p><code># G\u00e9n\u00e9ration des inf\u00e9rences cat\u00e9gorielles (seuil nominal fix\u00e9 par d\u00e9faut \u00e0 0.5)<\/code><br \/>\n<code>y_pred_test = modele_logistique.predict(X_test_scaled)<\/code><\/p>\n<p><code># Extraction des densit\u00e9s de probabilit\u00e9s post\u00e9rieures continues<\/code><br \/>\n<code>y_prob_test = modele_logistique.predict_proba(X_test_scaled)[:, 1]<\/code><\/p>\n<p>La m\u00e9thode <code>predict_proba<\/code> retourne un tableau de forme <span class=\"arabpsy-math-inline\" data-latex=\"(N, 2)\">$(N, 2)$<\/span> o\u00f9 la seconde colonne encapsule <span class=\"arabpsy-math-inline\" data-latex=\"P(Y=1|X)\">$P(Y=1|X)$<\/span>, grandeur probabiliste qui sert de base au partitionnement binaire standardis\u00e9.<\/p>\n<h3>10.3 10.3 \u00c9valuation quantitative et validation empirique<\/h3>\n<p>L&rsquo;inf\u00e9rence r\u00e9alis\u00e9e sur le jeu de test ind\u00e9pendant permet de quantifier la performance de g\u00e9n\u00e9ralisation de notre classifieur au travers du score F1. Afin de v\u00e9rifier que la m\u00e9trique observ\u00e9e ne r\u00e9sulte pas d&rsquo;une r\u00e9partition favorable lors du d\u00e9coupage initial, nous int\u00e9grons un protocole de validation crois\u00e9e stratifi\u00e9e \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"K=5\">$K=5$<\/span> plis (<em>Stratified K-Fold Cross-Validation<\/em>) :<\/p>\n<p><code>from sklearn.model_selection import cross_val_score, StratifiedKFold<\/code><\/p>\n<p><code># Score ponctuel sur l'\u00e9chantillon test<\/code><br \/>\n<code>f1_test = f1_score(y_test, y_pred_test)<\/code><br \/>\n<code>print(f\"Score F1 sur le jeu de test ind\u00e9pendant : {f1_test:.4f}\")<\/code><\/p>\n<p><code># Validation crois\u00e9e stratifi\u00e9e sur l'int\u00e9gralit\u00e9 du jeu d'apprentissage<\/code><br \/>\n<code>cv_strat = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)<\/code><br \/>\n<code>scores_cv = cross_val_score(modele_logistique, X_train_scaled, y_train, cv=cv_strat, scoring='f1')<\/code><\/p>\n<p><code>print(f\"Scores F1 par pli de validation : {scores_cv}\")<\/code><br \/>\n<code>print(f\"Moyenne empirique CV : {scores_cv.mean():.4f} (+\/- {scores_cv.std():.4f})\")<\/code><\/p>\n<p>La restitution de la moyenne et de l&rsquo;\u00e9cart-type des scores de validation crois\u00e9e informe directement l&rsquo;analyste sur la stabilit\u00e9 et la variance de l&rsquo;estimateur. Une dispersion mod\u00e9r\u00e9e atteste que le mod\u00e8le pr\u00e9sente un compromis biais-variance bien calibr\u00e9 face \u00e0 la distribution r\u00e9elle.<\/p>\n<h2>11. 11. Visualisation graphique des performances et de la courbe Pr\u00e9cision-Rappel<\/h2>\n<h3>11.1 11.1 Repr\u00e9sentation graphique de la matrice de confusion<\/h3>\n<p>La transcription visuelle de la matrice de contingence transcende la simple consultation textuelle en offrant une mise en \u00e9vidence imm\u00e9diate des pathologies de pr\u00e9diction gr\u00e2ce \u00e0 une cartographie thermique (<em>heatmap<\/em>). La classe <code>ConfusionMatrixDisplay<\/code> fournie par Scikit-Learn facilite ce trac\u00e9 :<\/p>\n<p><code>import matplotlib.pyplot as plt<\/code><br \/>\n<code>from sklearn.metrics import ConfusionMatrixDisplay<\/code><\/p>\n<p><code>fig, ax = plt.subplots(figsize=(6, 5))<\/code><br \/>\n<code>disp = ConfusionMatrixDisplay.from_predictions(y_test, y_pred_test, display_labels=['Sain (0)', 'D\u00e9ficit (1)'], cmap=plt.cm.Blues, values_format='d', ax=ax)<\/code><br \/>\n<code>plt.title(\"Matrice de Confusion - Mod\u00e8le Logistique\")<\/code><br \/>\n<code>plt.grid(False)<\/code><br \/>\n<code>plt.show()<\/code><\/p>\n<p>Cette repr\u00e9sentation permet \u00e0 l&rsquo;\u00e9quipe pluridisciplinaire d&rsquo;\u00e9valuer d&rsquo;un coup d&rsquo;\u0153il la pr\u00e9pond\u00e9rance relative des faux n\u00e9gatifs par rapport aux faux positifs, mat\u00e9rialisant visuellement les zones de fragilit\u00e9 du mod\u00e8le.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/fscore1-3.png\" alt=\"\" \/><\/figure>\n<h3>11.2 11.2 Trac\u00e9 et interpr\u00e9tation de la courbe Pr\u00e9cision-Rappel (PR Curve)<\/h3>\n<p>Tandis que la matrice de confusion n&rsquo;offre qu&rsquo;un clich\u00e9 statique \u00e0 un seuil d\u00e9cisionnel pr\u00e9d\u00e9fini, la courbe Pr\u00e9cision-Rappel (PR Curve) documente l&rsquo;espace continu des compromis possibles lorsque le seuil de discrimination parcourt l&rsquo;intervalle <span class=\"arabpsy-math-inline\" data-latex=\"[0, 1]\">$[0, 1]$<\/span>. La courbe s&rsquo;obtient via la fonction <code>precision_recall_curve<\/code>, et sa synth\u00e8se scalaire est captur\u00e9e par l&rsquo;aire sous la courbe (PR-AUC ou <em>Average Precision<\/em>) :<\/p>\n<p><code>from sklearn.metrics import precision_recall_curve, average_precision_score<\/code><\/p>\n<p><code>precisions, rappels, seuils = precision_recall_curve(y_test, y_prob_test)<\/code><br \/>\n<code>pr_auc = average_precision_score(y_test, y_prob_test)<\/code><\/p>\n<p><code>plt.figure(figsize=(8, 6))<\/code><br \/>\n<code>plt.plot(rappels, precisions, color='darkblue', lw=2, label=f'Courbe PR (PR-AUC = {pr_auc:.3f})')<\/code><br \/>\n<code># Trac\u00e9 de la ligne de r\u00e9f\u00e9rence correspondant \u00e0 la pr\u00e9valence brute<\/code><br \/>\n<code>prevalence_base = np.sum(y_test) \/ len(y_test)<\/code><br \/>\n<code>plt.axhline(y=prevalence_base, color='crimson', linestyle='--', label=f'Pr\u00e9valence de base ({prevalence_base:.2f})')<\/code><br \/>\n<code>plt.xlabel(\"Rappel (Sensibilit\u00e9)\")<\/code><br \/>\n<code>plt.ylabel(\"Pr\u00e9cision (VPP)\")<\/code><br \/>\n<code>plt.title(\"Courbe Pr\u00e9cision-Rappel et Fronti\u00e8res Iso-F1\")<\/code><br \/>\n<code>plt.legend(loc=\"lower left\")<\/code><br \/>\n<code>plt.grid(True, linestyle=':', alpha=0.6)<\/code><br \/>\n<code>plt.show()<\/code><\/p>\n<p>Il est \u00e9galement possible d&rsquo;enrichir ce graphique par la superposition de courbes iso-F1, form\u00e9es par l&rsquo;ensemble des coordonn\u00e9es <span class=\"arabpsy-math-inline\" data-latex=\"(R, P)\">$(R, P)$<\/span> satisfaisant <span class=\"arabpsy-math-inline\" data-latex=\"F_1 = c\">$F_1 = c$<\/span>. En isolant la pr\u00e9cision, nous obtenons l&rsquo;\u00e9quation analytique :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"P = \\frac{c \\cdot R}{2R - c}\">$$P = \\frac{c \\cdot R}{2R &#8211; c}$$<\/span><\/p>\n<p>Ces contours hyperboliques permettent d&rsquo;identifier visuellement le point de la courbe de performance qui maximise la m\u00e9trique F1.<\/p>\n<h2>12. 12. Optimisation du seuil de d\u00e9cision et recommandations m\u00e9thodologiques<\/h2>\n<h3>12.1 12.1 Ajustement dynamique du seuil de discrimination (Threshold Tuning)<\/h3>\n<p>Dans la majorit\u00e9 des impl\u00e9mentations de classification binaire, les pr\u00e9dictions cat\u00e9gorielles sont g\u00e9n\u00e9r\u00e9es en appliquant un seuil de discrimination par d\u00e9faut fix\u00e9 \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"0{,}5\">$0{,}5$<\/span> sur les probabilit\u00e9s <em>a posteriori<\/em> :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"\\hat{Y} = \\mathbb{I}(P(Y=1|X) ge 0{,}5)\">$$\\hat{Y} = \\mathbb{I}(P(Y=1|X) ge 0{,}5)$$<\/span><\/p>\n<p>Cette convention na\u00eet du postulat d&rsquo;un espace parfaitement sym\u00e9trique avec des co\u00fbts d&rsquo;erreurs identiques. En pr\u00e9sence de d\u00e9s\u00e9quilibres marqu\u00e9s ou d&rsquo;exigences op\u00e9rationnelles sp\u00e9cifiques, ce seuil arbitraire s&rsquo;av\u00e8re sous-optimal. La recherche m\u00e9thodique du seuil maximisant le score F1 (<em>Threshold Tuning<\/em>) permet d&rsquo;exploiter pleinement le potentiel discriminant de l&rsquo;estimateur sans modifier ses param\u00e8tres internes.<\/p>\n<p>Impl\u00e9mentons un algorithme d&rsquo;optimisation par balayage fin (<em>grid search<\/em>) sur le spectre continu des seuils admissibles :<\/p>\n<p><code>seuils_candidats = np.linspace(0.01, 0.99, 100)<\/code><br \/>\n<code>scores_f1_seuils = []<\/code><\/p>\n<p><code>for s in seuils_candidats:<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;y_pred_temp = (y_prob_test &gt;= s).astype(int)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;score_temp = f1_score(y_test, y_pred_temp, zero_division=0)<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;scores_f1_seuils.append(score_temp)<\/code><\/p>\n<p><code>index_optimal = np.argmax(scores_f1_seuils)<\/code><br \/>\n<code>seuil_optimal = seuils_candidats[index_optimal]<\/code><br \/>\n<code>f1_optimal = scores_f1_seuils[index_optimal]<\/code><\/p>\n<p><code>print(f\"Seuil optimal identifi\u00e9 : {seuil_optimal:.3f} | Score F1 maximis\u00e9 : {f1_optimal:.4f}\")<\/code><\/p>\n<p>Ce recalibrage permet fr\u00e9quemment d&rsquo;augmenter le score F1 de plusieurs points de pourcentage en d\u00e9pla\u00e7ant le seuil (par exemple aux alentours de <span class=\"arabpsy-math-inline\" data-latex=\"0{,}32\">$0{,}32$<\/span> au lieu de <span class=\"arabpsy-math-inline\" data-latex=\"0{,}50\">$0{,}50$<\/span>), augmentant significativement la capture des \u00e9v\u00e9nements positifs r\u00e9els.<\/p>\n<h3>12.2 12.2 Pi\u00e8ges analytiques courants et comment les \u00e9viter<\/h3>\n<p>L&rsquo;optimisation du seuil de d\u00e9cision et l&rsquo;\u00e9valuation par le score F1 rec\u00e8lent plusieurs pi\u00e8ges m\u00e9thodologiques majeurs qu&rsquo;un analyste rigoureux se doit d&rsquo;\u00e9viter :<\/p>\n<ul>\n<li><strong>Fuite d&rsquo;information statistique (<em>Data Leakage<\/em>) :<\/strong> Le travers m\u00e9thodologique le plus fr\u00e9quent consiste \u00e0 identifier le seuil optimal directement sur le jeu de test final. Ce proc\u00e9d\u00e9 contamine l&rsquo;ind\u00e9pendance de l&rsquo;\u00e9chantillon d&rsquo;\u00e9valuation et produit une estimation biais\u00e9e vers le haut de la performance r\u00e9elle. Le r\u00e9glage du seuil doit imp\u00e9rativement s&rsquo;op\u00e9rer sur un jeu de validation d\u00e9di\u00e9 ou via une boucle interne de validation crois\u00e9e embo\u00eet\u00e9e (<em>Nested Cross-Validation<\/em>).<\/li>\n<li><strong>N\u00e9gligence de la calibration probabiliste :<\/strong> Un mod\u00e8le peut pr\u00e9senter un score F1 \u00e9lev\u00e9 \u00e0 un seuil donn\u00e9 tout en g\u00e9n\u00e9rant des probabilit\u00e9s tr\u00e8s mal calibr\u00e9es (par exemple, des r\u00e9seaux de neurones profonds sujets \u00e0 une surconfiance structurelle). Il est crucial de contr\u00f4ler la calibration du syst\u00e8me via le score de Brier ou des diagrammes de fiabilit\u00e9 (<em>Reliability Diagrams<\/em>), et d&rsquo;appliquer si n\u00e9cessaire une r\u00e9gression isotonique ou une mise \u00e0 l&rsquo;\u00e9chelle de Platt.<\/li>\n<li><strong>Omission de la classe n\u00e9gative :<\/strong> En concentrant toute son attention sur l&rsquo;optimisation du score F1 de la classe positive, l&rsquo;exp\u00e9rimentateur risque d&rsquo;induire une d\u00e9t\u00e9rioration massive de la reconnaissance de la classe n\u00e9gative sans s&rsquo;en apercevoir. La consultation simultan\u00e9e de la matrice de confusion compl\u00e8te et du score F1 macro demeure indispensable.<\/li>\n<\/ul>\n<h3>12.3 12.3 Synth\u00e8se prescriptive pour une recherche reproductible<\/h3>\n<p>Pour garantir la validit\u00e9 scientifique et l&rsquo;int\u00e9grit\u00e9 industrielle des syst\u00e8mes d&rsquo;apprentissage automatique, tout protocole d&rsquo;\u00e9valuation impliquant le score F1 doit se conformer \u00e0 un standard de documentation rigoureux :<\/p>\n<p>En premier lieu, l&rsquo;analyste doit consigner formellement la version de l&rsquo;interpr\u00e9teur et de l&rsquo;ensemble des biblioth\u00e8ques logicielles mobilis\u00e9es au sein d&rsquo;un fichier <code>requirements.txt<\/code> ou d&rsquo;une recette d&rsquo;environnement Conda. En second lieu, toute publication de r\u00e9sultats pr\u00e9dictifs se doit d&rsquo;accompagner le score F1 scalaire de son intervalle de confiance statistique \u00e0 95 % (obtenu par r\u00e9\u00e9chantillonnage de type <em>Bootstrap<\/em>) ou de la distribution compl\u00e8te issue d&rsquo;une validation crois\u00e9e stratifi\u00e9e r\u00e9p\u00e9t\u00e9e.<\/p>\n<p>Enfin, la matrice de confusion non normalis\u00e9e doit \u00eatre syst\u00e9matiquement annex\u00e9e au rapport de mod\u00e9lisation : elle seule pr\u00e9serve l&rsquo;information brute relative aux effectifs r\u00e9els et permet aux pairs d&rsquo;\u00e9valuer d&rsquo;autres m\u00e9triques d\u00e9cisionnelles adapt\u00e9es \u00e0 leurs propres fonctions de co\u00fbt \u00e9conomique ou clinique. Utilis\u00e9 avec rigueur et lucidit\u00e9 m\u00e9thodologique, le score F1 demeure l&rsquo;un des instruments les plus \u00e9l\u00e9gants et efficaces pour concevoir des syst\u00e8mes de classification robustes, \u00e9thiques et performants face \u00e0 la complexit\u00e9 des donn\u00e9es r\u00e9elles.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Chicco, D., &amp; Jurman, G. (2020). The advantages of the Matthews correlation coefficient (MCC) over F1 score and accuracy in binary classification evaluation. <em>BMC Genomics<\/em>, 21(1), 6. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1186\/s12864-019-6413-7\">https:\/\/doi.org\/10.1186\/s12864-019-6413-7<\/a><\/li>\n<li>Fawcett, T. (2006). An introduction to ROC analysis. <em>Pattern Recognition Letters<\/em>, 27(8), 861-874. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1016\/j.patrec.2005.10.010\">https:\/\/doi.org\/10.1016\/j.patrec.2005.10.010<\/a><\/li>\n<li>Green, D. M., &amp; Swets, J. A. (1966). <em>Signal detection theory and psychophysics<\/em>. John Wiley &amp; Sons.<\/li>\n<li>Pedregosa, F., Varoquaux, G., Gramfort, A., Michel, V., Thirion, B., Grisel, O., Blondel, M., Prettenhofer, P., Weiss, R., Dubourg, V., Vanderplas, J., Passos, A., Cournapeau, D., Brucher, M., Perrot, M., &amp; Duchesnay, E. (2011). Scikit-learn: Machine learning in Python. <em>Journal of Machine Learning Research<\/em>, 12, 2825-2830.<\/li>\n<li>Powers, D. M. (2011). Evaluation: from precision, recall and F-measure to ROC, informedness, markedness and correlation. <em>Journal of Machine Learning Technologies<\/em>, 2(1), 37-63.<\/li>\n<li>Sasaki, Y. (2007). The truth of the F-measure. <em>Teach Tutor Mater<\/em>, 1(5), 1-5.<\/li>\n<li>van Rijsbergen, C. J. (1979). <em>Information Retrieval<\/em> (2nd ed.). Butterworth-Heinemann.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour comprendre, formaliser et calculer le score F1 en Python avec Scikit-Learn et NumPy \u00e0 l&rsquo;aide d&rsquo;exemples pas \u00e0 pas.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[4314,2464],"tags":[6270,6269,2468,2904,6398],"class_list":["post-5145","psych_stat","type-psych_stat","status-publish","hentry","category-apprentissage-automatique","category-science-des-donnees","tag-evaluation-de-modeles","tag-matrice-de-confusion","tag-python","tag-scikit-learn","tag-score-f1"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/5145","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5145"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/5145\/revisions"}],"predecessor-version":[{"id":16742,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/5145\/revisions\/16742"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}