<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mon Shot de Data Science</title>
    <description>Mes meilleures pratiques en Data Science et Machine Learning (avec Python)</description>
    
    <link>https://www.monshotdata.com/</link>
    <atom:link href="https://rss.beehiiv.com/feeds/cu4gwRrftO.xml" rel="self"/>
    
    <lastBuildDate>Sat, 10 Oct 2026 03:46:57 +0000</lastBuildDate>
    <pubDate>Wed, 07 Oct 2026 10:00:00 +0000</pubDate>
    <atom:published>2026-10-07T10:00:00Z</atom:published>
    <atom:updated>2026-10-10T03:46:57Z</atom:updated>
    
      <category>Data Science</category>
      <category>Machine Learning</category>
      <category>Artificial Intelligence</category>
    <copyright>Copyright 2026, Mon Shot de Data Science</copyright>
    
    <image>
      <url>https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/publication/logo/1f7580ca-bca1-4bd0-ad17-425e1778d89f/MonCoachData-10.png</url>
      <title>Mon Shot de Data Science</title>
      <link>https://www.monshotdata.com/</link>
    </image>
    
    <docs>https://www.rssboard.org/rss-specification</docs>
    <generator>beehiiv</generator>
    <language>en-us</language>
    <webMaster>support@beehiiv.com (Beehiiv Support)</webMaster>

      <item>
  <title>Interprétabilité des modèles : maîtriser les PDP et les ICE plots</title>
  <description>👀​ Mini-cours #40 - Intuition, code from scratch, pièges à éviter et usage dans sklearn, pour comprendre comment chaque feature influence vraiment les prédictions de ton modèle.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/de5e5393-4ea2-410e-b07b-56b6a7b4bc3f/pdp-ice-00-couverture-pdp-ice-plots.png" length="30876" type="image/png"/>
  <link>https://www.monshotdata.com/p/pdp-ice-plots-interpretabilite-modele</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/pdp-ice-plots-interpretabilite-modele</guid>
  <pubDate>Wed, 07 Oct 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-10-07T10:00:00Z</atom:published>
    <category><![CDATA[Machine Learning]]></category>
    <category><![CDATA[Pro]]></category>
    <category><![CDATA[Fiabilité Et Transparence Des Prédictions]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#f2eafe;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:2.0px 2.0px 2.0px 2.0px;"><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Psst... Contenu Exclusif Réservé aux Membres !</b></span><br><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Ce mini-cours fait partie de notre espace premium. Rejoins dès maintenant le </span><b>Cercle des Experts</b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;"> pour débloquer l’intégralité de nos ressources, analyses approfondies et guides pratiques.</span><br><b>👉 </b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Clique ici pour découvrir les avantages et t’inscrire : </span><b><a class="link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=interpretabilite-des-modeles-maitriser-les-pdp-et-les-ice-plots" target="_blank" rel="noopener noreferrer nofollow" style="color: #2563eb">Page d’adhésion</a></b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">.</span></p></div><div class="section" style="background-color:transparent;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Poppins, Helvetica, sans-serif, serif, EmojiFont;font-size:16px;">⏱️ </span><i><b>Temps de lecture</b></i><i> : 30-35 minutes</i></p></div><h2 class="heading" style="text-align:left;" id="introduction">Introduction</h2><p class="paragraph" style="text-align:left;">Plus que jamais, on a besoin de méthodes capables de communiquer (ou d&#39;expliquer) de façon fiable le comportement d&#39;un modèle.</p><p class="paragraph" style="text-align:left;">Pourquoi ? Parce que faire aveuglément confiance aux prédictions d&#39;un modèle de ML peut être fatal, surtout dans les environnements à enjeux élevés, où les décisions prises à partir de ces prédictions peuvent affecter des vies humaines, la stabilité financière ou des infrastructures critiques.</p><p class="paragraph" style="text-align:left;">Par exemple, si un modèle prédit qu&#39;un patient est en bonne santé et n&#39;a besoin d&#39;aucun traitement, cette information n&#39;est pas forcément très utile à un médecin.</p><div class="image"><img alt="Schéma : une IRM cérébrale est analysée par un modèle de ML qui prédit « La personne est en bonne santé »" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/60f42728-9b85-4f57-afd7-1778ce747b8c/pdp-ice-01-modele-irm-personne-en-bonne-sante.png.png?t=1791362414"/></div><p class="paragraph" style="text-align:left;">En réalité, un médecin procède à un diagnostic différentiel, et comprendre les nuances est crucial. Par exemple : une probabilité de 10 % que le patient ait un cancer, d&#39;après une IRM.</p><p class="paragraph" style="text-align:left;">Dans ce type de situation, il ne s&#39;agit pas seulement de produire des prédictions, mais aussi de comprendre les raisons qui les sous-tendent.</p><p class="paragraph" style="text-align:left;">Des méthodes comme les conformal predictions sont généralement bien adaptées pour fournir aux utilisateurs non techniques des intervalles de confiance ou des ensembles de prédiction (on en a déjà parlé juste en dessous)...</p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/prediction-conforme-maitriser-incertitude-ml?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=interpretabilite-des-modeles-maitriser-les-pdp-et-les-ice-plots" target="_blank"><div class="embed__content"><p class="embed__title"> Maîtriser l&#39;incertitude en Machine Learning avec la Prédiction Conforme </p><p class="embed__description"> Maîtrise l&#39;incertitude en Machine Learning avec la Prédiction Conforme : construis des intervalles de confiance robustes et déploie tes modèles en toute sécurité. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/4715afb7-fc90-406a-b369-fb6f2901546a/Mini-cours__26_-_Mai%CC%82triser_l_incertitude_en_Machine_Learning_avec_la_Pre%CC%81diction_Conforme.png.png?t=1775049292"/></a></div><p class="paragraph" style="text-align:left;">...mais les data scientists et les ML engineers qui construisent ces modèles ont souvent besoin d&#39;aller plus loin, avec des indications beaucoup plus techniques sur le fonctionnement interne du modèle.</p><p class="paragraph" style="text-align:left;">Autrement dit, tu as besoin d&#39;outils qui te donnent une compréhension fine de la façon dont chaque feature influence les prédictions. Dans ce cas, un ensemble de prédiction ou un score de confiance ne te servira pas à grand-chose.</p><p class="paragraph" style="text-align:left;">Dans de nombreux cas, les Partial Dependence Plots (PDP) et les Individual Conditional Expectation (ICE) plots sont mes outils de prédilection pour ce genre d&#39;analyse. Ils permettent d&#39;aller au-delà des simples intervalles de confiance, pour explorer la relation entre des features précises et les prédictions du modèle, et comprendre comment il les construit.</p><p class="paragraph" style="text-align:left;">Si tu as déjà vu le visuel suivant, où l&#39;on présentait les 11 graphiques les plus importants en data science, tu as peut-être remarqué que les PDP en faisaient partie :</p><div class="image"><img alt="Infographie des 11 graphiques clés en data science : KS Plot, SHAP, courbe ROC, QQ Plot, variance cumulée, coude, silhouette, Gini vs entropie, biais-variance, PDP et précision-rappel." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b75a63a4-99d2-4b63-a04b-657a3489910e/pdp-ice-02-11-graphiques-importants-data-science.png.png?t=1791301162"/></div><p class="paragraph" style="text-align:left;">Dans ce dossier, on va voir en détail comment sont construits les PDP et les ICE plots, et comment les interpréter (sans se laisser piéger).</p><div class="section" style="background-color:#e0f2fa;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;">💡Ici, je pars du principe que tu sais déjà pourquoi les méthodes d&#39;interprétabilité sont si importantes en data science et en ML. Sinon, la raison est assez évidente, comme le terme lui-même le suggère : « méthodes d&#39;interprétabilité ».</p></div><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="1-partial-dependence-plots-pdp">#1) Partial Dependence Plots (PDP)</h2><h3 class="heading" style="text-align:left;" id="introduction">Introduction</h3><p class="paragraph" style="text-align:left;">D&#39;après mon expérience, ce nom (Partial Dependence Plots) sème la pagaille dans la tête de beaucoup d&#39;apprenants, alors qu&#39;il devient très simple une fois décomposé.</p><ul><li><p class="paragraph" style="text-align:left;"><b>Partial</b> signifie qu&#39;on ne s&#39;intéresse pas à l&#39;ensemble de l&#39;espace des features, mais seulement à un sous-ensemble.</p></li></ul><div class="image"><img alt="Schéma : une matrice X de features colorées est découpée en sous-ensembles d&#39;une ou deux features, qui forment l&#39;espace partiel." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0724f7a6-a9bf-4e25-a2a0-30f7e420f7a8/pdp-ice-03-espace-complet-vers-espace-partiel-features.png.png?t=1791362505"/></div><ul><li><p class="paragraph" style="text-align:left;">On doit donc isoler une ou deux features d&#39;intérêt en maintenant toutes les autres constantes, d&#39;où le terme « partial ».</p></li><li><p class="paragraph" style="text-align:left;">Cela permet d&#39;étudier l&#39;impact de features précises sur les prédictions du modèle, sans interférence des autres.</p></li></ul><ul><li><p class="paragraph" style="text-align:left;"><b>Dependence</b> désigne la relation entre ces features isolées et les prédictions du modèle.</p></li></ul><div class="image"><img alt="Schéma : des sous-ensembles d&#39;une ou deux features colorées exercent une influence sur le vecteur cible y." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2d4ac55e-8d34-4a1f-bb4a-f0a577641e44/pdp-ice-04-influence-sous-ensembles-features-sur-cible.png.png?t=1791362559"/></div><ul><li><p class="paragraph" style="text-align:left;">On cherche à comprendre comment les variations de ces features influencent le résultat prédit.</p></li><li><p class="paragraph" style="text-align:left;">Autrement dit, on trace à quel point les prédictions dépendent de ces features particulières.</p></li></ul><p class="paragraph" style="text-align:left;">En combinant les deux, la <b>Partial Dependence</b> désigne donc la relation entre une feature précise (ou une paire de features) et le résultat prédit, en supposant que toutes les autres features restent fixes.</p><p class="paragraph" style="text-align:left;">Cette simplification est la clé pour comprendre l&#39;effet marginal d&#39;une ou deux features à la fois, et rend le comportement du modèle beaucoup plus facile à interpréter.</p><p class="paragraph" style="text-align:left;">Rendons tout cela concret en passant par les étapes de construction d&#39;un PDP.</p><h3 class="heading" style="text-align:left;" id="crer-un-pdp">Créer un PDP</h3><p class="paragraph" style="text-align:left;">Voyons comment construire un PDP pas à pas, avec des explications de code en Python (<code>sklearn</code> et <code>numpy</code>) et un modèle Random Forest.</p><p class="paragraph" style="text-align:left;">Pour ce tutoriel, on va créer un dataset factice, entraîner le modèle, puis calculer le Partial Dependence Plot (PDP) sans le tracer tout de suite.</p><h4 class="heading" style="text-align:left;" id="1-dataset-factice">1) Dataset factice</h4><p class="paragraph" style="text-align:left;">On commence par créer un dataset factice avec <code>sklearn</code>, puis on entraîne un Random Forest.</p><div class="image"><img alt="Code Python pdp.py : make_regression génère 1000 échantillons et 5 features, puis un RandomForestRegressor de 100 arbres est entraîné." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d6f1e6ca-8492-4171-9923-88fa21bf02a6/pdp-ice-05-code-dataset-factice-random-forest.png.png?t=1791362614"/></div><p class="paragraph" style="text-align:left;">Pour l&#39;instant, l&#39;overfitting ne nous préoccupe pas : l&#39;objectif de ce tutoriel n&#39;est pas d&#39;entraîner le meilleur modèle possible.</p><h4 class="heading" style="text-align:left;" id="2-choisir-la-ou-les-features-dintrt">2) Choisir la ou les features d&#39;intérêt</h4><p class="paragraph" style="text-align:left;">Ici, j&#39;ai choisi un dataset à cinq features et entraîné un Random Forest regressor. On va se concentrer sur la feature d&#39;indice <code>0</code> pour générer le PDP.</p><div class="image"><img alt="Code Python pdp.py : la variable feature_index est fixée à 0 pour désigner la feature d&#39;intérêt du PDP." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a618be34-f204-49fa-8287-f50644cc37e6/pdp-ice-06-code-choix-feature-interet.png.png?t=1791362659"/></div><div class="section" style="background-color:#e0f2fa;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;">💡Les PDP se limitent généralement à 1 ou 2 features, car au-delà, la visualisation devient difficile (une courbe pour une feature, une surface ou une heatmap pour deux) et l&#39;interprétation perd en lisibilité. Les PDP sont donc surtout adaptés à l&#39;étude des effets marginaux d&#39;une ou deux features à la fois.</p></div><h5 class="heading" style="text-align:left;" id="3-maintenir-les-autres-features-con">3) Maintenir les autres features constantes</h5><p class="paragraph" style="text-align:left;">Ensuite, on doit maintenir toutes les autres features constantes pendant qu&#39;on fait varier les valeurs de la feature sélectionnée (celle d&#39;indice 0 dans notre cas).</p><div class="image"><img alt="Schéma : un échantillon Xᵢ de quatre cases. La première feature (bleue) varie, les trois autres (hachurées) restent fixes." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/20868fa3-e1e4-4dd5-9121-4997ffd19537/pdp-ice-07-echantillon-feature-variable-features-fixes.png.png?t=1791362704"/></div><p class="paragraph" style="text-align:left;">Simplifions un peu, car cette étape est essentielle.</p><p class="paragraph" style="text-align:left;">Rappelle-toi que notre dataset contient 1000 observations (montrées à nouveau ci-dessous) :</p><div class="image"><img alt="Rappel du code Python pdp.py : dataset de régression de 1000 échantillons et 5 features, modèle RandomForestRegressor entraîné avec fit." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2d1539c6-1588-434f-8656-05d47f42f156/pdp-ice-08-code-dataset-factice-rappel.png.png?t=1791362745"/></div><p class="paragraph" style="text-align:left;"><b>Pour chaque échantillon</b> du dataset :</p><ul><li><p class="paragraph" style="text-align:left;">On fixe toutes les autres features.</p></li><li><p class="paragraph" style="text-align:left;">On fait varier les valeurs de la feature sélectionnée.</p></li></ul><p class="paragraph" style="text-align:left;">Disons qu&#39;on fait varier la valeur de la feature sélectionnée dix fois. Cela signifie que :</p><ul><li><p class="paragraph" style="text-align:left;">Pour le premier échantillon d&#39;entraînement, on doit générer dix instances différentes.</p></li></ul><div class="image"><img alt="Schéma : le 1er échantillon est décliné en dix lignes numérotées de 1 à 10, où seule la première feature change et les autres restent fixes." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5faa7942-40a7-4d98-a998-dcb4ab46fcfc/pdp-ice-09-premier-echantillon-dix-instances-feature-variee.png.png?t=1791362793"/></div><ul><li><p class="paragraph" style="text-align:left;">Pour le deuxième échantillon, on doit aussi générer dix instances différentes.</p></li></ul><div class="image"><img alt="Schéma : le 2e échantillon est décliné en dix lignes numérotées de 1 à 10, où seule la première feature change et les autres restent fixes." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a35de6d1-6365-4529-b32e-b596542d90b5/pdp-ice-10-deuxieme-echantillon-dix-instances-feature-variee.png.png?t=1791362846"/></div><ul><li><p class="paragraph" style="text-align:left;">Et ainsi de suite.</p></li></ul><p class="paragraph" style="text-align:left;">Plus formellement, cette étape consiste à créer plusieurs versions de chaque échantillon en modifiant la valeur de la feature sélectionnée, tout en gardant les autres inchangées.</p><p class="paragraph" style="text-align:left;">Le code suivant s&#39;en charge :</p><ul><li><p class="paragraph" style="text-align:left;">D&#39;abord, on définit la plage de valeurs de la feature choisie (par exemple, dix valeurs entre le min et le max de la feature).</p></li></ul><div class="image"><img alt="Code Python pdp.py : np.linspace crée dix valeurs entre le min et le max de la feature d&#39;indice feature_index, annotées sur le schéma." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2e4385dd-1e51-4695-8e4b-6c83947f6d62/pdp-ice-11-code-linspace-plage-valeurs-feature.png.png?t=1791362888"/></div><ul><li><p class="paragraph" style="text-align:left;">Ensuite, pour chaque valeur de la feature, on copie le dataset d&#39;origine et on remplace les valeurs de la feature sélectionnée :</p></li></ul><div class="image"><img alt="Code Python pdp.py : np.tile duplique le dataset une fois par valeur de la feature, puis np.repeat remplace la colonne sélectionnée." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1ce08390-569a-410a-ad2d-fe07865c8d11/pdp-ice-12-code-duplication-dataset-remplacement-feature.png.png?t=1791362926"/></div><p class="paragraph" style="text-align:left;">Dans ces deux morceaux de code, on utilise <code>np.linspace</code> pour créer dix valeurs entre le minimum et le maximum de la feature sélectionnée. On copie ensuite le dataset et on remplace la feature choisie par ces nouvelles valeurs, en gardant les autres constantes.</p><p class="paragraph" style="text-align:left;">Si on regarde la taille du dataset obtenu, on constate qu&#39;il est bien dix fois plus grand que le dataset d&#39;origine :</p><div class="image"><img alt="Code Python pdp.py : X_new.shape renvoie (10000, 5), soit 10 versions des 1000 observations et 5 features." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9895538c-98ec-403f-b659-439d563a0e78/pdp-ice-13-code-shape-dataset-modifie.png?t=1791362962"/></div><p class="paragraph" style="text-align:left;">Parfait !</p><hr class="content_break"><div class="section" style="background-color:#1B3A6B;border-color:#F7931E;border-radius:8px;border-style:solid;border-width:3px;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;">💡<span style="color:#FFFFFF;"> En continuant, tu vas découvrir :</span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Comment générer les prédictions et obtenir 1000 courbes individuelles (les fameuses ICE) à partir de ce dataset démultiplié</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Comment moyenner ces prédictions pour tracer le PDP, et comment lire correctement les courbes obtenues</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Un cas d&#39;usage concret (revente de maisons) pour transformer un PDP en décision business, ainsi que l&#39;adaptation aux features catégorielles et à la classification binaire</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Le piège qui fait croire qu&#39;une feature n&#39;a aucun effet alors qu&#39;elle est décisive, et pourquoi un PDP seul peut être trompeur</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Les limites cachées des PDP (features corrélées, zones sans données) et comment les générer en une ligne avec sklearn</span></p></li></ul></div><div class="paywall"><hr class="paywall__break"/><div class="paywall__content"><h2 class="paywall__header"> La suite de ce mini-cours est réservée aux membres du Cercle des Experts. </h2><p class="paywall__description"> Tu as déjà le début. Pour accéder à l’explication complète et à tous les contenus avancés, rejoins le Cercle des Experts dès maintenant. </p><p class="paywall__links"><a class="paywall__upgrade_link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=interpretabilite-des-modeles-maitriser-les-pdp-et-les-ice-plots">Rejoindre le Cercle des Experts</a> Translation missing: en.app.shared.conjuction.or <a class="paywall__login_link" href="https://www.monshotdata.com/login?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=interpretabilite-des-modeles-maitriser-les-pdp-et-les-ice-plots">Sign In</a></p><div class="paywall__upsell"><div class="paywall__upsell_header"><h3> En devenant membre, tu débloques </h3></div><ul class="paywall__upsell_features"><li class="paywall__upsell_feature"> L’intégralité de ce mini-cours (sans coupure) </li><li class="paywall__upsell_feature"> Tous les mini-cours archivés et les ressources associées </li><li class="paywall__upsell_feature"> 1 nouveau mini-cours chaque semaine pour progresser en continu </li></ul></div></div></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=5e835864-aaab-47ec-86a4-8be754a2b230&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Double Descent : quand plus de paramètres rime avec meilleure généralisation</title>
  <description>🎯 Shot #338 - Le phénomène qui remet en cause le bias-variance trade-off.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/86e52a03-8536-40a7-aafd-26c2d5b00ad3/_338-double-descent-courbe-loss-degres-1-a-25-cover.png" length="41436" type="image/png"/>
  <link>https://www.monshotdata.com/p/double-descent-bias-variance-trade-off</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/double-descent-bias-variance-trade-off</guid>
  <pubDate>Mon, 05 Oct 2026 08:00:00 +0000</pubDate>
  <atom:published>2026-10-05T08:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Machine Learning]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">C&#39;est bien connu : plus on augmente le nombre de paramètres d&#39;un modèle, plus il a tendance à faire de l&#39;overfitting.</p><p class="paragraph" style="text-align:left;">Prends par exemple une régression polynomiale entraînée sur ce dataset fictif :</p><p class="paragraph" style="text-align:left;"></p><div class="image"><img alt="Nuage de 15 points d&#39;un dataset fictif de régression, qui descendent de 1 vers -1 puis remontent légèrement." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/dba8f411-b246-4942-b9e9-67de2d06939c/_338-double-descent-dataset-fictif.png.png?t=1791149126"/></div><p class="paragraph" style="text-align:left;">age</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><div class="image"><img alt="Formule d&#39;une régression polynomiale de degré m : y=θ₀ + θ₁x¹ + θ₂x² + … + θₘxᵐ." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6050bc1c-e22a-48f0-afa1-9e067771d462/_338-modele-regression-polynomiale.png.png?t=1791149181"/></div><p class="paragraph" style="text-align:left;">Quand on augmente le degré (m) et qu&#39;on entraîne le modèle, voilà ce qui est attendu :</p><ul><li><p class="paragraph" style="text-align:left;">La loss d&#39;entraînement se rapproche de plus en plus de zéro.</p></li><li><p class="paragraph" style="text-align:left;">La loss de test (ou de validation) baisse d&#39;abord, puis grimpe de plus en plus.</p></li></ul><p class="paragraph" style="text-align:left;">C&#39;est logique : avec un degré élevé, le modèle arrive plus facilement à contorsionner sa courbe pour passer par chaque point d&#39;entraînement.</p><p class="paragraph" style="text-align:left;">Le graphique de loss ci-dessous le confirme :</p><div class="image"><img alt="Courbe de loss pour les degrés 1 à 6 : l&#39;erreur d&#39;entraînement tend vers zéro, l&#39;erreur de test baisse jusqu&#39;au degré 3 puis grimpe jusqu&#39;à 1,0." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3fe7d28d-464b-48bb-8ce5-6ba70ab54a1f/_338-double-descent-courbe-loss-degres-1-a-6.png.png?t=1791149233"/></div><p class="paragraph" style="text-align:left;"><b>Mais regarde ce qui se passe quand on continue d&#39;augmenter le degré (</b><code>m</code><b>) :</b></p><div class="image"><img alt="Courbe de loss pour les degrés 1 à 25 : l&#39;erreur de test explose au degré 14 (environ 4 × 10¹¹) puis redescend vers zéro." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/93c5b344-aee6-4beb-82c3-a9df0da6d724/_338-double-descent-courbe-loss-degres-1-a-25.png.png?t=1791149320"/></div><p class="paragraph" style="text-align:left;">Étrange, non ?</p><p class="paragraph" style="text-align:left;"><b>Pourquoi la loss de test augmente jusqu&#39;à un certain point, puis redescend ?</b></p><p class="paragraph" style="text-align:left;">Tu ne t&#39;y attendais pas, hein ?</p><p class="paragraph" style="text-align:left;">Eh bien, ce que tu vois s&#39;appelle le &quot;<b>double descent</b>&quot; (double descente). C&#39;est un phénomène très courant dans de nombreux modèles de ML, surtout en deep learning.</p><p class="paragraph" style="text-align:left;">Il montre que, de façon contre-intuitive, augmenter la complexité du modèle au-delà du point d&#39;interpolation peut améliorer la généralisation.</p><p class="paragraph" style="text-align:left;"><b>Cette idée est d&#39;ailleurs au cœur de la raison pour laquelle les LLM, pourtant gigantesques (des milliards, voire des milliers de milliards de paramètres), arrivent malgré tout à bien généraliser.</b></p><p class="paragraph" style="text-align:left;">Et c&#39;est difficile à accepter, parce que ce phénomène remet directement en cause le bias-variance trade-off (compromis biais-variance) qu&#39;on apprend dans n&#39;importe quel cours d&#39;intro au ML :</p><div class="image"><img alt="Courbe du compromis biais-variance : le biais² baisse avec la complexité du modèle, la variance monte, et l&#39;erreur totale forme un U avec un optimum au centre." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9f2c298f-b73f-41da-a50d-90c561daf8f0/_338-bias-variance-trade-off-courbe.png.png?t=1791149384"/></div><p class="paragraph" style="text-align:left;">Autrement dit, entraîner de très gros modèles, <b>même avec plus de paramètres que de points d&#39;entraînement</b>, peut quand même donner une bonne généralisation.</p><p class="paragraph" style="text-align:left;">À ma connaissance, la question reste ouverte, et on ne sait pas vraiment pourquoi les réseaux de neurones se comportent ainsi.</p><p class="paragraph" style="text-align:left;">Il existe quand même des pistes autour de la régularisation, comme celle-ci : </p><p class="paragraph" style="text-align:left;">Le modèle appliquerait une forme de <b>régularisation implicite</b>, qui lui permettrait de se concentrer précisément sur le bon nombre de paramètres pour généraliser.</p><p class="paragraph" style="text-align:left;">Mais soyons honnêtes, rien n&#39;est clair pour l&#39;instant.</p><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> j&#39;aimerais savoir ce que tu penses de ce phénomène et de ses causes possibles.</p><p class="paragraph" style="text-align:left;"><b>👉 Envie d&#39;aller plus loin ? DataXp t&#39;attend → </b><b><a class="link" href="https://dataxp.fr?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=double-descent-quand-plus-de-parametres-rime-avec-meilleure-generalisation" target="_blank" rel="noopener noreferrer nofollow">dataxp.fr</a></b></p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=75f5698b-e183-4d85-8069-e18590c5e43f&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Activation Pruning : réduis la taille de ton réseau sans perdre en performance</title>
  <description>🎯 Shot #337 - Comment repérer et supprimer les neurones qui ne servent à rien.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fd8a41da-13ac-419f-8690-185d649eb78f/_337-activation-pruning-activations-moyennes-cover.png" length="39361" type="image/png"/>
  <link>https://www.monshotdata.com/p/activation-pruning-reduire-reseau-neurones</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/activation-pruning-reduire-reseau-neurones</guid>
  <pubDate>Mon, 28 Sep 2026 09:00:00 +0000</pubDate>
  <atom:published>2026-09-28T09:00:00Z</atom:published>
    <category><![CDATA[Deep Learning]]></category>
    <category><![CDATA[Shot Data]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Une fois l&#39;entraînement du réseau terminé, il te reste presque toujours un tas de neurones inutiles : des neurones qui ne contribuent quasiment pas à la performance du réseau, mais qui continuent à consommer de la mémoire.</p><p class="paragraph" style="text-align:left;">Autrement dit, il existe un pourcentage élevé de neurones qui, si on les retire du réseau entraîné, n&#39;affecteront pas la performance de façon notable :</p><div class="image"><img alt="Schéma comparant un réseau de neurones complet et sa version élaguée : la précision passe de 90 % à 89,7 % après suppression des neurones inutiles." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/899f4e12-defa-4ff7-8824-88ed97780edc/_337-activation-pruning-reseau-avant-apres.png.png?t=1790543660"/></div><p class="paragraph" style="text-align:left;">Et bien sûr, je ne dis pas ça au hasard ou sans fondement.</p><p class="paragraph" style="text-align:left;">J&#39;ai vérifié ça expérimentalement, encore et encore, sur mes différents projets.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Voici l&#39;idée de base.</p><p class="paragraph" style="text-align:left;">Une fois l&#39;entraînement terminé, on fait passer le dataset dans le modèle (sans backpropagation cette fois) et on analyse l&#39;activation moyenne de chaque neurone.</p><p class="paragraph" style="text-align:left;">On observe alors souvent que de nombreuses activations de neurones restent proches de zéro.</p><div class="image"><img alt="Diagramme illustrant l&#39;activation moyenne de plusieurs neurones (0,5, 0,007, -1,3, -0,002) : les valeurs proches de zéro sont identifiées comme pouvant être supprimées." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/912bbda4-97fb-47ad-878c-4295b7983d7b/_337-activation-pruning-activations-moyennes.png.png?t=1790543693"/></div><p class="paragraph" style="text-align:left;">Ces neurones peuvent donc être supprimés du réseau (on parle de pruning), car ils auront très peu d&#39;impact sur la sortie du modèle.</p><p class="paragraph" style="text-align:left;">Pour ça, on peut fixer un seuil de pruning (<code>λ</code>) et supprimer tous les neurones dont l&#39;activation est inférieure à ce seuil.</p><p class="paragraph" style="text-align:left;">Ça a aussi du sens intuitivement.</p><p class="paragraph" style="text-align:left;">Plus précisément, si un neurone atteint <b>rarement</b> une activation élevée, on peut raisonnablement supposer qu&#39;il ne contribue pas à la sortie du modèle, et on peut donc le supprimer sans risque.</p><p class="paragraph" style="text-align:left;">Le tableau suivant compare la précision du modèle pruné à celle du modèle original (complet), pour différents seuils de pruning (<code>λ</code>) :</p><div class="image"><img alt="Tableau comparant la précision de validation et la réduction du nombre de paramètres du modèle original et de modèles élagués, pour des seuils de pruning (λ) allant de 0,1 à 1." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7e4f76d8-9932-4bdc-889a-1b9b2ff5a93e/_337-activation-pruning-tableau-precision-seuils.png.png?t=1790543742"/></div><p class="paragraph" style="text-align:left;">Remarque un truc ici.</p><p class="paragraph" style="text-align:left;">Avec un seuil de pruning <b>λ=0.4</b>, la précision de validation du modèle ne baisse que de 0,62 %, mais <b>le nombre de paramètres chute, lui, de 72 %</b>.</p><div class="image"><img alt="Illustration comparant visuellement la taille du modèle original (grille complète) à celle du modèle élagué (grille fortement réduite)." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5f2b2fb3-a4f1-4756-9573-4a3ca7296f57/_337-activation-pruning-reduction-parametres.png?t=1790543774"/></div><p class="paragraph" style="text-align:left;">C&#39;est une réduction énorme, alors que les deux modèles restent quasiment aussi bons !</p><p class="paragraph" style="text-align:left;">Bien sûr, il y a un compromis, puisqu&#39;on ne fait pas aussi bien que le modèle original.</p><p class="paragraph" style="text-align:left;">Mais dans beaucoup de cas, surtout quand on déploie des modèles de ML en production, la précision n&#39;est pas la seule métrique qui compte.</p><div class="image"><img alt="Schéma montrant qu&#39;un modèle déployé doit aussi être évalué sur le run-time, l&#39;utilisation des ressources et les utilisateurs, en plus de la précision." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0317d3a7-ee9e-4ebf-86c1-143cd086d88e/_337-activation-pruning-criteres-deploiement.png.png?t=1790543826"/></div><p class="paragraph" style="text-align:left;">D&#39;autres métriques opérationnelles, comme <b>l&#39;efficacité, la vitesse ou la consommation mémoire</b>, entrent aussi en jeu, et de façon décisive.</p><p class="paragraph" style="text-align:left;">C&#39;est pour ça que les techniques de compression de modèles sont si importantes dans ces cas-là.</p><p class="paragraph" style="text-align:left;">Si tu veux creuser le sujet, on en parle en détail dans ce dossier complémentaire : <a class="link" href="https://www.monshotdata.com/p/compression-modeles-machine-learning-efficace?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=activation-pruning-reduis-la-taille-de-ton-reseau-sans-perdre-en-performance" target="_blank" rel="noopener noreferrer nofollow">Model Compression : une étape critique vers un Machine Learning efficace</a>.</p><p class="paragraph" style="text-align:left;">Aujourd&#39;hui, on n&#39;a vu qu&#39;une seule technique (l&#39;activation pruning), mais le mini-cours en couvre 6, avec leur implémentation en PyTorch.</p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/compression-modeles-machine-learning-efficace?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=activation-pruning-reduis-la-taille-de-ton-reseau-sans-perdre-en-performance" target="_blank"><div class="embed__content"><p class="embed__title"> Compression de modèles : un levier clé pour un machine learning efficace </p><p class="embed__description"> Apprends les techniques essentielles de compression de modèles ML : pruning, factorisation et quantification pour réduire l&#39;empreinte et accélérer l&#39;inférence. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/8ad2d417-5311-48af-b2a2-b758b9b58bc9/Mini-cours__17_-_Compression_de_mode%CC%80les_en_ML.png?t=1772986037"/></a></div><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quelles sont, selon toi, d&#39;autres façons de rendre les modèles de ML plus adaptés à la production ?</p><p class="paragraph" style="text-align:left;"><b>👉 Envie d&#39;aller plus loin ? DataXp t&#39;attend → </b><b><a class="link" href="https://dataxp.fr?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=activation-pruning-reduis-la-taille-de-ton-reseau-sans-perdre-en-performance" target="_blank" rel="noopener noreferrer nofollow">dataxp.fr</a></b></p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=3ea3d79b-64d1-4cd0-ad62-81c8494854eb&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Identifier les doublons flous dans un jeu de données d&#39;un million de lignes</title>
  <description>🎯 Shot #336 - La technique de bucketing qui réduit 3 ans de calcul à quelques heures.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e64b838c-cd32-4e4f-b07f-eb16f56d6ad9/_336-doublons-flous-exemple-cover.png" length="35343" type="image/png"/>
  <link>https://www.monshotdata.com/p/doublons-flous-million-enregistrements</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/doublons-flous-million-enregistrements</guid>
  <pubDate>Mon, 21 Sep 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-09-21T10:00:00Z</atom:published>
    <category><![CDATA[Pandas]]></category>
    <category><![CDATA[Shot Data]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">La duplication de données est un gros problème auquel de nombreuses organisations sont confrontées.</p><p class="paragraph" style="text-align:left;">Ça pose problème parce que :</p><ul><li><p class="paragraph" style="text-align:left;">Ça gaspille de l&#39;espace de stockage.</p></li><li><p class="paragraph" style="text-align:left;">Ça peut mener à des analyses de données incorrectes.</p></li><li><p class="paragraph" style="text-align:left;">Ça peut entraîner des erreurs de reporting, et bien plus encore.</p></li></ul><p class="paragraph" style="text-align:left;">En lisant ça, tu te dis peut-être qu&#39;on peut supprimer les doublons avec des méthodes classiques comme <code>df.drop_duplicates()</code>.</p><div class="image"><img alt="Illustration montrant Pandas retirer les lignes en doublon d&#39;un tableau de données grâce à drop_duplicates()." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2aae9872-29c0-4b47-8f67-5a5507515f9e/_336-pandas-supprimer-doublons.png?t=1789858870"/><div class="image__source"><span class="image__source_text"><p>Utiliser Pandas pour supprimer les doublons</p></span></div></div><p class="paragraph" style="text-align:left;"><b>Mais que se passe-t-il si tes données contiennent des doublons flous ?</b></p><p class="paragraph" style="text-align:left;">Les doublons flous, ce sont des enregistrements qui ne sont pas des copies exactes les uns des autres, mais qui, d&#39;une manière ou d&#39;une autre, semblent désigner la même chose. C&#39;est ce que montre l&#39;exemple ci-dessous : </p><div class="image"><img alt="Tableau comparant deux enregistrements avec le même prénom, une adresse similaire et un numéro de téléphone presque identique." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/80d0071e-7351-4830-a453-2e7b3a8f3ec3/_336-doublons-flous-exemple.png.png?t=1789858990"/><div class="image__source"><span class="image__source_text"><p>Les enregistrements ont le même prénom, une adresse similaire, et un numéro de téléphone presque identique.</p></span></div></div><p class="paragraph" style="text-align:left;">La méthode Pandas sera inefficace, car elle ne supprime que les doublons exacts.</p><p class="paragraph" style="text-align:left;">Alors, que faire ?</p><p class="paragraph" style="text-align:left;">Imaginons que tes données contiennent plus d&#39;un million d&#39;enregistrements.</p><p class="paragraph" style="text-align:left;"><b>Comment identifierais-tu les doublons flous dans ce dataset ?</b></p><p class="paragraph" style="text-align:left;">Une première option serait de comparer naïvement chaque paire d&#39;enregistrements, comme illustré ci-dessous : </p><div class="image"><img alt="Schéma montrant chaque enregistrement comparé à tous les autres enregistrements du dataset." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/85af15fb-2d0a-4f51-bf0f-91188b27caa5/_336-comparer-chaque-paire-enregistrements.png?t=1789859032"/><div class="image__source"><span class="image__source_text"><p>Comparer chaque paire d&#39;enregistrements</p></span></div></div><p class="paragraph" style="text-align:left;">On peut définir une métrique de distance pour chaque champ et générer un score de similarité pour chaque paire d&#39;enregistrements.</p><p class="paragraph" style="text-align:left;">Mais cette approche est irréalisable à grande échelle.</p><p class="paragraph" style="text-align:left;">Par exemple, sur un dataset d&#39;à peine un million d&#39;enregistrements, comparer chaque paire donnerait 10¹² comparaisons (n²).</p><div class="image"><img alt="Schéma illustrant que l&#39;approche naïve génère 10 puissance 12 comparaisons sur un dataset d&#39;un million d&#39;enregistrements." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bcc85b4a-faeb-451c-9b21-d1f69b6fbc86/_336-complexite-approche-naive.png.png?t=1789859233"/><div class="image__source"><span class="image__source_text"><p>Complexité de l&#39;approche naïve</p></span></div></div><p class="paragraph" style="text-align:left;">Même en supposant une vitesse correcte de 10 000 comparaisons par seconde, cette approche prendrait environ 3 ans pour se terminer.</p><p class="paragraph" style="text-align:left;">Peut-on faire mieux ?</p><p class="paragraph" style="text-align:left;">Bien sûr que oui !</p><p class="paragraph" style="text-align:left;">Mais d&#39;abord, il faut comprendre une propriété particulière des doublons flous.</p><p class="paragraph" style="text-align:left;">Si deux enregistrements sont des doublons, ils vont forcément partager un certain chevauchement lexical (ou textuel).</p><p class="paragraph" style="text-align:left;">Par exemple, prends le dataset ci-dessous :</p><div class="image"><img alt="Tableau de données montrant des enregistrements sans chevauchement lexical, donc garantis distincts, malgré des champs partiellement similaires." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0a460ca3-b878-4060-96a3-c579105238a1/_336-enregistrements-garantis-distincts.png.png?t=1789859304"/></div><p class="paragraph" style="text-align:left;">Ici, comparer le prénom &quot;Daniel&quot; à &quot;Philip&quot; ou &quot;Shannon&quot; à &quot;Julia&quot; n&#39;a aucun sens. Il n&#39;y a littéralement aucun chevauchement lexical.</p><p class="paragraph" style="text-align:left;">Ils sont donc garantis d&#39;être des enregistrements distincts.</p><p class="paragraph" style="text-align:left;">Ça fait aussi sens intuitivement.</p><p class="paragraph" style="text-align:left;"><b>Si on appelle deux enregistrements des &quot;doublons&quot;, il doit forcément y avoir un chevauchement lexical.</b></p><p class="paragraph" style="text-align:left;">Pourtant, l&#39;approche naïve va quand même perdre du temps à les comparer.</p><p class="paragraph" style="text-align:left;">On peut exploiter cette propriété de &quot;chevauchement lexical&quot; des doublons pour réduire intelligemment le nombre total de comparaisons.</p><p class="paragraph" style="text-align:left;">Plus précisément, on segmente les données en plus petits buckets en appliquant certaines règles.</p><p class="paragraph" style="text-align:left;">Par exemple, reprends le dataset précédent. Une règle possible serait de créer des buckets basés sur les trois premières lettres du prénom.</p><div class="image"><img alt="Tableau de données regroupé selon les trois premières lettres du prénom, formant les buckets Dan, Ala, Phi, Sha et Jul." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/620ea630-ba83-458e-addf-e05c2996862f/_336-regrouper-prefixe-prenom.png.png?t=1789859355"/><div class="image__source"><span class="image__source_text"><p>Grouper les données selon des règles</p></span></div></div><p class="paragraph" style="text-align:left;">Ainsi, on ne comparera deux enregistrements que s&#39;ils se trouvent dans le même bucket.</p><p class="paragraph" style="text-align:left;">Si les trois premières lettres sont différentes, les enregistrements tomberont dans des buckets différents. Ils ne seront donc jamais comparés.</p><p class="paragraph" style="text-align:left;">Après avoir segmenté les enregistrements, on aurait <b>éliminé près de 98-99 %</b> des comparaisons inutiles qui auraient eu lieu sinon.</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">Enfin, on peut appliquer notre algorithme de comparaison naïf sur chaque bucket, individuellement.</p><div class="image"><img alt="Schéma montrant les enregistrements répartis en 4 buckets, chacun traité séparément par l&#39;algorithme de comparaison." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e8abfd3f-5a66-4de8-a587-c39d2bfb2bc8/_336-grouper-enregistrements-buckets.png.png?t=1789859431"/><div class="image__source"><span class="image__source_text"><p>Grouper les enregistrements selon des règles</p></span></div></div><p class="paragraph" style="text-align:left;">L&#39;approche optimisée peut tourner en quelques heures seulement, au lieu de prendre des années.</p><p class="paragraph" style="text-align:left;">De cette manière, on réduit drastiquement le temps d&#39;exécution tout en obtenant une excellente précision de dédoublonnage.</p><p class="paragraph" style="text-align:left;">Plutôt cool, non ?</p><p class="paragraph" style="text-align:left;">Bien sûr, il faudra analyser les données en profondeur pour définir ces règles de segmentation.</p><p class="paragraph" style="text-align:left;">Mais qu&#39;est-ce qui est le plus malin :</p><ul><li><p class="paragraph" style="text-align:left;">Utiliser l&#39;approche naïve, qui prend trois ans à tourner, OU,</p></li><li><p class="paragraph" style="text-align:left;">Passer un peu de temps à analyser les données, concevoir des règles, et exécuter le dédoublonnage en quelques heures ?</p></li></ul><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> peux-tu encore optimiser cette approche ?</p><p class="paragraph" style="text-align:left;"><b>👉 Envie d&#39;aller plus loin ? DataXp t&#39;attend → </b><b><a class="link" href="https://dataxp.fr?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=identifier-les-doublons-flous-dans-un-jeu-de-donnees-d-un-million-de-lignes" target="_blank" rel="noopener noreferrer nofollow">dataxp.fr</a></b></p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=5f180798-cebb-4e9f-89b6-829faba89dd8&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>KAN from scratch : implémentation complète en PyTorch</title>
  <description>👀​ Mini-cours #39 - Spline apprenable, KANLayer, entraînement et pykan : tout ce qu&#39;il faut pour construire ton propre KAN.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f35b5666-cf06-4b2d-9947-4ea1552eedf7/kan-pykan-08-visualiser-kan-entraine-paraboles.png.png" length="172075" type="image/png"/>
  <link>https://www.monshotdata.com/p/implementer-kan-from-scratch-pytorch</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/implementer-kan-from-scratch-pytorch</guid>
  <pubDate>Wed, 16 Sep 2026 09:30:00 +0000</pubDate>
  <atom:published>2026-09-16T09:30:00Z</atom:published>
    <category><![CDATA[Deep Learning]]></category>
    <category><![CDATA[Architectures Et Entraînement En Deep Learning]]></category>
    <category><![CDATA[Pro]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#f2eafe;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:2.0px 2.0px 2.0px 2.0px;"><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Psst... Contenu Exclusif Réservé aux Membres !</b></span><br><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Ce mini-cours fait partie de notre espace premium. Rejoins dès maintenant le </span><b>Cercle des Experts</b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;"> pour débloquer l’intégralité de nos ressources, analyses approfondies et guides pratiques.</span><br><b>👉 </b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Clique ici pour découvrir les avantages et t’inscrire : </span><b><a class="link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=kan-from-scratch-implementation-complete-en-pytorch" target="_blank" rel="noopener noreferrer nofollow" style="color: #2563eb">Page d’adhésion</a></b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">.</span></p></div><div class="section" style="background-color:transparent;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Poppins, Helvetica, sans-serif, serif, EmojiFont;font-size:16px;">⏱️ </span><i><b>Temps de lecture</b></i><i> : 25-30 minutes</i></p></div><h2 class="heading" style="text-align:left;" id="introduction">Introduction</h2><p class="paragraph" style="text-align:left;">Dans le dossier de la semaine dernière, tu as découvert les rouages internes des Kolmogorov Arnold Networks (KAN) et leur fonctionnement. </p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/kolmogorov-arnold-networks-kan-guide-complet?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=kan-from-scratch-implementation-complete-en-pytorch" target="_blank"><div class="embed__content"><p class="embed__title"> Kolmogorov Arnold Networks (KAN) : le guide complet pour les data scientists </p><p class="embed__description"> Découvre comment fonctionnent les Kolmogorov Arnold Networks : théorèmes fondateurs, B-splines, entraînement, et comparaison détaillée face aux MLP. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/5b498a6a-33a6-454c-a847-abc530995c48/kan-00-cover-neural-network-vs-kan.png?t=1787769707"/></a></div><p class="paragraph" style="text-align:left;">À la fin de ce mini-cours, on avait annoncé un second volet consacré à l&#39;implémentation concrète des KAN avec PyTorch. Le voici.</p><p class="paragraph" style="text-align:left;">Pourquoi ce sujet ?</p><p class="paragraph" style="text-align:left;">Ce dossier me semble important parce qu&#39;on sait tous construire et entraîner un réseau de neurones avec des matrices de poids classiques. </p><div class="image"><img alt="Schéma d&#39;un réseau de neurones classique montrant les fonctions d&#39;activation fixes positionnées sur les nœuds et les poids apprenables sur les arêtes" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a058ddca-b3e6-413a-8d6c-d8bca000bfd2/kan-03-activation-fixe-noeuds-reseau-neurones.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">Mais les KAN reposent sur une idée différente. Les matrices que possède un KAN dans une couche ne contiennent pas des poids, mais des fonctions, appliquées à l&#39;entrée de cette couche.</p><div class="image"><img alt="Illustration montrant que chaque entrée de la matrice phi1 est une fonction univariée différente, par exemple un polynôme de degré 2 ou 3" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0dedc2ad-6159-4566-8440-c9eb8d73664e/kan-23-exemple-fonctions-univariees-matrice-phi1.png.png?t=1787769707"/></div><p class="paragraph" style="text-align:left;">En implémentant les KAN, tu vas donc comprendre comment on entraîne un réseau qui ne repose pas sur les matrices de poids traditionnelles, mais sur des fonctions univariées.</p><div class="image"><img alt="Illustration posant la question de l&#39;estimation des fonctions univariées contenues dans la matrice phi1 d&#39;un réseau KAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b0b6499d-dd87-4a29-be89-2951dd94c071/kan-25-comment-estimer-fonctions-univariees.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Comme on l&#39;a vu dans ce dossier précédent, les KAN remettent en question la conception classique des réseaux de neurones et proposent un nouveau paradigme pour les concevoir et les entraîner.</p><div class="image"><img alt="Schéma d&#39;un réseau de neurones classique illustrant la séparation entre couche linéaire et non-linéarité apportée par la fonction d&#39;activation" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8591c22b-e274-4fae-8fb6-d733f3d82a3c/kan-01-design-traditionnel-reseau-neurones.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">En résumé, l&#39;idée est que plutôt que d&#39;empiler simplement des couches les unes sur les autres (qui sont toujours des transformations linéaires, la non-linéarité étant introduite volontairement via des fonctions d&#39;activation), les KAN proposent une approche alternative.</p><p class="paragraph" style="text-align:left;">Les auteurs utilisent des fonctions apprenables complexes (appelées B-splines) qui permettent de représenter directement des transformations non linéaires de l&#39;entrée, avec relativement moins de paramètres qu&#39;un réseau traditionnel. </p><div class="image"><img alt="Comparaison schématique entre un réseau de neurones classique, où les fonctions d&#39;activation fixes sont sur les nœuds, et un KAN, où les fonctions d&#39;activation apprenables sont sur les arêtes" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/974ff2c5-0336-4175-8776-94f3962b3f25/kan-02-comparaison-reseau-neurones-vs-kan.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">Si tu observes bien l&#39;image ci-dessus :</p><ul><li><p class="paragraph" style="text-align:left;">Dans un réseau de neurones classique, les fonctions d&#39;activation sont fixes sur tout le réseau, et elles existent sur chaque <b>nœud</b> (illustré ci-dessous).</p></li></ul><div class="image"><img alt="Schéma d&#39;un réseau de neurones classique montrant les fonctions d&#39;activation fixes positionnées sur les nœuds et les poids apprenables sur les arêtes" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a058ddca-b3e6-413a-8d6c-d8bca000bfd2/kan-03-activation-fixe-noeuds-reseau-neurones.png.png?t=1787769708"/></div><ul><li><p class="paragraph" style="text-align:left;">Dans un KAN, en revanche, les fonctions d&#39;activation existent sur les arêtes (qui correspondent aux poids d&#39;un réseau traditionnel), et chaque arête possède sa propre fonction d&#39;activation.</p></li></ul><div class="image"><img alt="Schéma d&#39;un réseau KAN montrant les fonctions d&#39;activation apprenables sur les arêtes et l&#39;opération de somme réalisée sur les nœuds" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9b0fc02f-ead9-401e-baf2-eaef876a3095/kan-04-activation-apprenable-aretes-kan.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">Il paraît donc logique de s&#39;attendre à ce qu&#39;un KAN soit beaucoup plus précis et interprétable, avec moins de paramètres.</p><p class="paragraph" style="text-align:left;">Les KAN s&#39;appuient sur le théorème de représentation de Kolmogorov-Arnold, qui affirme que toute fonction continue multivariée peut être représentée comme la composition d&#39;un nombre <b>fini</b> de fonctions continues à une seule variable.</p><div class="image"><img alt="Formule complète et annotée du théorème de Kolmogorov-Arnold reliant une fonction continue multivariée à une composition de fonctions univariées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/38ff395f-81d9-4cdb-8751-57bc2be60758/kan-11-theoreme-kolmogorov-arnold-formule-complete.png.png?t=1787769707"/></div><p class="paragraph" style="text-align:left;">Si on développe les termes de la somme, on obtient ceci : </p><div class="image"><img alt="Version développée de la formule de Kolmogorov-Arnold, détaillant chaque terme psi_j appliqué à la somme des fonctions phi_ij(xi)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ac2b0a36-3258-4873-94ac-bd005b4584f3/kan-12-formule-developpee-kolmogorov-arnold.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">En résumé, tout ce qu&#39;on fait dans une couche KAN, c&#39;est prendre l&#39;entrée <code>(x₁, x₂, ..., xₙ)</code> et lui appliquer une transformation <code>φ</code>.</p><div class="image"><img alt="Diagramme de la première couche d&#39;un réseau KAN montrant les fonctions d&#39;activation appliquées aux entrées x1 et x2, regroupées sous la matrice phi1" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7500c597-f1f4-4b0a-8a99-231aef165c99/kan-18-couche-kan-phi1-entrees-x1-x2.png?t=1787769708"/><div class="image__source"><span class="image__source_text"><p><code>φ₁</code> désigne la transformation de la première couche.</p></span></div></div><p class="paragraph" style="text-align:left;">La matrice de transformation <code>φ₁</code> (correspondant à la première couche) peut donc être représentée ainsi : </p><div class="image"><img alt="Notation matricielle de phi1, la matrice de transformation de la première couche KAN, avant application aux entrées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/91911de5-d8a0-4bfb-8ab3-6b0116c3bc0e/kan-18b-matrice-phi1-notation-brute.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">Dans cette matrice :</p><ul><li><p class="paragraph" style="text-align:left;"><code>n</code> désigne le nombre d&#39;entrées.</p></li><li><p class="paragraph" style="text-align:left;"><code>m</code> désigne le nombre de nœuds de sortie de cette couche.</p></li><li><p class="paragraph" style="text-align:left;"><b>[IMPORTANT] Les éléments de la matrice ne sont pas des nombres, ce sont des fonctions univariées. Par exemple :</b></p><ul><li><p class="paragraph" style="text-align:left;"><code>φ₁₁</code> pourrait être <code>2x² − 3x + 4</code>.</p></li><li><p class="paragraph" style="text-align:left;"><code>φ₁₂</code> pourrait être <code>4x³ + 5x² + x − 2</code>.</p></li><li><p class="paragraph" style="text-align:left;">et ainsi de suite...</p></li></ul></li></ul><p class="paragraph" style="text-align:left;">Pour générer une transformation, il suffit donc de prendre le vecteur d&#39;entrée et de le faire passer à travers les fonctions correspondantes de cette matrice de transformation :</p><div class="image"><img alt="Formule mathématique z1=phi1 * X, montrant le calcul de la sortie de la première couche KAN à partir de la matrice de transformation et du vecteur d&#39;entrée" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f9a99aa2-3b46-4b4c-8497-32b9db5b72bc/kan-19-formule-matrice-transformation-phi1.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">On obtient alors le vecteur suivant : </p><div class="image"><img alt="Zoom sur la formule z1 montrant comment chaque fonction phi de la matrice est appliquée individuellement aux entrées x1 à xn" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8bf34af6-060d-4ece-b053-09bc33d9bbf5/kan-20-detail-fonctions-appliquees-entrees.png.png?t=1787769707"/></div><p class="paragraph" style="text-align:left;">Ce vecteur est la sortie de la première couche, qui est ensuite transmise à la couche suivante pour une nouvelle transformation.</p><p class="paragraph" style="text-align:left;">Le réseau KAN complet peut donc se condenser en une seule formule :</p><div class="image"><img alt="Formule mathématique représentant un réseau KAN complet comme une composition successive des matrices de transformation phi de chaque couche" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2a272c19-e98f-47b0-8f65-155606941951/kan-21-formule-condensee-reseau-kan-complet.png.png?t=1787769707"/></div><p class="paragraph" style="text-align:left;">Où :</p><ul><li><p class="paragraph" style="text-align:left;"><code>x</code> désigne le vecteur d&#39;entrée</p></li><li><p class="paragraph" style="text-align:left;"><code>φₖ</code> désigne la matrice de transformation fonctionnelle de la couche <code>k</code>.</p></li><li><p class="paragraph" style="text-align:left;"><code>KAN(x)</code> est la sortie du réseau KAN.</p></li></ul><p class="paragraph" style="text-align:left;">Dans un KAN, les matrices <code>φₖ</code> sont elles-mêmes des matrices de transformation non linéaires, et chaque fonction univariée peut être très différente d&#39;une autre. </p><div class="image"><img alt="Illustration montrant que chaque entrée de la matrice phi1 est une fonction univariée différente, par exemple un polynôme de degré 2 ou 3" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0dedc2ad-6159-4566-8440-c9eb8d73664e/kan-23-exemple-fonctions-univariees-matrice-phi1.png.png?t=1787769707"/></div><p class="paragraph" style="text-align:left;">Mais comment estime-t-on les fonctions univariées de chacune de ces matrices de transformation ?</p><div class="image"><img alt="Illustration posant la question de l&#39;estimation des fonctions univariées contenues dans la matrice phi1 d&#39;un réseau KAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b0b6499d-dd87-4a29-be89-2951dd94c071/kan-25-comment-estimer-fonctions-univariees.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">Comme on l&#39;a vu dans le dossier d&#39;introduction aux KAN, on utilise des B-splines pour cela.</p><p class="paragraph" style="text-align:left;">Rappelle-toi que dès qu&#39;on crée une B-spline, on dispose déjà de points de contrôle <code>(P₁, P₂, …, Pₙ)</code>, ainsi que des fonctions de base sous-jacentes déterminées par le degré <code>k</code>.</p><p class="paragraph" style="text-align:left;">Et en faisant varier la position des points de contrôle, on obtient différentes courbes, comme le montre l’animation ci-dessous : </p><div class="image"><img alt="Animation montrant comment le déplacement d&#39;un point de contrôle modifie la forme d&#39;une courbe B-spline, illustrant l&#39;intuition derrière l&#39;entraînement des KAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cca48e79-d60d-4cc2-a024-77d380f01602/kan-63-b-spline-3d-deplacement-point-controle-local.gif?t=1787769707"/></div><p class="paragraph" style="text-align:left;"><b>Voici donc l&#39;idée centrale des KAN :</b></p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">C&#39;est tout.</p><p class="paragraph" style="text-align:left;">En ajustant la position des points de contrôle pendant l&#39;entraînement, le modèle KAN peut façonner dynamiquement les fonctions d&#39;activation qui correspondent le mieux aux données.</p><ul><li><p class="paragraph" style="text-align:left;">On part de positions initiales pour les points de contrôle, exactement comme on le fait pour des poids.</p></li><li><p class="paragraph" style="text-align:left;">Pendant l&#39;entraînement, on met à jour la position de ces points de contrôle par rétropropagation, de la même manière qu&#39;on met à jour les poids d&#39;un réseau de neurones.</p></li><li><p class="paragraph" style="text-align:left;">On utilise un algorithme d&#39;optimisation (par exemple la descente de gradient) pour ajuster les points de contrôle afin que le modèle minimise la fonction de perte.</p></li></ul><p class="paragraph" style="text-align:left;">Mathématiquement, dans un KAN, chaque fonction d&#39;activation φ(x) est définie ainsi : </p><div class="image"><img alt="Formule mathématique d&#39;une fonction d&#39;activation phi(x) d&#39;un KAN, combinant une fonction de base b(x) et une spline apprenable" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/247c469f-1cb4-49aa-98ed-5d361303a001/kan-48-formule-fonction-activation-kan.png.png?t=1787769708"/></div><p class="paragraph" style="text-align:left;">Où :</p><div class="image"><img alt="Formule annotée de la fonction d&#39;activation phi(x) d&#39;un KAN, précisant les paramètres apprenables w et ci ainsi que la fonction fixe b(x)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a2f9c1a9-d7b6-4d6f-8000-7230070c91a4/kan-49-fonction-activation-kan-parametres-apprenables.png.png?t=1787769707"/></div><ul><li><p class="paragraph" style="text-align:left;">Le calcul fait intervenir une fonction de base <code>b(x)</code> (un peu comme une connexion résiduelle).</p></li><li><p class="paragraph" style="text-align:left;"><code>spline(x)</code> est apprenable, plus précisément les paramètres cᵢ, qui désignent la position des points de contrôle.</p></li><li><p class="paragraph" style="text-align:left;">Il y a un autre paramètre, w. Les auteurs précisent que, en théorie, w est redondant puisqu&#39;il peut être absorbé dans <code>b(x)</code> et <code>spline(x)</code>. Ils l&#39;ont néanmoins conservé pour mieux contrôler l&#39;amplitude globale de la fonction d&#39;activation.</p></li></ul><p class="paragraph" style="text-align:left;">Une fois cette définition posée, le réseau s&#39;entraîne exactement comme n&#39;importe quel autre réseau de neurones.</p><p class="paragraph" style="text-align:left;">Plus précisément :</p><ul><li><p class="paragraph" style="text-align:left;">On initialise chacune des matrices phi comme ceci :</p></li></ul><div class="image"><img alt="Matrice de transformation phi1 d&#39;un KAN, chaque entrée représentant la fonction d&#39;activation complète w(b(x)+spline(x))" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7127912f-a3a5-4cad-9ecd-cb9861bfc059/kan-52-matrice-phi1-fonctions-activation-completes.png.png?t=1787769707"/></div><ul><li><p class="paragraph" style="text-align:left;">On exécute la forward pass : </p></li></ul><div class="image"><img alt="Formule mathématique représentant un réseau KAN complet comme une composition successive des matrices de transformation phi de chaque couche" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/83b1aba2-c76b-4fee-a177-19a561d9ca28/kan-21-formule-condensee-reseau-kan-complet-2.png.png?t=1787769708"/></div><ul><li><p class="paragraph" style="text-align:left;">On calcule la perte et on effectue la rétropropagation.</p></li></ul><p class="paragraph" style="text-align:left;">Voilà !</p><h2 class="heading" style="text-align:left;" id="implmentation-dun-kan">Implémentation d&#39;un KAN</h2><p class="paragraph" style="text-align:left;">Dans cette section, on va implémenter un KAN avec PyTorch.</p><p class="paragraph" style="text-align:left;">Mais on va se limiter à une implémentation simplifiée des KAN.</p><div class="section" style="background-color:#fae7e7;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;">👉 Par &quot;simplifiée&quot;, on entend une implémentation plus simple, qui ne correspond pas exactement à l&#39;implémentation originale. L&#39;objectif de cet article est de te donner une intuition de la manière dont on entraîne un réseau qui ne repose pas sur des matrices de poids traditionnelles, mais sur des fonctions univariées.</p></div><h3 class="heading" style="text-align:left;" id="le-plan-de-travail">Le plan de travail</h3><p class="paragraph" style="text-align:left;">Voici les étapes :</p><ul><li><p class="paragraph" style="text-align:left;">On doit d&#39;abord définir une entité &quot;arête&quot; (<code>edge</code>) du réseau, qui sera une fonction univariée composée d&#39;une spline, d&#39;une SiLU, et d&#39;un unique paramètre de poids :</p></li></ul><div class="image"><img alt="Formule annotée de la fonction d&#39;activation phi(x) d&#39;un KAN, précisant les paramètres apprenables w et ci ainsi que la fonction fixe b(x)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a2f9c1a9-d7b6-4d6f-8000-7230070c91a4/kan-49-fonction-activation-kan-parametres-apprenables.png.png?t=1787769707"/></div><ul><li><p class="paragraph" style="text-align:left;">Ensuite, on doit définir une couche personnalisée du réseau, composée d&#39;un arrangement matriciel de ces fonctions univariées :</p></li></ul><div class="image"><img alt="Notation matricielle de phi1, la matrice de transformation de la première couche KAN, avant application aux entrées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/91911de5-d8a0-4bfb-8ab3-6b0116c3bc0e/kan-18b-matrice-phi1-notation-brute.png?t=1787769708"/></div><ul><li><p class="paragraph" style="text-align:left;">On définira ensuite notre classe réseau, qui sera une composition de ces couches personnalisées connectées entre elles.</p></li></ul><div class="image"><img alt="Formule mathématique représentant un réseau KAN complet comme une composition successive des matrices de transformation phi de chaque couche" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2a272c19-e98f-47b0-8f65-155606941951/kan-21-formule-condensee-reseau-kan-complet.png.png?t=1787769707"/></div><ul><li><p class="paragraph" style="text-align:left;">Enfin, on créera un jeu de données factice, on définira un optimiseur et une fonction de perte, et on entraînera le modèle.</p></li></ul><p id="cela-pos-passons-limplmentation" class="paragraph" style="text-align:left;">Cela posé, passons à l&#39;implémentation.</p><hr class="content_break"><div class="section" style="background-color:#1B3A6B;border-color:#F7931E;border-radius:8px;border-style:solid;border-width:3px;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><h3 class="heading" style="text-align:left;">💡<span style="color:#ffffff;"> En continuant, tu vas découvrir : </span></h3><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#ffffff;">Comment coder, arête par arête, une fonction d&#39;activation univariée (spline apprenable + SiLU) en PyTorch</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#ffffff;">Comment assembler ces fonctions en une KANLayer complète, avec un exemple chiffré, indice par indice</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#ffffff;">Comment entraîner ce KAN &quot;from scratch&quot; sur un jeu de données, et lire sa courbe de convergence</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#ffffff;">Comment utiliser le package officiel pykan pour construire et visualiser un vrai KAN</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#ffffff;">Le vrai goulot d&#39;étranglement des KAN (10x plus lent qu&#39;un MLP) et comment efficient-KAN le résout</span></p></li></ul></div><div class="paywall"><hr class="paywall__break"/><div class="paywall__content"><h2 class="paywall__header"> La suite de ce mini-cours est réservée aux membres du Cercle des Experts. </h2><p class="paywall__description"> Tu as déjà le début. Pour accéder à l’explication complète et à tous les contenus avancés, rejoins le Cercle des Experts dès maintenant. </p><p class="paywall__links"><a class="paywall__upgrade_link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=kan-from-scratch-implementation-complete-en-pytorch">Rejoindre le Cercle des Experts</a> Translation missing: en.app.shared.conjuction.or <a class="paywall__login_link" href="https://www.monshotdata.com/login?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=kan-from-scratch-implementation-complete-en-pytorch">Sign In</a></p><div class="paywall__upsell"><div class="paywall__upsell_header"><h3> En devenant membre, tu débloques </h3></div><ul class="paywall__upsell_features"><li class="paywall__upsell_feature"> L’intégralité de ce mini-cours (sans coupure) </li><li class="paywall__upsell_feature"> Tous les mini-cours archivés et les ressources associées </li><li class="paywall__upsell_feature"> 1 nouveau mini-cours chaque semaine pour progresser en continu </li></ul></div></div></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=c02f294c-8197-4696-88d8-ef7ac00f8391&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Missing data : ne saute JAMAIS cette étape avant l&#39;imputation</title>
  <description>🎯 Shot #335 - MCAR, MAR, MNAR expliqués simplement, avec des exemples concrets pour bien choisir ta stratégie.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0183164d-555b-4040-8484-0b5fcc47b31c/donnees-manquantes-au-hasard-cover.png" length="50021" type="image/png"/>
  <link>https://www.monshotdata.com/p/mcar-mar-mnar-donnees-manquantes</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/mcar-mar-mnar-donnees-manquantes</guid>
  <pubDate>Mon, 14 Sep 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-09-14T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Données Manquantes]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Quand on repère des valeurs manquantes dans un dataset, la plupart des gens se lancent directement dans leur imputation.</p><p class="paragraph" style="text-align:left;">Mais aussi contre-intuitif que ça puisse paraître, <b>la première étape vers l&#39;imputation des données manquantes ne doit JAMAIS être l&#39;imputation</b>.</p><p class="paragraph" style="text-align:left;">La vraie première étape, c&#39;est de comprendre la raison derrière cette absence de données. Pourquoi ? Parce que la stratégie d&#39;imputation dépend en grande partie du <b>POURQUOI</b> ces données manquent.</p><div class="image"><img alt="Illustration en deux parties. À gauche, une croix rouge et le texte &quot;Des valeurs manquantes, je les impute rapidement&quot; représentent l&#39;erreur courante. À droite, une coche verte et le texte &quot;Je dois comprendre POURQUOI j&#39;ai des valeurs manquantes avant de les imputer&quot; représentent la bonne pratique. Deux grilles 5x5 avec des cellules rouges figurant les valeurs manquantes accompagnent chaque scène." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0be30412-4ea2-427c-a93e-2ddf73112d41/erreur-imputation-vs-bonne-pratique.png.png?t=1789340275"/></div><p class="paragraph" style="text-align:left;">Plus précisément, l&#39;absence de données peut être de trois types :</p><ul><li><p class="paragraph" style="text-align:left;">Missing completely at random (MCAR).</p></li><li><p class="paragraph" style="text-align:left;">Missing at random (MAR).</p></li><li><p class="paragraph" style="text-align:left;">Missing not at random (MNAR).</p></li></ul><p class="paragraph" style="text-align:left;">C&#39;est seulement une fois qu&#39;on a identifié la raison qu&#39;on peut passer aux bonnes techniques d&#39;imputation.</p><p class="paragraph" style="text-align:left;">C&#39;est quoi le MCAR, le MAR et le MNAR ? On décortique tout ça aujourd&#39;hui.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="1-missing-completely-at-random-mcar">1) Missing completely at random (MCAR)</h2><p class="paragraph" style="text-align:left;">Le MCAR, c&#39;est une situation où les données manquent vraiment au hasard, sans aucun lien avec une variable observée ou non observée.</p><p class="paragraph" style="text-align:left;"><b>Autrement dit, les points de données manquants ne suivent aucun schéma identifiable.</b></p><div class="image"><img alt="Grille 5x5 avec plusieurs cellules rouges représentant des valeurs manquantes réparties sans motif particulier, accompagnée du texte &quot;Données avec des valeurs manquantes au hasard&quot;." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/02ea9e23-e0b3-4799-8944-fd0d5b2724c0/donnees-manquantes-au-hasard.png.png?t=1789340331"/></div><p class="paragraph" style="text-align:left;">Par exemple, dans des réponses à un sondage avec des valeurs manquantes, supposer le MCAR reviendrait à dire que certains participants ont, <b>sans le faire exprès</b>, sauté au hasard telle ou telle question.</p><p class="paragraph" style="text-align:left;">Cela dit, d&#39;après mon expérience, l<b>e MCAR est le plus souvent une hypothèse peu réaliste</b>. Autrement dit, dans la grande majorité des datasets réels avec des valeurs manquantes, les données ne sont généralement pas MCAR.</p><p class="paragraph" style="text-align:left;">Pourquoi ? Parce que dans des scénarios réels, l&#39;apparition de données manquantes est souvent influencée par un facteur, observé ou non.</p><p class="paragraph" style="text-align:left;">Le comportement humain, la manière dont le sondage a été administré, ou n&#39;importe quel événement externe peuvent être à l&#39;origine de valeurs manquantes dans un dataset.</p><p class="paragraph" style="text-align:left;">Par exemple, des participants peuvent choisir volontairement de ne pas répondre à des questions sensibles, ou certains groupes peuvent être plus enclins à ne pas répondre du tout, ce qui crée des données manquantes.</p><p class="paragraph" style="text-align:left;">C&#39;est pour ça que supposer le MCAR n&#39;est une hypothèse raisonnable que si tu connais le processus de collecte de données de bout en bout et/ou que tu as une expertise métier sur le sujet.</p><p class="paragraph" style="text-align:left;">C&#39;est là qu&#39;il devient essentiel, pour un data scientist, d&#39;échanger avec les data engineers et de comprendre le processus de collecte des données. D&#39;ailleurs, ça ne concerne pas que le MCAR, ça s&#39;applique aussi aux deux autres situations qu&#39;on va voir juste après.</p><div class="image"><img alt="Un data scientist demande &quot;Je veux comprendre le processus de collecte des données&quot;, et un data engineer répond &quot;Bien sûr&quot;. Une grille 5x5 avec des valeurs manquantes est représentée entre les deux personnages." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/af059a81-4b2a-41d2-b55d-8ba35aa3048e/dialogue-data-scientist-data-engineer.png.png?t=1789340373"/></div><p class="paragraph" style="text-align:left;">Comprendre le processus de collecte de données ne fera JAMAIS de mal.</p><p class="paragraph" style="text-align:left;">Cela dit, rien ne nous empêche de supposer que les valeurs manquantes sont MCAR, si ça semble être une hypothèse raisonnable au vu de l&#39;analyse, et/ou des retours d&#39;experts métier, et/ou après avoir compris le mécanisme de collecte des données.</p><p class="paragraph" style="text-align:left;">Tu peux alors utiliser les techniques d&#39;imputation univariée les plus simples.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="2-missing-at-random-mar">2) Missing at random (MAR)</h2><p class="paragraph" style="text-align:left;">Le MAR, c&#39;est une situation où l&#39;absence de valeurs pour une feature peut s&#39;expliquer par d&#39;autres features observées dans le dataset.</p><div class="image"><img alt="Schéma montrant une colonne &quot;Feature avec valeurs manquantes&quot; reliée par une flèche au texte &quot;peut être expliquée par&quot; vers un tableau intitulé &quot;Données observées&quot;, illustrant le principe du MAR." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/77e38b65-4ab4-454c-ba23-90e18c342992/mar-feature-expliquee-par-donnees-observees.png.png?t=1789340415"/></div><p class="paragraph" style="text-align:left;">Contrairement au MCAR, le MAR est bien plus fréquent en pratique.</p><p class="paragraph" style="text-align:left;">Dans ce cas, l&#39;absence de données peut être expliquée avec une précision raisonnable grâce à des méthodes statistiques adaptées.</p><p class="paragraph" style="text-align:left;">Ainsi, même si la donnée est manquante, son apparition peut (dans une certaine mesure) être estimée à partir des informations déjà disponibles dans le dataset.</p><p class="paragraph" style="text-align:left;">Une façon courante d&#39;identifier le MAR consiste à conditionner sur une autre feature observée, et à observer si la probabilité de valeur manquante augmente.</p><div class="image"><img alt="Graphique en barres montrant le pourcentage de valeurs manquantes pour la Feature A, nettement plus élevé pour la Classe 1 que pour la Classe 2, avec le texte &quot;Le pourcentage de valeurs manquantes est élevé pour un type de valeur de feature&quot;." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c36b2d41-e99a-4755-94cb-08ea89cbedf0/mar-pourcentage-manquant-par-classe.png.png?t=1789340461"/></div><p class="paragraph" style="text-align:left;">Par exemple, dans une enquête sur la performance scolaire, les étudiants avec de meilleures notes seraient peut-être moins enclins à révéler le nombre d&#39;heures qu&#39;ils passent à étudier (par esprit de compétition, sans doute).</p><p class="paragraph" style="text-align:left;">C&#39;est là que des techniques comme l&#39;imputation par kNN, Miss Forest, etc., se montrent particulièrement efficaces. Elles utilisent d&#39;autres features observées pour imputer la feature manquante.</p><p class="paragraph" style="text-align:left;">Si tu veux creuser le sujet, on en a déjà parlé ici :</p><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.monshotdata.com/p/imputation-knn-valeurs-manquantes?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=missing-data-ne-saute-jamais-cette-etape-avant-l-imputation" target="_blank" rel="noopener noreferrer nofollow">Le shot data sur l&#39;imputation par kNN</a>. Voici comment ça fonctionne :</p></li></ul><div class="image"><img alt="Schéma en 4 étapes : sélectionner une ligne avec une valeur manquante, trouver les k plus proches voisins à partir des features présentes, imputer par la moyenne des voisins, puis répéter pour toutes les lignes concernées." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f25cfd1f-13a1-4e87-8b7a-f489bf995495/imputation-knn-etapes.png.png?t=1789340531"/></div><ul><li><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.monshotdata.com/p/imputation-missforest?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=missing-data-ne-saute-jamais-cette-etape-avant-l-imputation" target="_blank" rel="noopener noreferrer nofollow">Le shot data sur l&#39;imputation par Miss Forest</a>. Voici comment ça fonctionne :</p></li></ul><div class="image"><img alt="Schéma en 4 étapes : faire une première estimation des valeurs manquantes (moyenne, médiane, mode), entraîner un Random Forest avec la feature à imputer comme variable dépendante, prédire les valeurs manquantes, puis répéter avec le dataset imputé jusqu&#39;à convergence ou nombre maximal d&#39;itérations." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1d663f08-2e99-4e3f-861a-9da32c85bdbd/imputation-miss-forest-etapes.png.png?t=1789340568"/></div><hr class="content_break"><h2 class="heading" style="text-align:left;" id="3-missing-not-at-random-mnar">3) Missing not at random (MNAR)</h2><p class="paragraph" style="text-align:left;">Le MNAR est la situation la plus compliquée des trois.</p><p class="paragraph" style="text-align:left;">Dans le MNAR, l&#39;absence de données est due soit à la valeur manquante elle-même, soit aux features pour lesquelles on n&#39;a pas collecté de données.</p><div class="image"><img alt="Schéma illustrant le MNAR : l&#39;absence de données est soit directement liée à la valeur manquante elle-même, soit liée à des features non observées, représentées par un tableau à droite." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0d05fcff-55f3-4340-aa53-db1add41e764/mnar-schema-lien-valeur-manquante.png.png?t=1789340604"/></div><p class="paragraph" style="text-align:left;">Autrement dit, dans le MNAR, il existe un schéma bien défini dans les variables manquantes. Sauf que ce schéma n&#39;a aucun lien avec les features observées.</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">Par exemple, dans une enquête de santé, des participants avec un niveau de stress très élevé pourraient choisir consciemment de ne pas révéler ce niveau de stress, par peur du jugement ou de la stigmatisation.</p><p class="paragraph" style="text-align:left;"><b>Résultat : l&#39;absence de données sur le niveau de stress n&#39;a rien d&#39;aléatoire. Elle est directement influencée par le niveau de stress lui-même.</b></p><p class="paragraph" style="text-align:left;">En quelque sorte, plus le niveau de stress est élevé, moins la personne est susceptible de le révéler, et plus la valeur a de chances de manquer dans le dataset collecté.</p><p class="paragraph" style="text-align:left;">L&#39;absence de données dépend donc directement de la variable qui manque elle-même.</p><p class="paragraph" style="text-align:left;">C&#39;est piégeux, non ?</p><p class="paragraph" style="text-align:left;">Il n&#39;y a pas grand-chose à faire pour régler ça, à part collecter plus de données ou de features. Et l&#39;expertise métier devient alors extrêmement précieuse pour gérer intelligemment le MNAR et améliorer le processus de collecte.</p><p class="paragraph" style="text-align:left;">Parfois, j&#39;ai aussi préféré utiliser les techniques d&#39;imputation classiques (celles employées pour le MCAR et le MAR), tout simplement parce que collecter plus de données n&#39;est pas toujours faisable.</p><p class="paragraph" style="text-align:left;">Mais comme on l&#39;a vu plus haut, il existe un schéma d&#39;absence de données bien défini dans le MNAR, et il peut être important. Or, une imputation directe fera disparaître cette information.</p><p class="paragraph" style="text-align:left;">Une façon de conserver ce schéma est d&#39;ajouter une feature binaire, qui indique si la valeur a été imputée ou non.</p><div class="image"><img alt="Schéma montrant une feature avec valeurs manquantes transformée, via une imputation accompagnée de l&#39;ajout d&#39;un flag binaire, en une feature imputée associée à une colonne indiquant quelles valeurs ont été imputées (1) ou non (0)." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/91af9d6d-0d9d-4d78-a0e3-e27302ea3285/imputation-avec-flag-binaire.png.png?t=1789340642"/></div><p class="paragraph" style="text-align:left;">Ainsi, l&#39;algorithme de ML peut quand même accéder à ces schémas de données manquantes, et les apprendre.</p><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quels autres points aimerais-tu ajouter sur le MCAR, le MAR et le MNAR ?</p><p class="paragraph" style="text-align:left;"><b>👉 Envie d&#39;aller plus loin ? DataXp t&#39;attend → </b><b><a class="link" href="https://dataxp.fr?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=missing-data-ne-saute-jamais-cette-etape-avant-l-imputation" target="_blank" rel="noopener noreferrer nofollow">dataxp.fr</a></b></p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=bf8bd8b5-2578-4037-a29c-9156c3ce8082&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>MLE vs EM : quelle est la différence ?</title>
  <description>🎯 Shot #334 - Une question d&#39;entretien classique, décryptée pas à pas.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cdc120df-f6ad-4a46-966c-fb505d68a336/_334-comparatif-mle-vs-em-tableau.png.png" length="1801262" type="image/png"/>
  <link>https://www.monshotdata.com/p/mle-vs-em-difference</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/mle-vs-em-difference</guid>
  <pubDate>Fri, 11 Sep 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-09-11T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Machine Learning]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Le <b>maximum likelihood estimation (MLE)</b> et l&#39;<b>expectation maximization (EM)</b> sont deux techniques populaires pour déterminer les paramètres de modèles statistiques.</p><div class="image"><img alt="Illustration titre comparant le Maximum Likelihood Estimation (MLE) et l&#39;Expectation Maximization (EM)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ab640095-344e-441e-bbf4-6ddd3d2e1802/_334-mle-vs-em-intro.png.png?t=1789076844"/></div><p class="paragraph" style="text-align:left;">En raison de leur application dans <b>DE NOMBREUX</b> modèles statistiques, j&#39;ai vu cette distinction revenir dans pas mal d&#39;entretiens en data science, en particulier la différence entre les deux.</p><p class="paragraph" style="text-align:left;">Alors aujourd&#39;hui, on va les comprendre en détail : comment ils fonctionnent, et quelles sont leurs différences.</p><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="maximum-likelihood-estimation-mle">Maximum likelihood estimation (MLE)</h2><p class="paragraph" style="text-align:left;">Le MLE part d&#39;un jeu de données labellisé et vise à déterminer les paramètres du modèle statistique qu&#39;on essaie d&#39;ajuster.</p><div class="image"><img alt="Schéma montrant comment le MLE part de données labellisées pour trouver les paramètres θ du modèle" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cb8f5507-f318-4c65-a4d5-bb294e237f7a/_334-mle-donnees-labellisees-parametres.png.png?t=1789076887"/><div class="image__source"><span class="image__source_text"><p>Étant donné des données labellisées, trouve les paramètres du modèle.</p></span></div></div><p class="paragraph" style="text-align:left;">Le processus est plutôt simple et direct.</p><p class="paragraph" style="text-align:left;">Avec le MLE, on :</p><ul><li><p class="paragraph" style="text-align:left;">Commence par supposer un processus de génération des données. En clair, ce processus de génération des données reflète notre hypothèse sur la distribution du label de sortie (<code>y</code>), étant donné l&#39;entrée (<code>X</code>).</p></li></ul><div class="image"><img alt="Schéma illustrant le processus de génération des données supposé à partir de données labellisées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a97ca060-a6d6-4368-adeb-732557c7063b/_334-processus-generation-donnees-suppose.png.png?t=1789076934"/><div class="image__source"><span class="image__source_text"><p>Suppose un processus de génération des données</p></span></div></div><ul><li><p class="paragraph" style="text-align:left;">Ensuite, on définit la vraisemblance (likelihood) d&#39;observer les données. Comme chaque observation est indépendante, la vraisemblance d&#39;observer l&#39;ensemble des données correspond au produit des vraisemblances de chaque observation individuelle : </p></li></ul><div class="image"><img alt="Schéma définissant la fonction de vraisemblance L(θ) à partir des données labellisées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/55941eb9-f862-4b84-8a11-3ff3a9e6bd08/_334-fonction-vraisemblance-mle.png.png?t=1789076995"/><div class="image__source"><span class="image__source_text"><p>Définis la fonction de vraisemblance</p></span></div></div><ul><li><p class="paragraph" style="text-align:left;">La fonction de vraisemblance ci-dessus dépend des valeurs des paramètres (<code>θ</code>). Notre objectif est de déterminer les valeurs de paramètres spécifiques qui maximisent cette fonction de vraisemblance. On procède comme suit :</p></li></ul><div class="image"><img alt="Équation montrant comment résoudre δL(θ)/δθ = 0 pour trouver les paramètres θ" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5352fd1a-c9fc-4f20-89e8-19a63b67a1cd/_334-resoudre-parametres-theta.png?t=1789077041"/></div><p class="paragraph" style="text-align:left;">Cela nous donne les estimations de paramètres qui auraient le plus vraisemblablement généré les données observées.</p><p class="paragraph" style="text-align:left;">C&#39;était plutôt simple, non ?</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><b>Mais que fait-on si on n&#39;a pas de vrais labels ?</b></p><p class="paragraph" style="text-align:left;">On veut quand même estimer les paramètres, non ?</p><div class="image"><img alt="Personnage perplexe face à un jeu de données non labellisées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fe1ec971-2231-489e-ab00-7ee7fc92400e/_334-donnees-non-labellisees-question.png?t=1789077085"/><div class="image__source"><span class="image__source_text"><p>Données non labellisées</p></span></div></div><p class="paragraph" style="text-align:left;">Le MLE, comme tu l&#39;as peut-être deviné, ne s&#39;applique pas ici. Le vrai label (<code>y</code>), n&#39;étant pas observé, rend impossible la définition d&#39;une fonction de vraisemblance comme on l&#39;a fait précédemment.</p><p class="paragraph" style="text-align:left;">Dans ce genre de cas, des techniques plus avancées comme l&#39;<b>expectation maximization</b> sont bien utiles.</p><div class="image"><img alt="Un personnage introduit l&#39;Expectation Maximization comme solution face à des données non labellisées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/87299cba-f1ed-45b7-8e8d-dc25c87d16ef/_334-decouverte-expectation-maximization.png.png?t=1789077132"/></div><hr class="content_break"><h2 class="heading" style="text-align:left;" id="expectation-maximization-em">Expectation maximization (EM)</h2><p class="paragraph" style="text-align:left;">L&#39;EM est une technique d&#39;optimisation itérative pour estimer les paramètres de modèles statistiques. Elle est particulièrement utile quand on a un label non observé (ou caché).</p><p class="paragraph" style="text-align:left;">Voici un exemple de situation type : </p><div class="image"><img alt="Schéma montrant deux distributions fusionnées en un jeu de données observées sans information de label" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c97d3b35-1640-4120-a884-b54ddf60449f/_334-donnees-multiples-distributions-fusionnees.png.png?t=1789077211"/><div class="image__source"><span class="image__source_text"><p>Données issues de plusieurs distributions</p></span></div></div><p class="paragraph" style="text-align:left;">Comme illustré ci-dessus, on suppose que les données ont été générées à partir de plusieurs distributions (un mélange). Cependant, les données observées/complètes ne contiennent pas cette information.</p><p class="paragraph" style="text-align:left;">Autrement dit, le jeu de données observé ne précise pas si une ligne donnée a été générée par la distribution 1 ou la distribution 2.</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">L&#39;EM nous aide à estimer les paramètres de ce type de jeux de données.</p><p class="paragraph" style="text-align:left;"><b>L&#39;idée centrale derrière l&#39;EM est la suivante :</b></p><ul><li><p class="paragraph" style="text-align:left;">On fait une hypothèse sur les paramètres initiaux (<code>θ</code>).</p></li><li><p class="paragraph" style="text-align:left;"><b>Étape Expectation (</b><code>E</code><b>)</b> : on calcule les probabilités a posteriori du label non observé (appelons-le « <code>z</code> ») à l&#39;aide des paramètres ci-dessus.</p></li></ul><div class="image"><img alt="Formules des probabilités a posteriori P(z=1|X;θ) et P(z=0|X;θ) pour l&#39;étape Expectation" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/15716832-2d6f-45b4-a35a-f1781df0aa27/_334-probabilites-posteriori-z-theta.png?t=1789077292"/></div><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><ul><li><p class="paragraph" style="text-align:left;">Puisqu&#39;on dispose désormais d&#39;un proxy (pas précis, certes) pour le vrai label, on peut définir une fonction de « vraisemblance espérée ». On utilise donc les probabilités a posteriori ci-dessus pour ça :</p></li></ul><div class="image"><img alt="Schéma montrant que la fonction de vraisemblance espérée L(θ) dépend des probabilités a posteriori P(z=1|X;θ) et P(z=0|X;θ)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c68b89ef-eda1-4750-b935-ff441863a235/_334-fonction-vraisemblance-esperee.png?t=1789077331"/></div><ul><li><p class="paragraph" style="text-align:left;"><b>Étape Maximization (</b><code>M</code><b>)</b> : on a maintenant une fonction de vraisemblance avec laquelle travailler. La maximiser par rapport aux paramètres nous donne une nouvelle estimation des paramètres (<code>θ&#39;</code>).</p></li><li><p class="paragraph" style="text-align:left;">Ensuite, on utilise les paramètres mis à jour (<code>θ&#39;</code>) pour recalculer les probabilités a posteriori définies lors de <b>l&#39;étape d&#39;expectation</b>.</p></li></ul><div class="image"><img alt="Formules des probabilités a posteriori recalculées P(z=1|X;θ&#39;) et P(z=0|X;θ&#39;) après l&#39;étape Maximization" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5c1b22d2-9252-44f6-ba2b-6a857f91cdeb/_334-probabilites-posteriori-theta-prime.png?t=1789077354"/></div><ul><li><p class="paragraph" style="text-align:left;">On met à jour la fonction de vraisemblance (<code>L</code>) à l&#39;aide des nouvelles probabilités a posteriori.</p></li><li><p class="paragraph" style="text-align:left;">Là encore, la maximiser nous donne une nouvelle estimation des paramètres (<code>θ</code>).</p></li><li><p class="paragraph" style="text-align:left;">Et ce processus se répète encore et encore jusqu&#39;à convergence.</p></li></ul><p class="paragraph" style="text-align:left;">L&#39;idée, c&#39;est qu&#39;avec <b>l&#39;expectation maximization</b>, on itère continuellement entre les étapes <code>E</code> et <code>M</code> jusqu&#39;à ce que les paramètres convergent.</p><p class="paragraph" style="text-align:left;">Un bon point pour l&#39;EM, c&#39;est qu&#39;il converge toujours. Pourtant, il peut parfois converger vers un extremum local.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">J&#39;ai préparé le visuel suivant, qui résume bien les différences entre MLE et EM :</p><div class="image"><img alt="Tableau comparatif complet entre MLE et EM : type de données, objectif, labels, convergence, résultat final et exemples de modèles" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cdc120df-f6ad-4a46-966c-fb505d68a336/_334-comparatif-mle-vs-em-tableau.png.png?t=1789077448"/></div><p class="paragraph" style="text-align:left;"><b>MLE vs EM est une question fréquemment posée dans de nombreux entretiens de data science.</b></p><p class="paragraph" style="text-align:left;">Si le MLE est relativement facile à comprendre, l&#39;EM est un peu plus complexe.</p><p class="paragraph" style="text-align:left;">Si ça t&#39;intéresse d&#39;apprendre l&#39;expectation maximization de façon pratique, et de le coder from scratch en Python (en utilisant seulement NumPy)...</p><p class="paragraph" style="text-align:left;">…alors on a couvert ça en détail dans ce deep dive : </p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/modeles-melange-gaussien-gmm?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=mle-vs-em-quelle-est-la-difference" target="_blank"><div class="embed__content"><p class="embed__title"> Comprendre les Modèles de Mélange Gaussien (GMMs) </p><p class="embed__description"> Découvre les Modèles de Mélange Gaussien (GMMs), une alternative puissante à KMeans pour un clustering avancé et robuste des données en machine learning. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/9df709d1-57f1-48b9-ac4d-0aa7f4e348b4/Mini-cours__5_-_Re%CC%81sultats_de_KMeans_vs_GMM.png?t=1772986383"/></a></div><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> dans le résumé visuel ci-dessus, peux-tu ajouter d&#39;autres modèles pour le MLE et pour l&#39;EM ?</p><p class="paragraph" style="text-align:left;"><b>👉 </b>Envie d&#39;aller plus loin ? DataXp t&#39;attend → <a class="link" href="https://dataxp.fr?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=mle-vs-em-quelle-est-la-difference" target="_blank" rel="noopener noreferrer nofollow">dataxp.fr</a></p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=4838cf9a-b6b2-4667-abbd-1733b92cf02e&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>40 méthodes NumPy, 95 % de tes besoins</title>
  <description>🎯 Shot #333 - Un cheat sheet complet pour ne plus fouiller la doc.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/00ca4b06-815c-4963-a06b-59c5e8dff2ba/_333-cheat-sheet-numpy-40-methodes-cover.png.png" length="1202857" type="image/png"/>
  <link>https://www.monshotdata.com/p/cheat-sheet-numpy-40-methodes</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/cheat-sheet-numpy-40-methodes</guid>
  <pubDate>Mon, 07 Sep 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-09-07T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Numpy]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#1a1f2e;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;">🚀<span style="color:#4f8ef7;"><b> DataXp est en ligne</b></span><br><span style="color:#4f8ef7;">Une plateforme pour apprendre la data science en écrivant du vrai code, direct dans ton navigateur. L&#39;objectif : t&#39;emmener jusqu&#39;au Machine Learning et à l&#39;IA, pas à pas.</span><br><br><span style="color:#4f8ef7;"><b>👉 </b></span><span style="color:#4f8ef7;"><b><a class="link" href="https://dataxp.fr/?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=40-methodes-numpy-95-de-tes-besoins" target="_blank" rel="noopener noreferrer nofollow">À découvrir</a></b></span></p></div><p class="paragraph" style="text-align:left;">D&#39;ailleurs, en parlant de bases solides...</p><p class="paragraph" style="text-align:left;">La documentation de NumPy est plutôt intimidante, à mon avis.</p><p class="paragraph" style="text-align:left;">Si tu veux apprendre à t&#39;en servir, tu as de fortes chances d&#39;être découragé par ses pages de référence API :</p><div class="image"><img alt="Illustration d&#39;un personnage accablé face à la liste des rubriques de la documentation officielle NumPy, jugée intimidante pour un débutant" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/04c9ae4e-386f-4aed-b38b-7e41e519dfc6/_333-cheat-sheet-numpy-40-methodes-doc-intimidante.png?t=1788731044"/></div><p class="paragraph" style="text-align:left;">Si tu es dans ce cas, j&#39;ai justement préparé ce cheat sheet NumPy qui regroupe les 40 méthodes les plus utilisées de la librairie : </p><div class="image"><img alt="Cheat sheet visuel des 40 méthodes NumPy les plus utilisées par les data scientists, réparties en six catégories : création de tableaux, manipulation, recherche, opérations mathématiques, opérations matricielles et vectorielles, et tri" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/00ca4b06-815c-4963-a06b-59c5e8dff2ba/_333-cheat-sheet-numpy-40-methodes-cover.png.png?t=1788731876"/></div><p class="paragraph" style="text-align:left;">Après plus de 4,5 ans à utiliser NumPy, je peux te dire sans hésiter que tu utiliseras ces méthodes 95 % du temps quand tu travailles avec NumPy.</p><p class="paragraph" style="text-align:left;">Il y a un truc important à comprendre : quand tu apprends une nouvelle librairie, tu n&#39;as pas besoin de maîtriser (ni même de pratiquer) chacune de ses méthodes.</p><p class="paragraph" style="text-align:left;">Mets plutôt le principe de Pareto à contribution :)</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> est-ce que j&#39;ai oublié une méthode courante ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=7767903f-c893-4847-b4a4-442689af49a9&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Tu construis peut-être des modèles de classification incohérents</title>
  <description>🎯 Shot #332 - Les limites de la cross-entropy loss face aux datasets ordinaux.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9fd73c7b-9fb4-452c-a95a-efe56c9e2b96/_332-cross-entropy-loss-classification-ordinale-cover.png" length="32841" type="image/png"/>
  <link>https://www.monshotdata.com/p/cross-entropy-loss-classification-ordinale</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/cross-entropy-loss-classification-ordinale</guid>
  <pubDate>Fri, 04 Sep 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-09-04T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Machine Learning]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">La plupart des réseaux de neurones pour la classification multiclasse sont entraînés avec la cross-entropy loss :</p><div class="image"><img alt="Formule mathématique de la cross-entropy loss utilisée pour entraîner les modèles de classification multiclasse" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0d294135-8e1e-4347-8fd7-cf959296261b/_332-formule-cross-entropy-loss.png.png?t=1788474893"/></div><p class="paragraph" style="text-align:left;">Sauf qu&#39;elle n&#39;est pas toujours adaptée à certaines situations.</p><p class="paragraph" style="text-align:left;">Plus précisément, une des plus grosses erreurs qu&#39;on commet, c&#39;est de ne pas vraiment comprendre la nature intrinsèque de son dataset.</p><p class="paragraph" style="text-align:left;">Pour illustrer ça, dans beaucoup de tâches de classification réelles, les labels de classe possèdent souvent un ordre relatif entre eux (on parle alors de datasets ordinaux) :</p><div class="image"><img alt="Schéma illustrant qu&#39;un ensemble de labels uniques dans un dataset ordinal peut être classé par ordre de rang croissant" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b738ff61-097b-428c-8d11-7efb4830af45/_332-labels-uniques-ordonnes-par-rang.png.png?t=1788474962"/></div><p class="paragraph" style="text-align:left;">La détection de tranche d&#39;âge (enfant, adolescent, jeune adulte, âge mûr et senior) en est un bon exemple : les labels y ont une relation ordonnée.</p><p class="paragraph" style="text-align:left;">Sauf que la cross-entropy ignore complètement cette notion.</p><p class="paragraph" style="text-align:left;">Résultat : le modèle a du mal à différencier les labels adjacents, ce qui mène à des performances sous-optimales et à des incohérences de classement.</p><p class="paragraph" style="text-align:left;">Par « incohérences de classement », on entend les situations où les probabilités prédites pour des labels adjacents ne respectent pas leur ordre naturel.</p><p class="paragraph" style="text-align:left;">Par exemple, si le modèle prédit une probabilité plus faible pour le label <code>child</code> que pour le label <code>teenager</code>, alors que <code>teenager</code> suit logiquement <code>child</code> dans la hiérarchie des âges, ça constitue une incohérence de classement.</p><div class="image"><img alt="Graphique à barres montrant qu&#39;un modèle de classification nominale produit une sortie au classement incohérent entre les tranches d&#39;âge" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2664b683-126f-428e-a073-e715ae2ab420/_332-classification-nominale-classement-incoherent.png.png?t=1788475011"/></div><p class="paragraph" style="text-align:left;">On peut aussi voir les choses autrement : disons que le vrai label pour un exemple donné est <code>young adult</code>. Dans ce cas, on voudrait que notre classifieur indique que l&#39;exemple est « au moins un enfant », « au moins un adolescent » et « au moins un jeune adulte ».</p><div class="image"><img alt="Graphique à barres montrant qu&#39;un modèle de classification ordinale produit une sortie au classement cohérent, avec un seuil de décision à p=0,5" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6e46ac36-cc72-43b7-95e7-fd4ea3117566/_332-classification-ordinale-classement-coherent.png.png?t=1788475056"/></div><p class="paragraph" style="text-align:left;">Sauf que, comme la cross-entropy loss traite chaque tranche d&#39;âge comme une catégorie séparée sans ordre intrinsèque, le modèle a du mal à apprendre et à généraliser la progression correcte de l&#39;âge.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Les datasets ordinaux sont assez fréquents dans l&#39;industrie, et les modèles de classification classiques produisent presque toujours des résultats sous-optimaux dans ce genre de cas.</p><p class="paragraph" style="text-align:left;"><b>Avec une attention particulière et les bonnes techniques</b>, on peut non seulement rendre les modèles de ML plus interprétables, mais aussi produire des modèles plus précis.</p><p class="paragraph" style="text-align:left;">Quelles sont ces techniques ?</p><p class="paragraph" style="text-align:left;">Si ça t&#39;intrigue, c&#39;est justement le sujet de notre dernier deep dive ML : <a class="link" href="https://www.monshotdata.com/p/coral-classification-ordinale-pytorch?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=tu-construis-peut-etre-des-modeles-de-classification-incoherents" target="_blank" rel="noopener noreferrer nofollow">Tu es probablement en train de construire des modèles de classification incohérents sans même t&#39;en rendre compte</a>.</p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/coral-classification-ordinale-pytorch?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=tu-construis-peut-etre-des-modeles-de-classification-incoherents" target="_blank"><div class="embed__content"><p class="embed__title"> CORAL : comment forcer tes réseaux de neurones à respecter l&#39;ordre naturel des classes </p><p class="embed__description"> Découvre CORAL, la méthode qui force tes réseaux de neurones à respecter l&#39;ordre des classes. Théorie, loss function et implémentation PyTorch complète. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/1a5c8074-e146-489b-9ec7-b9c0cb681196/Mini-cours__31_-_CORAL.png.png?t=1782289800"/></a></div><hr class="content_break"><p class="paragraph" style="text-align:left;">La cross-entropy est sans aucun doute l&#39;une des fonctions de loss les plus utilisées pour entraîner des modèles de classification multiclasse, mais elle n&#39;est pas toujours adaptée à certaines situations.</p><p class="paragraph" style="text-align:left;">Pourtant, beaucoup de gens continuent d&#39;utiliser la cross-entropy, peu importe le type de dataset auquel ils font face.</p><p class="paragraph" style="text-align:left;">Découvrir le framework avancé dont on parle dans l&#39;article ci-dessus t&#39;aidera à prendre des décisions éclairées dans la construction de tes modèles. On y implémente aussi l&#39;idée pour une compréhension complète.</p><p class="paragraph" style="text-align:left;">Lis l&#39;article ici : <a class="link" href="https://www.monshotdata.com/p/coral-classification-ordinale-pytorch?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=tu-construis-peut-etre-des-modeles-de-classification-incoherents" target="_blank" rel="noopener noreferrer nofollow">Tu es probablement en train de construire des modèles de classification incohérents sans même t&#39;en rendre compte</a>.</p><p class="paragraph" style="text-align:left;">Je suis sûr que tu vas apprendre quelque chose d&#39;utile aujourd&#39;hui.</p><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quels sont, selon toi, d&#39;autres défis liés aux modèles de classification nominale ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=c9b2c240-25d9-49e0-a9e5-b43df2675750&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Ton modèle a-t-il vraiment un problème sur cette classe ?</title>
  <description>🎯 Shot #331 - Ce que l&#39;accuracy seule ne te dit pas sur tes priorités.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8f8e4932-8948-402c-9500-529261148a09/_331-modele-classification_multiclasse.png" length="35463" type="image/png"/>
  <link>https://www.monshotdata.com/p/accuracy-baseline-humaine-priorites-modele</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/accuracy-baseline-humaine-priorites-modele</guid>
  <pubDate>Mon, 31 Aug 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-08-31T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Machine Learning]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">C&#39;est exactement la question qu&#39;un doctorant m&#39;a forcé à me poser, le jour où il m&#39;a tendu un échantillon de son dataset à annoter.</p><p class="paragraph" style="text-align:left;">Ça a piqué ma curiosité : pourquoi avait-il besoin de labels humains alors qu&#39;il disposait déjà de labels de ground truth ?</p><p class="paragraph" style="text-align:left;">Alors j&#39;ai posé la question.</p><p class="paragraph" style="text-align:left;">Ce que j&#39;ai appris ce jour-là a changé mon approche de l&#39;amélioration incrémentale des modèles, et je suis sûr que cette idée va aussi te fasciner.</p><p class="paragraph" style="text-align:left;">Laisse-moi t&#39;expliquer ce que j&#39;ai appris.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Imagine qu&#39;on construise un modèle de classification multiclasse. Disons que c&#39;est un modèle qui classe une image en entrée comme pierre, feuille ou ciseaux :</p><div class="image"><img alt="Schéma d&#39;un modèle de classification multiclasse pierre-feuille-ciseaux montrant une image en entrée, le modèle, et les probabilités prédites pour chaque classe" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/47cd8407-34c3-4646-bc16-a17788fde97f/_331-modele-classification-multiclasse.png.png?t=1788129598"/></div><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">En calculant l&#39;accuracy de validation par classe, on obtient les résultats suivants :</p><div class="image"><img alt="Tableau montrant l&#39;accuracy de validation par classe pour un modèle pierre-feuille-ciseaux, avec feuille à 97%, pierre à 82% et ciseaux à 75%" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8ad98af1-c99b-4262-bdca-90a8a4c496bc/_331-accuracy-par-classe-pierre-feuille-ciseaux.png.png?t=1788129645"/></div><ul><li><p class="paragraph" style="text-align:left;">Classe Feuille : 97%</p></li><li><p class="paragraph" style="text-align:left;">Classe Pierre : 82%</p></li><li><p class="paragraph" style="text-align:left;">Classe Ciseaux : 75%</p></li></ul><p class="paragraph" style="text-align:left;"><b>Question : quelle classe irais-tu inspecter et améliorer en priorité, intuitivement ?</b></p><p class="paragraph" style="text-align:left;">En regardant ces résultats, la plupart des gens pensent que “Ciseaux” est la classe la moins performante et qu&#39;elle mérite d&#39;être approfondie.</p><div class="image"><img alt="Illustration d&#39;un personnage pensant que la classe Ciseaux, avec 75% d&#39;accuracy, est la moins performante et doit être inspectée en priorité" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5f1da631-d5bf-4fa2-b94d-511078edb01e/_331-hypothese-classe-ciseaux-a-inspecter.png?t=1788130518"/></div><p class="paragraph" style="text-align:left;"><b>Mais ce n&#39;est peut-être pas vrai.</b></p><p class="paragraph" style="text-align:left;">Et c&#39;est précisément ce que ce doctorant voulait vérifier en collectant des labels humains.</p><p class="paragraph" style="text-align:left;">Disons que les labels humains nous donnent les résultats suivants :</p><div class="image"><img alt="Tableau comparant l&#39;accuracy humaine et l&#39;accuracy du modèle pour les classes feuille, pierre et ciseaux, avec un écart de 1%, 13% et 2% respectivement" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c2a34586-5d6b-4dee-ba68-eaa4ed27d40f/_331-accuracy-humaine-vs-modele-par-classe.png.png?t=1788129727"/></div><p class="paragraph" style="text-align:left;">Au vu de ça, penses-tu toujours que le modèle performe le moins bien sur la classe “Ciseaux” ?</p><p class="paragraph" style="text-align:left;">Non, pas vrai ?</p><p class="paragraph" style="text-align:left;">Enfin, bien sûr, le modèle a l&#39;accuracy la plus faible sur la classe “Ciseaux”, je ne le nie pas.</p><p class="paragraph" style="text-align:left;">Mais avec plus de contexte, on remarque que le modèle s&#39;en sort plutôt bien sur la classe “Ciseaux”. En effet, un humain moyen n&#39;obtient que 2% d&#39;accuracy de plus que ce que notre modèle atteint.</p><p class="paragraph" style="text-align:left;">En revanche, ces résultats révèlent, de façon assez surprenante, que c&#39;est en réalité la classe “Pierre” qui mérite le plus d&#39;attention. L&#39;écart d&#39;accuracy entre un humain moyen et le modèle est bien trop élevé (13%).</p><p class="paragraph" style="text-align:left;">Sans cette information, on aurait continué à améliorer la classe “Ciseaux”, alors qu&#39;en réalité, c&#39;est “Pierre” qui a le plus besoin d&#39;être travaillée.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Depuis que j&#39;ai appris cette technique, je la trouve super utile pour déterminer mes prochaines étapes d&#39;amélioration de modèle, quand c&#39;est possible.</p><p class="paragraph" style="text-align:left;">Je dis « quand c&#39;est possible » parce que je sais que beaucoup de datasets sont difficiles à interpréter et à labelliser pour des humains.</p><p class="paragraph" style="text-align:left;">Malgré tout, si c&#39;est faisable de mettre en place une telle « baseline humaine », on y gagne énormément de clarté sur la façon dont le modèle performe.</p><div class="image"><img alt="Illustration d&#39;un personnage concluant qu&#39;il doit inspecter la classe Pierre, dont l&#39;écart entre accuracy humaine et accuracy du modèle atteint 13%, contre 1% pour Feuille et 2% pour Ciseaux" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5420f755-f844-4879-a357-7fa674c69af3/_331-conclusion-classe-pierre-a-inspecter.png.png?t=1788130585"/></div><p class="paragraph" style="text-align:left;">Résultat : on peut rediriger efficacement ses efforts d&#39;ingénierie dans la bonne direction.</p><p class="paragraph" style="text-align:left;">Bien sûr, je ne prétends pas que ça soit universellement utile dans tous les cas d&#39;usage.</p><p class="paragraph" style="text-align:left;">Par exemple, si le modèle performe déjà mieux que la baseline, les améliorations suivantes devront s&#39;appuyer sur les résultats passés.</p><p class="paragraph" style="text-align:left;">Cela dit, dans ce genre de cas, dépasser une baseline humaine permet au moins de valider que le modèle fait mieux que ce qu&#39;un humain peut faire.</p><p class="paragraph" style="text-align:left;">Une super technique, non ?</p><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quelles autres méthodes utilises-tu pour orienter tes efforts d&#39;amélioration de modèle ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=7b33c98c-15d3-4499-815d-ea7ca61a5b94&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Comment la régularisation L2 élimine la multicolinéarité parfaite</title>
  <description>🎯 Shot #330 - La preuve mathématique derrière un problème que peu de gens connaissent.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c54e4af3-18b4-4756-9c54-0924932cf983/_330-rss-sans-avec-regularisation-l2-vallee-minimum.png" length="198632" type="image/png"/>
  <link>https://www.monshotdata.com/p/regularisation-l2-multicolinearite-parfaite-partie-2</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/regularisation-l2-multicolinearite-parfaite-partie-2</guid>
  <pubDate>Fri, 28 Aug 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-08-28T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Machine Learning]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Il y a quelques jours, on a vu comment la régularisation L2 nous aide à traiter la multicolinéarité : </p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/l2-regularization-avantage-cache-multicollinearite?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=comment-la-regularisation-l2-elimine-la-multicolinearite-parfaite" target="_blank"><div class="embed__content"><p class="embed__title"> La face cachée de la régularisation L2 </p><p class="embed__description"> La régularisation L2 fait bien plus que réduire l&#39;overfitting. Découvre comment elle élimine la multicolinéarité et donne son nom à la ridge regression. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/50d5c888-460a-4221-8e90-b762b6e787da/_325-regularisation-L2.png?t=1785710970"/></a></div><p class="paragraph" style="text-align:left;">La multicolinéarité apparaît quand deux (ou plusieurs) features sont fortement corrélées OU quand deux (ou plusieurs) features permettent de prédire une autre feature : </p><div class="image"><img alt="Illustration expliquant la multicolinéarité : featureA et featureB fortement corrélées, et featureC combinaison linéaire de featureA et featureB" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/dc9e0ac9-ca77-454f-af5c-06116640538e/_325-multicollinearite-featurea-featureb-featurec.png.png?t=1787578164"/></div><p class="paragraph" style="text-align:left;">L&#39;idée centrale de ce post était la suivante : imagine qu&#39;on utilise une régression linéaire, et que le dataset présente de la multicolinéarité.</p><p class="paragraph" style="text-align:left;">Dans ce cas…</p><ul><li><p class="paragraph" style="text-align:left;">Sans régularisation L2, il est impossible d&#39;obtenir une valeur unique pour les paramètres (<code>θ</code>) qui minimise la RSS.</p></li><li><p class="paragraph" style="text-align:left;">La régularisation L2 permet de résoudre ce problème et d&#39;obtenir une solution optimale.</p></li></ul><p class="paragraph" style="text-align:left;">C&#39;est ce qu&#39;illustre le schéma ci-dessous : </p><div class="image"><img alt="Comparaison des graphiques RSS 3D sans et avec régularisation L2, montrant la disparition de la vallée et l&#39;apparition d&#39;un minimum global" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c54e4af3-18b4-4756-9c54-0924932cf983/_330-rss-sans-avec-regularisation-l2-vallee-minimum.png?t=1787582222"/></div><p class="paragraph" style="text-align:left;">Voici le shot data en question si tu ne l&#39;as pas encore lu (ou si tu veux te rafraîchir la mémoire) : <a class="link" href="https://www.monshotdata.com/p/l2-regularization-avantage-cache-multicollinearite?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=comment-la-regularisation-l2-elimine-la-multicolinearite-parfaite" target="_blank" rel="noopener noreferrer nofollow">La régularisation L2 est bien plus magique qu&#39;on ne le pense</a>.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Je mentionne ce shot data ici parce qu&#39;en plus de réduire l&#39;overfitting et de traiter la multicolinéarité, il y a un autre problème, moins souvent évoqué, que la régularisation L2 résout très bien, et qui est lié à la multicolinéarité.</p><p class="paragraph" style="text-align:left;">Aujourd&#39;hui, je veux justement en parler.</p><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Regarde la solution OLS qu&#39;on obtient avec la régression linéaire : </p><div class="image"><img alt="Formule de la solution OLS : θ = (XᵀX)⁻¹Xᵀy" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/da511f61-5e5f-4a95-87a9-73b30475888f/_330-ols-formule-moindres-carres-ordinaires.png.png?t=1787582322"/><div class="image__source"><span class="image__source_text"><p><a class="link" href="https://www.monshotdata.com/p/pourquoi-linearregression-sklearn-aucun-hyperparametre?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=comment-la-regularisation-l2-elimine-la-multicolinearite-parfaite" target="_blank" rel="noopener noreferrer nofollow">Lis ce shot data pour comprendre la démonstration</a></p></span></div></div><ul><li><p class="paragraph" style="text-align:left;"><code>X</code> est la matrice des variables indépendantes (dimension : <code>n*m</code>).</p></li><li><p class="paragraph" style="text-align:left;"><code>y</code> est le vecteur des targets (dimension : <code>n*1</code>).</p></li><li><p class="paragraph" style="text-align:left;"><code>θ</code> est le vecteur de poids (dimension : <code>m*1</code>).</p></li></ul><p class="paragraph" style="text-align:left;">Si on regarde de plus près, on voit que la solution OLS n&#39;existe que si la matrice (<code>XᵀX</code>) est inversible.</p><div class="image"><img alt="La matrice XᵀX dans la solution OLS doit être inversible pour que la solution existe" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ad8b58d0-7618-4cfc-bbe2-658799668896/_330-xtx-doit-etre-inversible.png.png?t=1787582375"/></div><p class="paragraph" style="text-align:left;"><b>Mais un problème survient quand le nombre de features (</b><code>m</code><b>) dépasse le nombre de points de données (</b><code>n</code><b>), c&#39;est à dire quand </b><code>m&gt;n</code><b>. Dans ce cas, cette matrice ne sera pas inversible.</b></p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><hr class="content_break"><p class="paragraph" style="text-align:left;">Pour simplifier, imagine qu&#39;on a la matrice d&#39;entrée <code>X</code> suivante, qui a plus de features que de lignes : </p><div class="image"><img alt="Exemple de matrice de données avec 2 lignes et 4 colonnes, illustrant plus de features que d&#39;observations" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f3d583ae-4c8e-44be-aeeb-1c729099ea25/_330-matrice-2-lignes-4-colonnes-exemple.png.png?t=1787582422"/></div><p class="paragraph" style="text-align:left;">Ici, il est TOUJOURS possible de représenter, disons, la troisième colonne comme une combinaison linéaire des deux premières colonnes. C&#39;est ce qu&#39;on voit ci-dessous : </p><div class="image"><img alt="Système d&#39;équations linéaires montrant la troisième colonne comme combinaison linéaire des deux premières colonnes" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7ec9554e-a40a-4513-9786-5f4fdd850cb8/_330-systeme-equations-lineaires-colonnes.png.png?t=1787582459"/></div><p class="paragraph" style="text-align:left;"><b>Le système d&#39;équations linéaires ci-dessus admet une solution pour ‘a’ et ‘b’.</b></p><p class="paragraph" style="text-align:left;">Ça montre que tous les datasets dont le nombre de features dépasse le nombre de lignes présentent une multicolinéarité parfaite.</p><p class="paragraph" style="text-align:left;">C&#39;est parce que n&#39;importe quelle colonne sera TOUJOURS une combinaison linéaire de deux autres colonnes.</p><p class="paragraph" style="text-align:left;">En termes plus mathématiques, quand (<code>m&gt;n</code>), on obtient toujours un système d&#39;équations linéaires où le nombre d&#39;inconnues (<code>a</code> et <code>b</code> ci-dessus) est égal au nombre d&#39;équations qu&#39;on peut générer.</p><p class="paragraph" style="text-align:left;">En revanche, si notre dataset avait contenu plus de lignes que de colonnes (<code>n&gt;m</code>), il n&#39;aurait pas été possible de résoudre ce système d&#39;équations linéaires (sauf si le dataset possédait lui-même de la multicolinéarité) : </p><div class="image"><img alt="Matrice de données avec 4 lignes et 3 colonnes montrant un système d&#39;équations linéaires sans solution" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8013cd7c-26a1-4704-b027-07ae10829504/_330-matrice-4-lignes-3-colonnes-aucune-solution.png.png?t=1787582525"/></div><p class="paragraph" style="text-align:left;">Maintenant, étant donné que tout dataset dont le nombre de colonnes dépasse le nombre de lignes présente une <b>multicolinéarité parfaite</b>, on peut revenir à ce qu&#39;on a vu dans le shot data précédent.</p><p class="paragraph" style="text-align:left;">Sans la pénalité L2, le graphique des résidus forme une vallée. Résultat : il est impossible d&#39;obtenir une valeur unique pour les paramètres (<code>θ</code>) qui minimise la RSS. C&#39;est ce qu&#39;on voit ci-dessous : </p><div class="image"><img alt="Graphique 3D de la RSS sans régularisation L2 montrant une vallée le long de la diagonale" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f6d28534-f1bc-4a83-b1c2-ed1e9d4e2a50/_325-graphique-rss-vallee-sans-l2.png.png?t=1785711382"/></div><p class="paragraph" style="text-align:left;">Avec la pénalité L2, en revanche, on obtient le graphique suivant, qui fait disparaître la vallée observée plus tôt et donne un minimum global à l&#39;erreur RSS : </p><div class="image"><img alt="Graphique 3D de la RSS avec régularisation L2 montrant la disparition de la vallée" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3aa31ec6-d5fb-404e-9ff6-afb384d7aec9/_325-graphique-rss-sans-vallee-avec-l2.png.png?t=1785711482"/></div><p class="paragraph" style="text-align:left;">Désormais, il est possible d&#39;obtenir une valeur unique pour les paramètres (<code>θ</code>) qui minimise la RSS.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">En fait, il existe une autre façon de démontrer que si X (peu importe ses dimensions) présente une multicolinéarité parfaite, la régularisation L2 nous aide à l&#39;éliminer.</p><p class="paragraph" style="text-align:left;">Reprenons la matrice <code>2*4</code> ci-dessus, et appliquons la combinaison linéaire aux troisième et quatrième colonnes : </p><div class="image"><img alt="Étapes de transformation des colonnes 3 et 4 par combinaison linéaire des colonnes 1 et 2" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8cc24015-3806-4c65-aa15-40edf40aface/_330-elimination-colonnes-etape-1-etape-2.png.png?t=1787582571"/></div><p class="paragraph" style="text-align:left;">En calculant <code>XᵀX</code> sur le résultat final, on obtient une matrice non inversible : </p><div class="image"><img alt="Calcul de XᵀX résultant en une matrice non inversible en cas de multicolinéarité parfaite" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7a3c1cd5-e081-4dc0-9f5a-fe1456644fc4/_330-xtx-matrice-non-inversible.png.png?t=1787582617"/></div><p class="paragraph" style="text-align:left;"><b>Ça montre que si le dataset </b><code>X</code><b> (peu importe sa forme) présente une multicolinéarité parfaite, </b><code>XᵀX</code><b> ne sera pas inversible (garde ça en tête, on va y revenir bientôt).</b></p><p class="paragraph" style="text-align:left;">Passons à la suite : regardons la fonction de perte avec la pénalité L2 : </p><div class="image"><img alt="Formule de la fonction de perte de la régression avec pénalité L2" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cfe4b8fc-8759-4e79-9499-a6cb2d1e7340/_330-fonction-perte-penalite-l2.png.png?t=1787582663"/></div><p class="paragraph" style="text-align:left;">L&#39;objectif est de trouver les paramètres <code>θ</code> qui minimisent cette fonction.</p><p class="paragraph" style="text-align:left;">On dérive donc l&#39;expression ci-dessus par rapport à <code>θ</code>, et on l&#39;égale à zéro : </p><div class="image"><img alt="Dérivation de la fonction de perte avec pénalité L2 par rapport à θ, égalée à zéro" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/34f03380-8feb-4506-9188-e20db524533b/_330-derivation-fonction-perte-l2.png.png?t=1787582706"/></div><p class="paragraph" style="text-align:left;">Ensuite, on résout pour <code>θ</code>, ce qui donne : </p><div class="image"><img alt="Résolution de l&#39;équation aboutissant à θ = (XᵀX + λI)⁻¹XᵀY" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0175fd4d-c530-4830-9316-2535cb1a804d/_330-solution-theta-regularisation-l2.png.png?t=1787582747"/></div><p class="paragraph" style="text-align:left;">Remarque quelque chose ici.</p><p class="paragraph" style="text-align:left;">La solution OLS n&#39;inverse plus <code>XᵀX</code> directement. À la place, une matrice diagonale supplémentaire s&#39;ajoute à <code>XᵀX</code>, ce qui rend le résultat inversible (<code>λ≠0</code>) : </p><div class="image"><img alt="Ajout de λI à la matrice XᵀX non inversible, qui devient alors inversible" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/403a17e1-95dc-481f-a80e-a98aa43a109d/_330-ajout-lambda-i-matrice-inversible.png.png?t=1787582791"/></div><p class="paragraph" style="text-align:left;">Voilà une autre preuve de comment la régularisation nous aide à éliminer la multicolinéarité.</p><p class="paragraph" style="text-align:left;">Retiens donc que la régularisation L2 n&#39;est pas juste un remède pour réduire l&#39;overfitting. Elle est aussi utile pour éliminer la multicolinéarité.</p><p class="paragraph" style="text-align:left;">J&#39;espère que tu as appris quelque chose de nouveau aujourd&#39;hui :)</p><p class="paragraph" style="text-align:left;">Si tu veux en savoir plus sur l&#39;origine probabiliste de la régularisation L2, va voir ce dossier : </p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/regularisation-probabilites?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=comment-la-regularisation-l2-elimine-la-multicolinearite-parfaite" target="_blank"><div class="embed__content"><p class="embed__title"> Découvrir la Régularisation par les Probabilités </p><p class="embed__description"> Découvre comment éviter le surapprentissage en machine learning grâce à la régularisation par probabilités et techniques MLE pour des modèles performants et généralisables. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/6e2c3741-5f38-4ecf-9407-4ffe5e5eb0b8/Mini-cours__6_-_De%CC%81couvrir_la_Re%CC%81gularisation_par_les_Probabilite%CC%81s.png?t=1772986383"/></a></div><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quels sont, selon toi, d&#39;autres avantages de la régularisation L2 ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=12831cd8-b34c-4ada-b3ee-1b3ea7ca335d&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Kolmogorov Arnold Networks (KAN) : le guide complet pour les data scientists</title>
  <description>👀​ Mini-cours #38 - Théorèmes fondateurs, courbes de Bezier, B-splines et comparaison face aux MLP : tout ce qu&#39;il faut maîtriser pour comprendre la nouvelle architecture qui bouscule le deep learning.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5b498a6a-33a6-454c-a847-abc530995c48/kan-00-cover-neural-network-vs-kan.png" length="64809" type="image/png"/>
  <link>https://www.monshotdata.com/p/kolmogorov-arnold-networks-kan-guide-complet</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/kolmogorov-arnold-networks-kan-guide-complet</guid>
  <pubDate>Wed, 26 Aug 2026 14:00:00 +0000</pubDate>
  <atom:published>2026-08-26T14:00:00Z</atom:published>
    <category><![CDATA[Deep Learning]]></category>
    <category><![CDATA[Architectures Et Entraînement En Deep Learning]]></category>
    <category><![CDATA[Pro]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#f2eafe;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:2.0px 2.0px 2.0px 2.0px;"><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Psst... Contenu Exclusif Réservé aux Membres !</b></span><br><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Ce mini-cours fait partie de notre espace premium. Rejoins dès maintenant le </span><b>Cercle des Experts</b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;"> pour débloquer l’intégralité de nos ressources, analyses approfondies et guides pratiques.</span><br><b>👉 </b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Clique ici pour découvrir les avantages et t’inscrire : </span><b><a class="link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=kolmogorov-arnold-networks-kan-le-guide-complet-pour-les-data-scientists" target="_blank" rel="noopener noreferrer nofollow" style="color: #2563eb">Page d’adhésion</a></b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">.</span></p></div><div class="section" style="background-color:transparent;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Poppins, Helvetica, sans-serif, serif, EmojiFont;font-size:16px;">⏱️ </span><i><b>Temps de lecture</b></i><i> : environ 20 minutes</i></p></div><h2 class="heading" style="text-align:left;" id="introduction">Introduction</h2><p class="paragraph" style="text-align:left;">Tu as sans doute déjà croisé le nom des Kolmogorov Arnold Networks (KAN) dans tes lectures ou tes veilles techniques. Pas de souci si tu ne sais pas exactement ce que c&#39;est ni comment ça fonctionne, c&#39;est précisément l&#39;objet de ce deep dive.</p><p class="paragraph" style="text-align:left;">Les KAN suscitent beaucoup d&#39;attention parce qu&#39;ils remettent en question la conception classique des réseaux de neurones et proposent un nouveau paradigme pour les concevoir et les entraîner.</p><div class="image"><img alt="Schéma d&#39;un réseau de neurones classique illustrant la séparation entre couche linéaire et non-linéarité apportée par la fonction d&#39;activation" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8591c22b-e274-4fae-8fb6-d733f3d82a3c/kan-01-design-traditionnel-reseau-neurones.png.png?t=1787730831"/></div><p class="paragraph" style="text-align:left;">En résumé, l&#39;idée est la suivante. Plutôt que d&#39;empiler simplement des couches les unes sur les autres (qui sont toujours des transformations linéaires, la non-linéarité étant introduite volontairement via des fonctions d&#39;activation), les KAN proposent une approche alternative.</p><p class="paragraph" style="text-align:left;">Les auteurs utilisent des fonctions apprenables complexes, appelées B-Splines, qui permettent de représenter directement des transformations non linéaires de l&#39;entrée, avec relativement moins de paramètres qu&#39;un réseau de neurones traditionnel.</p><div class="image"><img alt="Comparaison schématique entre un réseau de neurones classique, où les fonctions d&#39;activation fixes sont sur les nœuds, et un KAN, où les fonctions d&#39;activation apprenables sont sur les arêtes" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/974ff2c5-0336-4175-8776-94f3962b3f25/kan-02-comparaison-reseau-neurones-vs-kan.png.png?t=1787730888"/></div><p class="paragraph" style="text-align:left;">Si tu regardes attentivement l&#39;image ci-dessus :</p><ul><li><p class="paragraph" style="text-align:left;">Dans un réseau de neurones classique, les fonctions d&#39;activation sont fixes sur l&#39;ensemble du réseau, et elles existent sur chaque <b>nœud</b> (illustré ci-dessous).</p></li></ul><div class="image"><img alt="Schéma d&#39;un réseau de neurones classique montrant les fonctions d&#39;activation fixes positionnées sur les nœuds et les poids apprenables sur les arêtes" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a058ddca-b3e6-413a-8d6c-d8bca000bfd2/kan-03-activation-fixe-noeuds-reseau-neurones.png.png?t=1787731002"/></div><ul><li><p class="paragraph" style="text-align:left;">Dans un KAN, en revanche, les fonctions d&#39;activation existent sur les arêtes (qui correspondent aux poids d&#39;un réseau traditionnel), et chaque arête possède sa propre fonction d&#39;activation, différente des autres.</p></li></ul><div class="image"><img alt="Schéma d&#39;un réseau KAN montrant les fonctions d&#39;activation apprenables sur les arêtes et l&#39;opération de somme réalisée sur les nœuds" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9b0fc02f-ead9-401e-baf2-eaef876a3095/kan-04-activation-apprenable-aretes-kan.png.png?t=1787731061"/></div><p class="paragraph" style="text-align:left;">Il devient donc naturel de s&#39;attendre à ce qu&#39;un KAN soit beaucoup plus précis et interprétable, avec moins de paramètres.</p><p class="paragraph" style="text-align:left;">Dans la suite, on va plonger dans les détails techniques de leur fonctionnement.</p><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="thorme-dapproximation-universelle">Théorème d&#39;approximation universelle</h2><p class="paragraph" style="text-align:left;">Le théorème d&#39;approximation universelle (Universal Approximation Theorem, UAT) constitue le fondement théorique des réseaux de neurones que tu utilises au quotidien.</p><p class="paragraph" style="text-align:left;">En résumé, il stipule qu&#39;un réseau de neurones possédant une seule couche cachée contenant un nombre fini de neurones peut approximer <b>N&#39;IMPORTE QUELLE</b> fonction continue avec une précision raisonnable sur un sous-ensemble compact de <code>ℝⁿ</code>, à condition d&#39;utiliser des fonctions d&#39;activation adaptées.</p><p class="paragraph" style="text-align:left;">Les points clés :</p><ul><li><p class="paragraph" style="text-align:left;"><b>Structure du réseau</b> : une seule couche cachée.</p></li><li><p class="paragraph" style="text-align:left;"><b>Approximation de fonction</b> : n&#39;importe quelle fonction continue peut être approximée.</p></li><li><p class="paragraph" style="text-align:left;"><b>Fonction d&#39;activation</b> : elle doit être non linéaire et adaptée (par exemple sigmoïde, ReLU).</p></li></ul><p class="paragraph" style="text-align:left;">Mathématiquement, pour toute fonction continue <code>f</code> et tout <code>ε &gt; 0</code>, il existe toujours un réseau de neurones <code>f̂</code> tel que :</p><div class="image"><img alt="Formule mathématique du théorème d&#39;approximation universelle, la différence entre f(x) et son approximation f̂(x) est inférieure à epsilon" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/42a3811b-f8b7-4608-83ee-b0655c8d92a9/kan-05-formule-theoreme-approximation-universelle.png?t=1787731159"/></div><p class="paragraph" style="text-align:left;">Ce résultat n&#39;a d&#39;abord été démontré que pour l&#39;activation sigmoïde, lors de sa première formulation en 1989. En 1991, il a été étendu à une large classe de fonctions d&#39;activation non polynomiales.</p><p class="paragraph" style="text-align:left;">L&#39;intuition sous-jacente est qu&#39;une fonction constante par morceaux (piecewise) peut approximer n&#39;importe quelle fonction continue sur <b>un ensemble borné</b>.</p><p class="paragraph" style="text-align:left;">Par exemple, la courbe du cosinus entre <code>−π/2</code> et <code>π/2</code> peut être approximée par plusieurs paliers ajustés à cette courbe.</p><div class="image"><img alt="Graphique montrant l&#39;approximation de la courbe cosinus entre -π/2 et π/2 par une succession de paliers" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7ce469cc-8813-492c-8256-84b54858736a/kan-06-approximation-cosinus-fonction-palier.png.png?t=1787731235"/></div><p class="paragraph" style="text-align:left;">Naturellement, plus le nombre de paliers augmente, meilleure est l&#39;approximation. Pour généraliser, un réseau de neurones à une seule couche cachée peut associer chacun de ses neurones à une fonction en palier.</p><p class="paragraph" style="text-align:left;">En utilisant les poids et les biais comme des portes logiques, chaque neurone peut déterminer si une entrée tombe dans sa région désignée.</p><p class="paragraph" style="text-align:left;">Pour les entrées qui tombent dans la section attribuée à un neurone, un poids fortement positif poussera la sortie du neurone vers 1 avec une activation sigmoïde. À l&#39;inverse, un poids fortement négatif poussera la sortie vers 0 si l&#39;entrée n&#39;appartient pas à cette section.</p><p class="paragraph" style="text-align:left;">Les réseaux de neurones actuels sont bien plus complexes et volumineux, et ils ne se contentent plus d&#39;estimer de simples fonctions en escalier. Il subsiste néanmoins un certain mécanisme de &quot;gating&quot; : certains neurones s&#39;activent en fonction de motifs spécifiques présents dans l&#39;entrée.</p><p class="paragraph" style="text-align:left;">De plus, à mesure que l&#39;on empile des couches cachées supplémentaires, le potentiel d&#39;approximation universelle croît de façon exponentielle. Les neurones de la deuxième couche forment des motifs à partir des motifs de la première couche, et ainsi de suite.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="thorme-de-reprsentation-de-kolmogor">Théorème de représentation de Kolmogorov-Arnold</h2><p class="paragraph" style="text-align:left;">Voici un autre théorème portant lui aussi sur l&#39;approximation, ou plutôt la représentation, de fonctions continues.</p><p class="paragraph" style="text-align:left;">Plus formellement, le théorème de représentation de Kolmogorov-Arnold affirme que toute fonction continue multivariée peut être représentée comme la composition d&#39;un nombre <b>fini</b> de fonctions continues à une seule variable.</p><p class="paragraph" style="text-align:left;">Décomposons cette affirmation :</p><ul><li><p class="paragraph" style="text-align:left;">Une &quot;fonction continue multivariée&quot; est une fonction qui accepte plusieurs paramètres en entrée :</p></li></ul><div class="image"><img alt="Notation mathématique d&#39;une fonction multivariée y=F(x1, x2, x3, ..., xn)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/422b63f8-5944-489f-8e70-5b5199a01bab/kan-07-fonction-multivariee-formule.png.png?t=1787731385"/></div><ul><li><p class="paragraph" style="text-align:left;">&quot;Un nombre fini de fonctions continues à une seule variable&quot; signifie ce qui suit :</p></li></ul><div class="image"><img alt="Schéma annoté montrant une somme de fonctions univariées phi1(x1) + phi2(x2) + ... + phin(xn)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7a6bd39b-ddb9-4b3b-b17c-c63ea905c781/kan-08-somme-fonctions-univariees.png.png?t=1787731364"/></div><p class="paragraph" style="text-align:left;">On ne s&#39;arrête pas là pour autant. La somme ci-dessus est ensuite passée à travers une fonction supplémentaire, <code>psi</code> :</p><div class="image"><img alt="Formule mathématique montrant la fonction psi appliquée à la somme des fonctions univariées phi_i(xi)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2d1d575a-98dc-401f-8b87-23916d1e34b5/kan-09-fonction-psi-somme-phi.png?t=1787731423"/></div><p class="paragraph" style="text-align:left;">Enfin, on applique également une composition à cette dernière étape pour généraliser encore la formule :</p><div class="image"><img alt="Formule mathématique généralisée avec double somme, psi_j appliquée à la somme des phi_ij(xi)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/93b78d9d-6d93-40b7-933d-7ff36ad196e3/kan-10-formule-generalisee-kolmogorov-arnold.png?t=1787731476"/></div><p class="paragraph" style="text-align:left;">Pour résumer, le théorème de représentation de Kolmogorov-Arnold affirme que toute fonction continue multivariée peut être représentée comme la composition de fonctions continues à une seule variable.</p><div class="image"><img alt="Formule complète et annotée du théorème de Kolmogorov-Arnold reliant une fonction continue multivariée à une composition de fonctions univariées" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/38ff395f-81d9-4cdb-8751-57bc2be60758/kan-11-theoreme-kolmogorov-arnold-formule-complete.png.png?t=1787731537"/></div><p class="paragraph" style="text-align:left;">Si on développe les termes de la somme, on obtient ceci :</p><div class="image"><img alt="Version développée de la formule de Kolmogorov-Arnold, détaillant chaque terme psi_j appliqué à la somme des fonctions phi_ij(xi)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ac2b0a36-3258-4873-94ac-bd005b4584f3/kan-12-formule-developpee-kolmogorov-arnold.png.png?t=1787731580"/></div><p class="paragraph" style="text-align:left;">Voici un exemple simple pour t&#39;aider à visualiser :</p><div class="image"><img alt="Exemple simple illustrant le théorème de Kolmogorov-Arnold, F(x,y)=xy représenté comme exp(log(x)+log(y))" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5cff140d-c25a-40d5-ba82-82d7f8b0020b/kan-13-exemple-simple-xy-log-exp.png.png?t=1787731640"/></div><p class="paragraph" style="text-align:left;">Si tu reviens maintenant à l&#39;image du réseau KAN présentée plus haut, c&#39;est exactement ce mécanisme qui est à l&#39;œuvre dans le réseau proposé.</p><p class="paragraph" style="text-align:left;">Dans un premier temps :</p><div class="image"><img alt="Diagramme d&#39;un réseau KAN montrant les fonctions phi11 à phi25 appliquées aux entrées x1 et x2 dans la première couche" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/035f6027-9c0c-47db-98d7-f96fee38033b/kan-14-reseau-kan-couche-fonctions-phi.png?t=1787731733"/></div><ul><li><p class="paragraph" style="text-align:left;">L&#39;entrée x₁ passe à travers les fonctions univariées <code>(ϕ₁₁, ϕ₁₂, ⋯, ϕ₁₅)</code> pour obtenir <code>(ϕ₁₁(x₁), ϕ₁₂(x₁), ⋯, ϕ₁₅(x₁))</code>.</p></li><li><p class="paragraph" style="text-align:left;">L&#39;entrée x₂ passe à travers les fonctions univariées <code>(ϕ₂₁, ϕ₂₂, ⋯, ϕ₂₅)</code> pour obtenir <code>(ϕ₂₁(x₂), ϕ₂₂(x₂), ⋯, ϕ₂₅(x₂))</code>.</p></li></ul><p class="paragraph" style="text-align:left;">Ensuite, les deux sorties correspondantes sont agrégées (sommées). La fonction ψ se réduit donc ici à l&#39;opération identité (<code>ψ(z) = z</code>) :</p><div class="image"><img alt="Diagramme montrant l&#39;agrégation des sorties d&#39;une couche KAN où la fonction psi correspond à l&#39;identité" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7aaf69af-8b4a-4afa-b206-31ced5748e56/kan-15-somme-identite-couche-kan.png.png?t=1787731788"/></div><p class="paragraph" style="text-align:left;">Cela constitue une couche KAN.</p><p class="paragraph" style="text-align:left;">On passe ensuite cette sortie à travers une couche KAN supplémentaire. La sortie ci-dessus est donc d&#39;abord transmise à la fonction ϕ de la couche suivante, puis sommée pour obtenir la sortie finale : </p><div class="image"><img alt="Diagramme complet montrant le calcul de la sortie finale d&#39;un réseau KAN après passage à travers une seconde couche de fonctions phi" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bed81231-d298-4b27-8635-54cb9f4770df/kan-16-sortie-finale-deuxieme-couche-kan.png.png?t=1787732038"/></div><hr class="content_break"><h2 class="heading" style="text-align:left;" id="diffrences-cls">Différences clés</h2><p class="paragraph" style="text-align:left;">Du point de vue de la portée, le théorème d&#39;approximation universelle s&#39;applique explicitement aux réseaux de neurones, tandis que le théorème de Kolmogorov-Arnold est un résultat mathématique plus général, que les auteurs de KAN étendent aux réseaux de neurones censés estimer une fonction continue inconnue.</p><p class="paragraph" style="text-align:left;">Concernant l&#39;approche, le théorème d&#39;approximation universelle traite de l&#39;<b>approximation</b> de fonctions par des réseaux de neurones. Le théorème de Kolmogorov-Arnold, lui, fournit un moyen <b>de représenter exactement</b> des fonctions continues via des sommes de fonctions univariées, ce qui est censé les rendre plus précises.</p><p class="paragraph" style="text-align:left;">Enfin, du point de vue de l&#39;application, le théorème d&#39;approximation universelle est largement utilisé en machine learning pour justifier la puissance des réseaux de neurones, tandis que le théorème de Kolmogorov-Arnold relève davantage d&#39;un éclairage théorique, aujourd&#39;hui étendu au machine learning à travers des architectures comme les Kolmogorov Arnold Networks.</p><p class="paragraph" style="text-align:left;">Puisque le théorème de Kolmogorov-Arnold vise une représentation exacte de la fonction multivariée, son intégration dans un réseau de neurones est censée être bien plus efficace et précise.</p><div class="image"><img alt="Illustration comparant un MLP, modèle boîte noire, à un KAN, présenté comme plus interprétable" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f21015a1-a749-419e-a521-b7df9b833433/kan-17-mlp-boite-noire-vs-kan-interpretable.png.png?t=1787732129"/></div><p class="paragraph" style="text-align:left;">Cette représentation exacte pourrait d&#39;ailleurs mener à des modèles plus interprétables et nécessitant moins de ressources pour l&#39;entraînement, l&#39;architecture intégrant nativement les propriétés mathématiques des fonctions continues apprises.</p><hr class="content_break"><div class="section" style="background-color:#1B3A6B;border-color:#F7931E;border-radius:8px;border-style:solid;border-width:3px;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;">💡<span style="color:#FFFFFF;"> En continuant, tu vas découvrir : </span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Comment les points de contrôle des B-splines deviennent les &quot;poids&quot; apprenables d&#39;un KAN</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Le nombre réel de paramètres d&#39;un KAN comparé à un MLP équivalent, et pourquoi ce n&#39;est pas si simple</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Pourquoi les KAN n&#39;oublient (presque) jamais ce qu&#39;ils ont appris, contrairement aux MLP classiques</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Comment lire directement, dans les formules apprises, la fonction mathématique découverte par un KAN entraîné</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#FFFFFF;">Le vrai goulot d&#39;étranglement des KAN, et comment la communauté l&#39;a résolu en une semaine</span></p></li></ul></div><div class="paywall"><hr class="paywall__break"/><div class="paywall__content"><h2 class="paywall__header"> La suite de ce mini-cours est réservée aux membres du Cercle des Experts. </h2><p class="paywall__description"> Tu as déjà le début. Pour accéder à l’explication complète et à tous les contenus avancés, rejoins le Cercle des Experts dès maintenant. </p><p class="paywall__links"><a class="paywall__upgrade_link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=kolmogorov-arnold-networks-kan-le-guide-complet-pour-les-data-scientists">Rejoindre le Cercle des Experts</a> Translation missing: en.app.shared.conjuction.or <a class="paywall__login_link" href="https://www.monshotdata.com/login?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=kolmogorov-arnold-networks-kan-le-guide-complet-pour-les-data-scientists">Sign In</a></p><div class="paywall__upsell"><div class="paywall__upsell_header"><h3> En devenant membre, tu débloques </h3></div><ul class="paywall__upsell_features"><li class="paywall__upsell_feature"> L’intégralité de ce mini-cours (sans coupure) </li><li class="paywall__upsell_feature"> Tous les mini-cours archivés et les ressources associées </li><li class="paywall__upsell_feature"> 1 nouveau mini-cours chaque semaine pour progresser en continu </li></ul></div></div></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=9e3518a5-e606-408f-b414-a967ca862962&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Le piège du feature engineering que tout le monde ignore</title>
  <description>🎯 Shot #329 - Pourquoi 23h et 0h ne sont pas si éloignées qu&#39;elles en ont l&#39;air.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/236b5af4-ae36-4b4d-a9b3-0c6e432c325a/_329-feature-engineering-cyclique-cover.png.png" length="148795" type="image/png"/>
  <link>https://www.monshotdata.com/p/feature-engineering-cyclique-guide</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/feature-engineering-cyclique-guide</guid>
  <pubDate>Mon, 24 Aug 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-08-24T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Machine Learning]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Dans la plupart des datasets de machine learning, on retrouve principalement des features qui progressent d&#39;une valeur à une autre :</p><p class="paragraph" style="text-align:left;">Par exemple :</p><ul><li><p class="paragraph" style="text-align:left;">Des features numériques comme l&#39;âge, le revenu, le montant d&#39;une transaction, etc.</p></li><li><p class="paragraph" style="text-align:left;">Des features catégorielles comme la taille d&#39;un t-shirt, les tranches de revenu, les tranches d&#39;âge, etc.</p></li></ul><p class="paragraph" style="text-align:left;"><b>Cependant, il existe un autre type de feature qui, dans la plupart des cas, mérite un effort de feature engineering particulier, mais qui est souvent négligé.</b></p><p class="paragraph" style="text-align:left;">Ce sont les features cycliques, c&#39;est-à-dire des features qui suivent un motif récurrent (ou un cycle).</p><div class="image"><img alt="Schéma circulaire illustrant le concept de feature cyclique avec quatre valeurs A, B, C et D reliées en boucle" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/84d1a85c-dda8-4733-ae79-c7819dd57042/feature-cyclique-schema-circulaire.png.png?t=1787560544"/></div><p class="paragraph" style="text-align:left;">Contrairement aux autres features qui progressent de façon continue (ou qui n&#39;ont pas d&#39;ordre intrinsèque), les features cycliques présentent un comportement périodique et se répètent après un intervalle précis.</p><p class="paragraph" style="text-align:left;">Par exemple, l&#39;heure de la journée, le jour de la semaine et le mois de l&#39;année sont tous des exemples courants de features cycliques.</p><p class="paragraph" style="text-align:left;">En parlant spécifiquement de l&#39;heure de la journée, sa valeur peut aller de 0 à 23 :</p><div class="image"><img alt="Échelle linéaire représentant l&#39;heure de la journée de 0 à 23" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f870a0ac-727d-4d78-9fd0-e9d3ada3678b/heure-journee-echelle-lineaire.png?t=1787560846"/></div><p class="paragraph" style="text-align:left;"><b>Si on NE considère PAS cette feature comme cyclique et qu&#39;on n&#39;utilise pas les techniques de feature engineering appropriées, on va perdre des informations vraiment essentielles.</b></p><p class="paragraph" style="text-align:left;">Pour mieux comprendre, prends ça en compte :</p><p class="paragraph" style="text-align:left;">En toute logique, les valeurs &quot;23&quot; et &quot;0&quot; doivent être proches l&#39;une de l&#39;autre dans notre représentation &quot;idéale&quot; de la feature heure de la journée.</p><div class="image"><img alt="Échelle de l&#39;heure de la journée montrant que les valeurs 0 et 23 doivent être considérées comme proches" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/df9112ad-dfd6-47a2-9f09-ed854355c28c/heure-journee-valeurs-proches.png?t=1787560884"/></div><p class="paragraph" style="text-align:left;">De plus, la distance entre &quot;0&quot; et &quot;1&quot; doit être la même que la distance entre &quot;23&quot; et &quot;0&quot;.</p><div class="image"><img alt="Schéma illustrant que la distance entre 23 et 0 doit être égale à la distance entre 0 et 1" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9598d9f0-8ffb-459f-b318-9e17e65be434/distance-23-0-1-schema.png?t=1787560971"/></div><p class="paragraph" style="text-align:left;">Cependant, la représentation standard ne respecte pas ces propriétés.</p><p class="paragraph" style="text-align:left;">Ainsi, la valeur &quot;23&quot; est éloignée de &quot;0&quot;. En réalité, la propriété de distance n&#39;est pas respectée non plus.</p><p class="paragraph" style="text-align:left;">Maintenant, prends un instant pour y réfléchir.</p><p class="paragraph" style="text-align:left;">Intuitivement, tu ne penses pas que cette feature mérite un feature engineering particulier, c&#39;est-à-dire un traitement qui préserve sa propriété naturelle intrinsèque ?</p><p class="paragraph" style="text-align:left;">Je suis sûr que si !</p><p class="paragraph" style="text-align:left;">Voyons comment on procède habituellement.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="encoder-les-features-cycliques">Encoder les features cycliques</h2><p class="paragraph" style="text-align:left;">L&#39;une des techniques les plus courantes pour encoder ce type de feature consiste à utiliser des fonctions trigonométriques, plus précisément le sinus et le cosinus.</p><p class="paragraph" style="text-align:left;">Elles sont utiles parce que le sinus et le cosinus sont périodiques, bornés, et définis pour toutes les valeurs réelles.</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">Par exemple, prenons la représentation linéaire de la feature heure de la journée transformée en feature cyclique :</p><div class="image"><img alt="Transformation d&#39;une feature linéaire heure de la journée en feature cyclique représentée sur une horloge" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/300d895e-a2f6-43c8-b6bb-8ed4747c3adc/feature-lineaire-vers-cyclique-horloge.png.png?t=1787561021"/></div><p class="paragraph" style="text-align:left;">L&#39;angle central (2π) représente 24 heures.</p><p class="paragraph" style="text-align:left;">Ainsi, les valeurs de la feature linéaire peuvent facilement être converties en features cycliques comme suit :</p><div class="image"><img alt="Extrait de code Python utilisant NumPy pour encoder l&#39;heure avec les fonctions sinus et cosinus" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9ce370d3-1a53-4d50-b226-7121431bffe1/code-python-encodage-sin-cos-heure.png?t=1787561083"/></div><p class="paragraph" style="text-align:left;">L&#39;avantage de cette démarche, c&#39;est de voir à quel point la feature ainsi obtenue respecte parfaitement les propriétés qu&#39;on a évoquées plus haut : </p><div class="image"><img alt="Formules mathématiques démontrant l&#39;égalité entre sinus et cosinus pour les distances (0,23) et (0,1)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2c1f99ed-7e33-4c0a-b6c9-e8c50b6c51a6/formule-egalite-sin-cos-distance.png.png?t=1787561141"/></div><p class="paragraph" style="text-align:left;">Comme illustré ci-dessus, la distance entre la représentation cyclique de &quot;23&quot; et de &quot;0&quot; est la même que la distance entre &quot;0&quot; et &quot;1&quot;.</p><p class="paragraph" style="text-align:left;">La représentation linéaire standard de la feature heure de la journée, en revanche, viole cette propriété, ce qui entraîne une perte d&#39;information…</p><p class="paragraph" style="text-align:left;">… ou plutôt, je devrais dire que la représentation linéaire standard de la feature heure de la journée entraîne une sous-utilisation de l&#39;information, dont le modèle pourrait pourtant bénéficier.</p><p class="paragraph" style="text-align:left;">S&#39;il s&#39;était agi du jour de la semaine à la place, l&#39;angle central (2π) aurait dû représenter 7 jours.</p><div class="image"><img alt="Transformation des jours de la semaine d&#39;une représentation linéaire vers une représentation circulaire" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2c5b268c-77a3-42bc-802d-c833f9a23919/jours-semaine-lineaire-vers-cercle.png?t=1787561202"/></div><p class="paragraph" style="text-align:left;">Ça a du sens intuitivement aussi.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">La même idée peut s&#39;étendre à tous les types de features cycliques que tu pourrais retrouver dans ton dataset :</p><ul><li><p class="paragraph" style="text-align:left;"><b>La direction du vent</b>, si elle est représentée de façon catégorielle, suivra cet ordre : N, NE, E, SE, S, SO, O, NO, puis de nouveau N.</p></li><li><p class="paragraph" style="text-align:left;"><b>Les phases de la lune</b>, comme la nouvelle lune, le premier quartier, la pleine lune et le dernier quartier, peuvent être représentées comme des catégories suivant un ordre cyclique.</p></li><li><p class="paragraph" style="text-align:left;"><b>Les saisons</b>, comme le printemps, l&#39;été, l&#39;automne et l&#39;hiver, sont des features catégorielles au motif cyclique puisqu&#39;elles se répètent chaque année.</p></li></ul><p class="paragraph" style="text-align:left;">Le point important, c&#39;est qu&#39;en inspectant les features de ton dataset, tu sauras intuitivement lesquelles sont cycliques et lesquelles ne le sont pas.</p><p class="paragraph" style="text-align:left;"><b>En général</b>, le modèle trouvera plus facile d&#39;interpréter les features ainsi obtenues et de les utiliser pour modéliser précisément le dataset.</p><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quelles sont les autres façons de gérer ce type de features ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=c8ff3791-6658-437b-83f4-170484a0d6b6&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>HDBSCAN : la version surpuissante de DBSCAN</title>
  <description>👀​ Mini-cours #37 - Pourquoi KMeans et DBSCAN échouent sur des clusters de densités variables, et comment HDBSCAN résout le problème sans presque aucune hypothèse.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9b119621-79f4-4db6-938e-59d96b48c6d3/Mini-cours_37-HDBSCAN.png" length="212064" type="image/png"/>
  <link>https://www.monshotdata.com/p/hdbscan-clustering-densites-variables-dbscan</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/hdbscan-clustering-densites-variables-dbscan</guid>
  <pubDate>Wed, 19 Aug 2026 09:30:00 +0000</pubDate>
  <atom:published>2026-08-19T09:30:00Z</atom:published>
    <category><![CDATA[Clustering &amp; Réduction Dimensionnalité]]></category>
    <category><![CDATA[Machine Learning]]></category>
    <category><![CDATA[Pro]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#f2eafe;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:2.0px 2.0px 2.0px 2.0px;"><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Psst... Contenu Exclusif Réservé aux Membres !</b></span><br><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Ce mini-cours fait partie de notre espace premium. Rejoins dès maintenant le </span><b>Cercle des Experts</b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;"> pour débloquer l’intégralité de nos ressources, analyses approfondies et guides pratiques.</span><br><b>👉 </b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Clique ici pour découvrir les avantages et t’inscrire : </span><b><a class="link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=hdbscan-la-version-surpuissante-de-dbscan" target="_blank" rel="noopener noreferrer nofollow" style="color: #2563eb">Page d’adhésion</a></b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">.</span></p></div><div class="section" style="background-color:transparent;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Poppins, Helvetica, sans-serif, serif, EmojiFont;font-size:16px;">⏱️ </span><i><b>Temps de lecture</b></i><i> : </i>~40 minutes</p></div><p class="paragraph" style="text-align:left;">On a déjà creusé plusieurs algorithmes de clustering avancés dans les dossiers précédents, notamment ceux-ci :</p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/modeles-melange-gaussien-gmm?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=hdbscan-la-version-surpuissante-de-dbscan" target="_blank"><div class="embed__content"><p class="embed__title"> Comprendre les Modèles de Mélange Gaussien (GMMs) </p><p class="embed__description"> Découvre les Modèles de Mélange Gaussien (GMMs), une alternative puissante à KMeans pour un clustering avancé et robuste des données en machine learning. </p></div><img class="embed__image embed__image--right" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/9df709d1-57f1-48b9-ac4d-0aa7f4e348b4/Mini-cours__5_-_Re%CC%81sultats_de_KMeans_vs_GMM.png?t=1772986383"/></a></div><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/dbscan-plus-plus-clustering-scalable?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=hdbscan-la-version-surpuissante-de-dbscan" target="_blank"><img class="embed__image embed__image--left" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/98fbac48-c782-4ddd-8e10-c1a1a67a1fd6/Mini-cours__24_-_La_limite_du_clustering_DBSCAN.png.png?t=1774535041"/><div class="embed__content"><p class="embed__title"> DBSCAN++ : Passe ton Clustering à l&#39;échelle supérieure </p><p class="embed__description"> Surmonte les limites de DBSCAN. Apprends comment DBSCAN++ et le K-center sampling offrent une alternative rapide et scalable pour tes grands jeux de données. </p></div></a></div><p class="paragraph" style="text-align:left;">Dans ce dossier, on continue la série clustering avec <b>HDBSCAN</b>, un algorithme de clustering hiérarchique puissant qui étend les capacités de DBSCAN en ajoutant une dimension hiérarchique et en gérant beaucoup mieux les densités variables.</p><ul><li><p class="paragraph" style="text-align:left;">DBSCAN signifie Density-Based Spatial Clustering of Applications with Noise.</p></li><li><p class="paragraph" style="text-align:left;">HDBSCAN signifie <b>Hierarchical</b> Density-Based Spatial Clustering of Applications with Noise.</p></li></ul><p class="paragraph" style="text-align:left;">Pour rappel, DBSCAN part du principe que la densité locale des points de données est (plus ou moins) uniforme à l&#39;échelle globale. C&#39;est son paramètre eps qui gouverne cette hypothèse.</p><div class="image"><img alt="Schéma illustrant l&#39;hypothèse de densité uniforme de DBSCAN, avec un paramètre eps appliqué de façon identique à tous les points d&#39;un cluster en forme de fer à cheval" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c12b3584-7b77-41de-b721-01411176e904/hdbscan-01-hypothese-densite-uniforme-dbscan.png?t=1787083692"/></div><p class="paragraph" style="text-align:left;">Regarde par exemple les résultats de clustering obtenus avec DBSCAN sur le dataset factice ci-dessous, où chaque cluster a une densité différente : </p><div class="image"><img alt="Comparaison avant/après montrant HDBSCAN identifier correctement les trois clusters malgré des densités très différentes, contrairement à DBSCAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f475d1c3-9dce-4d56-b324-02f5237d9c9d/hdbscan-02-dbscan-echec-densites-variables.png?t=1787083747"/></div><p class="paragraph" style="text-align:left;">Le résultat est clair : DBSCAN produit un mauvais clustering.</p><p class="paragraph" style="text-align:left;">Compare maintenant avec les résultats de HDBSCAN sur les mêmes données :</p><div class="image"><img alt="Grille représentant un dataset non labellisé, point de départ de tout problème de clustering avant l&#39;application d&#39;un algorithme comme HDBSCAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cb643b94-4118-482d-972d-ab3cd4a23d45/hdbscan-03-hdbscan-robuste-densites-variables.png?t=1787083780"/></div><p class="paragraph" style="text-align:left;">Sur un dataset avec trois clusters de densités variables, HDBSCAN se montre bien plus robuste.</p><p class="paragraph" style="text-align:left;">À la fin de ce dossier précédent, beaucoup d&#39;entre vous ont montré de l&#39;intérêt pour un deep dive complet sur HDBSCAN. Ça tombe bien, c&#39;est exactement le sujet du jour.</p><p class="paragraph" style="text-align:left;">On va couvrir les concepts clés qui te permettront de comprendre comment HDBSCAN fonctionne, et pourquoi c&#39;est un algorithme de clustering aussi puissant.</p><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="quoi-ressemblent-les-donnes">À quoi ressemblent les données ?</h2><p class="paragraph" style="text-align:left;">Tout problème de clustering démarre avec un dataset (non labellisé) et quelques hypothèses à son sujet.</p><div class="image"><img alt="Grille représentant un dataset non labellisé, point de départ de tout problème de clustering avant l&#39;application d&#39;un algorithme comme HDBSCAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f644842b-9dce-4d22-b65d-ed161b2eb288/hdbscan-04-dataset-non-labellise-schema.png?t=1787083853"/></div><p class="paragraph" style="text-align:left;">Avant de concevoir (ou d&#39;utiliser) un algorithme de clustering, la première question à se poser est :</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><p class="paragraph" style="text-align:left;">Dans l&#39;idéal, on veut poser le moins d&#39;hypothèses possible. Deux hypothèses de base suffisent pour avancer :</p><div class="image"><img alt="Illustration de trois clusters de formes et tailles arbitraires (orange, bleu, vert) entourés de points de bruit gris isolés" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/bac5e0bd-9e6d-4777-befe-7d5e72514ef6/hdbscan-05-clusters-arbitraires-bruit-illustration.png?t=1787083920"/></div><ul><li><p class="paragraph" style="text-align:left;">Le dataset contient du bruit, ce qui veut dire que tous les points n&#39;appartiennent pas forcément à un cluster.</p></li><li><p class="paragraph" style="text-align:left;">Il existe un certain nombre de clusters (on ne sait pas combien) de formes arbitraires dans le dataset.</p></li></ul><p class="paragraph" style="text-align:left;">Dans ce dossier, on va construire les fondations de HDBSCAN à partir du dataset 2D suivant :</p><div class="image"><img alt="Nuage de points en 2D représentant le dataset factice utilisé tout au long du dossier pour comparer KMeans, DBSCAN et HDBSCAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b75c46d6-07a1-44cf-a30f-58b9402ed240/hdbscan-06-dataset-factice-scatter.png.png?t=1787083989"/></div><p class="paragraph" style="text-align:left;">Comme c&#39;est un dataset en 2D, il est facile de constater visuellement qu&#39;il y a 6 clusters, le reste étant du bruit :</p><div class="image"><img alt="Le même dataset factice, avec les 6 clusters de formes arbitraires entourés manuellement pour illustrer l&#39;inspection visuelle avant clustering" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/862e2594-76d0-4ae1-9f7e-5c9f51b50554/hdbscan-07-dataset-factice-clusters-identifies.png.png?t=1787084043"/></div><p class="paragraph" style="text-align:left;">Mais évidemment, l&#39;inspection visuelle n&#39;est pas toujours possible (en particulier sur des données en haute dimension). On a donc besoin d&#39;un algorithme de clustering capable d&#39;identifier des clusters dans n&#39;importe quel espace, quelle que soit sa dimension.</p><h2 class="heading" style="text-align:left;" id="essayons-avec-k-means">Essayons avec KMeans</h2><p class="paragraph" style="text-align:left;">Le premier réflexe face à un problème de clustering, c&#39;est souvent d&#39;essayer KMeans. Comme on connaît le nombre de clusters dans ce cas précis, lançons un KMeans et regardons les résultats :</p><div class="image"><img alt="Bloc de code Python montrant l&#39;import et l&#39;instanciation de KMeans avec scikit-learn, avec n_clusters=6 et l&#39;extraction des labels" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5546fc5b-6254-45c2-8b5d-b21f93432783/hdbscan-08-code-import-kmeans-sklearn.png?t=1787086673"/></div><p class="paragraph" style="text-align:left;">En traçant le dataset avec les labels obtenus, on obtient le graphique suivant :</p><div class="image"><img alt="Nuage de points montrant l&#39;échec de KMeans à retrouver les 6 clusters d&#39;origine malgré un nombre de clusters spécifié correctement" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/0e747fed-927b-4bc8-a7b1-d98981b3e6ca/hdbscan-09-kmeans-clustering-resultats-scatter.png.png?t=1787086739"/></div><p class="paragraph" style="text-align:left;">Imaginons un instant qu&#39;on dispose déjà d&#39;une implémentation de HDBSCAN, et qu&#39;on la lance sur le même dataset : </p><div class="image"><img alt="Bloc de code Python montrant l&#39;import et l&#39;instanciation de HDBSCAN avec scikit-learn, avec min_cluster_size=12 et l&#39;extraction des labels" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5a703751-0a49-487f-86bc-bda9a0112ec7/hdbscan-10-code-import-hdbscan-sklearn.png?t=1787088645"/></div><p class="paragraph" style="text-align:left;">En traçant le dataset avec les labels obtenus, on obtient :</p><div class="image"><img alt="Nuage de points montrant HDBSCAN retrouver correctement les 6 clusters et isoler les points de bruit en vert clair, sans spécifier le nombre de clusters" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c0767157-67ff-491b-994b-517380e41469/hdbscan-11-hdbscan-clustering-resultats-scatter.png.png?t=1787086881"/></div><p class="paragraph" style="text-align:left;">Malgré le fait qu&#39;on ait spécifié le bon nombre de clusters à KMeans, celui-ci échoue à produire un clustering correct. HDBSCAN, lui, fait un bien meilleur travail (à l&#39;œil nu) sans même qu&#39;on lui précise le nombre de clusters.</p><p class="paragraph" style="text-align:left;">Pourquoi KMeans échoue-t-il ? Voyons ça.</p><h3 class="heading" style="text-align:left;" id="les-limites-de-k-means">Les limites de KMeans</h3><p class="paragraph" style="text-align:left;">Si sa simplicité en fait souvent l&#39;algorithme de clustering préféré, KMeans a plusieurs limites qui plombent son efficacité dans de nombreux cas.</p><h4 class="heading" style="text-align:left;" id="1-k-means-ne-tient-pas-compte-de-la">1) KMeans ne tient pas compte de la variance ni de la forme des clusters</h4><p class="paragraph" style="text-align:left;">Une des limites principales de KMeans, c&#39;est son hypothèse implicite que les clusters sont sphériques.</p><p class="paragraph" style="text-align:left;">Une façon intuitive et visuelle de comprendre l&#39;algorithme KMeans, c&#39;est d&#39;imaginer un <b>cercle</b> placé au centre de chaque cluster, qui englobe les points.</p><div class="image"><img alt="Schéma illustrant KMeans qui place un cercle autour de chaque cluster, une hypothèse de forme sphérique adaptée aux clusters bien séparés et arrondis" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b04e2cb3-0c16-47f1-88d3-c2fcb8051582/hdbscan-12-kmeans-cercles-hypothese-spherique.png.png?t=1787087000"/><div class="image__source"><span class="image__source_text"><p><i>Formes de clusters produites par KMeans quand les données forment des clusters circulaires</i></p></span></div></div><div class="section" style="background-color:#e0f2fa;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;">💡 En 3 dimensions, les cercles deviennent des sphères. Au-delà, on parle d&#39;hypersphères.</p></div><p class="paragraph" style="text-align:left;">Comme KMeans revient essentiellement à placer des cercles, ses résultats sont décevants dès que le dataset présente des formes irrégulières ou des tailles variables, comme ci-dessous : </p><div class="image"><img alt="Schéma montrant KMeans forcer des frontières circulaires sur des clusters allongés et non globulaires, produisant un découpage incorrect" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5dc37af6-b559-430d-b8c7-0944adab2b04/hdbscan-13-kmeans-clusters-non-globulaires-echec.png.png?t=1787087060"/><div class="image__source"><span class="image__source_text"><p><i>Formes de clusters produites par KMeans quand les données forment des clusters ovales</i></p></span></div></div><p class="paragraph" style="text-align:left;">À la place, un clustering idéal devrait ressembler à ceci : </p><div class="image"><img alt="Schéma montrant le clustering idéal attendu sur des données à clusters allongés, avec des frontières ovales épousant la vraie forme des données" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7a065064-3676-466b-8f58-bfd210f5fa9c/hdbscan-14-clustering-ideal-clusters-ovales.png.png?t=1787087117"/><div class="image__source"><span class="image__source_text"><p><i>Forme de cluster idéale quand les données forment des clusters ovales</i></p></span></div></div><p class="paragraph" style="text-align:left;">On observe le même phénomène sur le dataset suivant :</p><div class="image"><img alt="Comparaison entre KMeans, qui force deux cercles se chevauchant sur des clusters en forme de croissant, et le clustering idéal qui respecte leur forme réelle" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a517f49d-06cd-44ee-8415-24d0e20132f3/hdbscan-15-kmeans-vs-ideal-clusters-croissants.png.png?t=1787087171"/></div><p class="paragraph" style="text-align:left;">Cette rigidité de KMeans, qui ne sait clusteriser que des formes globulaires, mène régulièrement à des erreurs de classification et à des assignations de clusters sous-optimales.</p><h4 class="heading" style="text-align:left;" id="2-chaque-point-est-forcment-assign-">2) Chaque point est forcément assigné à un cluster</h4><p class="paragraph" style="text-align:left;">Autre limite importante de KMeans : son hypothèse implicite que chaque point de données doit appartenir à un cluster.</p><p class="paragraph" style="text-align:left;">Plus précisément, KMeans part du principe que chaque point appartient à un cluster, et à un seul, sans aucune place pour représenter du bruit ou des outliers.</p><p class="paragraph" style="text-align:left;">Ça devient problématique quand le dataset contient des irrégularités, des anomalies ou du bruit qui ne collent à aucune frontière de cluster claire.</p><p class="paragraph" style="text-align:left;">Résultat : KMeans va malgré tout assigner ces points à un cluster, même quand ils ne correspondent en réalité à aucun pattern identifiable.</p><p class="paragraph" style="text-align:left;">C&#39;est ce qu&#39;illustre l&#39;image ci-dessous : </p><div class="image"><img alt="Schéma montrant trois outliers isolés être forcés dans les clusters les plus proches par KMeans, illustrant son absence de gestion du bruit" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2c9234b4-fce1-4a7b-a87e-bac372c7a121/hdbscan-16-kmeans-outliers-assignes-clusters.png.png?t=1787087218"/></div><p class="paragraph" style="text-align:left;">Cette tendance peut dégrader la qualité du clustering, en particulier sur des datasets à densités variables, à formes irrégulières, ou contenant du bruit.</p><p class="paragraph" style="text-align:left;">Sur des données réelles, où la structure sous-jacente ne colle pas forcément aux hypothèses de KMeans, cette assignation rigide de tous les points à un cluster peut sérieusement limiter l&#39;efficacité de l&#39;algorithme.</p><p class="paragraph" style="text-align:left;">C&#39;est une limite à garder en tête, qui pousse à envisager d&#39;autres approches (density-based ou hiérarchiques par exemple) dès qu&#39;un dataset présente du bruit ou des outliers significatifs.</p><h4 class="heading" style="text-align:left;" id="3-la-ncessit-de-spcifier-le-nombre-">3) La nécessité de spécifier le nombre de clusters</h4><p class="paragraph" style="text-align:left;">Autre contrainte notable de KMeans : il faut connaître (ou supposer) à l&#39;avance le nombre exact de clusters dans le dataset.</p><p class="paragraph" style="text-align:left;">Contrairement à d&#39;autres algorithmes capables de déterminer automatiquement le nombre optimal de clusters à partir de la structure des données, KMeans repose sur une valeur prédéfinie du nombre de clusters (souvent notée k).</p><p class="paragraph" style="text-align:left;">Ce n&#39;est pas un problème en soi, il existe plusieurs méthodes pour estimer une valeur fiable de k. Mais cette contrainte devient problématique quand le vrai nombre de clusters est inconnu à l&#39;avance, ce qui peut mener à des résultats imprécis et sous-optimaux.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Ces limites de KMeans montrent bien l&#39;intérêt d&#39;explorer d&#39;autres algorithmes capables d&#39;y répondre. </p><p class="paragraph" style="text-align:left;">KMeans fait partie de la famille des algorithmes de clustering par centroïdes, mais il existe de nombreuses autres familles (illustrées ci-dessous), à utiliser selon le contexte :</p><div class="image"><img alt="Tableau récapitulatif des 6 familles d&#39;algorithmes de clustering (centroïdes, connectivité, densité, graphes, distributions, compression) avec leur méthodologie et les algorithmes associés comme KMeans, HDBSCAN, DBSCAN et GMM" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ab7a8a27-2d6d-4f42-b89f-b91c4d878294/hdbscan-17-6-types-algorithmes-clustering-ml.png.png?t=1787087726"/></div><h3 class="heading" style="text-align:left;" id="pourquoi-k-means-a-chou">Pourquoi KMeans a échoué ?</h3><p class="paragraph" style="text-align:left;">Une fois ces limites de KMeans posées, il devient facile de comprendre pourquoi il a produit des résultats aussi médiocres sur notre dataset d&#39;origine.</p><p class="paragraph" style="text-align:left;">Plus précisément, le dataset qu&#39;on a utilisé présente :</p><ul><li><p class="paragraph" style="text-align:left;">Des clusters de formes et de tailles arbitraires</p></li></ul><div class="image"><img alt="Dataset factice annoté montrant les six clusters de formes irrégulières et arbitraires, non détectables par un algorithme supposant des clusters sphériques" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c21131eb-29e9-4e76-b4b7-de0f3c8cf325/hdbscan-18-dataset-factice-formes-arbitraires.png.png?t=1787088305"/></div><ul><li><p class="paragraph" style="text-align:left;">Des clusters de densités variables</p></li></ul><div class="image"><img alt="Dataset factice annoté montrant des clusters de densités nettement différentes, un défi pour les algorithmes supposant une densité uniforme" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8d4ad6db-9d67-49f8-944d-188625a46422/hdbscan-19-dataset-factice-densites-differentes.png.png?t=1787088359"/></div><ul><li><p class="paragraph" style="text-align:left;">Des points de bruit</p></li></ul><div class="image"><img alt="Dataset factice annoté délimitant la région dense des clusters, avec de nombreux points de bruit dispersés à l&#39;extérieur" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5444c65b-1f5d-46aa-8893-9940d709c4cb/hdbscan-20-dataset-factice-points-bruit.png.png?t=1787088399"/></div><p class="paragraph" style="text-align:left;">Ça explique clairement la contre-performance de KMeans sur ce dataset. Mais ça nous donne aussi de bonnes pistes pour construire un algorithme plus robuste.</p><h3 class="heading" style="text-align:left;" id="poser-les-bonnes-attentes">Poser les bonnes attentes</h3><p class="paragraph" style="text-align:left;">Les trois points ci-dessus définissent des attentes claires sur notre dataset. Il paraît raisonnable de supposer qu&#39;un dataset réel présentera les mêmes caractéristiques :</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Les clusters auront des formes et des tailles arbitraires.</p></li><li><p class="paragraph" style="text-align:left;">Les clusters auront des densités arbitraires.</p></li><li><p class="paragraph" style="text-align:left;">Le dataset contiendra des points de bruit.</p></li></ol><p class="paragraph" style="text-align:left;">Si on retire la 2ème caractéristique (densités arbitraires), l&#39;algorithme DBSCAN répond à ces critères.</p><p class="paragraph" style="text-align:left;">Mais comme on l&#39;a vu plus haut (et dans le deep dive dédié à DBSCAN), il suppose que la densité locale des points est (plus ou moins) uniforme à l&#39;échelle globale. C&#39;est son paramètre <code>eps</code> qui gouverne ça.</p><div class="image"><img alt="Schéma illustrant l&#39;hypothèse de densité uniforme de DBSCAN, avec un paramètre eps appliqué de façon identique à tous les points d&#39;un cluster en forme de fer à cheval" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c12b3584-7b77-41de-b721-01411176e904/hdbscan-01-hypothese-densite-uniforme-dbscan.png?t=1787083692"/></div><p class="paragraph" style="text-align:left;">DBSCAN a donc du mal avec un dataset où chaque cluster a une densité différente : </p><div class="image"><img alt="Comparaison avant/après montrant DBSCAN produire un clustering fragmenté avec de nombreux faux points de bruit sur un dataset à trois clusters de densités différentes" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f475d1c3-9dce-4d56-b324-02f5237d9c9d/hdbscan-02-dbscan-echec-densites-variables.png?t=1787083765"/></div><p class="paragraph" style="text-align:left;">HDBSCAN, en revanche, se montre bien plus robuste.</p><div class="image"><img alt="Comparaison avant/après montrant HDBSCAN identifier correctement les trois clusters malgré des densités très différentes, contrairement à DBSCAN" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cb643b94-4118-482d-972d-ab3cd4a23d45/hdbscan-03-hdbscan-robuste-densites-variables.png?t=1787083780"/></div><hr class="content_break"><div class="section" style="background-color:#1B3A6B;border-color:#F7931E;border-radius:8px;border-style:solid;border-width:3px;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;">💡<span style="color:#F9FAFB;"> En continuant, tu vas découvrir : </span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Le paradoxe qui rend la validation des hypothèses de clustering presque impossible en pratique, et pourquoi il faut un algorithme qui pose le moins d&#39;hypothèses possible</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Comment définir rigoureusement ce qu&#39;est un &quot;cluster&quot;, au-delà de l&#39;intuition visuelle</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Les deux méthodes pour estimer une densité de probabilité à partir des données brutes, et laquelle des deux HDBSCAN utilise (et pourquoi)</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Le concept de &quot;core distance&quot;, la pièce maîtresse qui rend HDBSCAN robuste aux changements d&#39;échelle</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Comment HDBSCAN transforme un simple seuil de densité en régions de clusters connectées</span></p></li></ul></div><div class="paywall"><hr class="paywall__break"/><div class="paywall__content"><h2 class="paywall__header"> La suite de ce mini-cours est réservée aux membres du Cercle des Experts. </h2><p class="paywall__description"> Tu as déjà le début. Pour accéder à l’explication complète et à tous les contenus avancés, rejoins le Cercle des Experts dès maintenant. </p><p class="paywall__links"><a class="paywall__upgrade_link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=hdbscan-la-version-surpuissante-de-dbscan">Rejoindre le Cercle des Experts</a> Translation missing: en.app.shared.conjuction.or <a class="paywall__login_link" href="https://www.monshotdata.com/login?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=hdbscan-la-version-surpuissante-de-dbscan">Sign In</a></p><div class="paywall__upsell"><div class="paywall__upsell_header"><h3> En devenant membre, tu débloques </h3></div><ul class="paywall__upsell_features"><li class="paywall__upsell_feature"> L’intégralité de ce mini-cours (sans coupure) </li><li class="paywall__upsell_feature"> Tous les mini-cours archivés et les ressources associées </li><li class="paywall__upsell_feature"> 1 nouveau mini-cours chaque semaine pour progresser en continu </li></ul></div></div></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=cbe772ef-3c49-42f0-9fed-0889cdebf27a&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Gradient Checkpointing : la technique sous-estimée qui réduit ta mémoire de 50-60 %</title>
  <description>🎯 Shot #328 - Comment diviser ton réseau en segments pour entraîner des modèles plus grands, sans exploser ta mémoire GPU.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/977f4226-18b8-4958-ae28-f3902e1aa2ba/_328-pytorch-simplenet-gradient-checkpointing-code.png.png" length="622797" type="image/png"/>
  <link>https://www.monshotdata.com/p/gradient-checkpointing-reduire-memoire-reseau-neurones</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/gradient-checkpointing-reduire-memoire-reseau-neurones</guid>
  <pubDate>Mon, 17 Aug 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-08-17T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="image"><img alt="Schéma montrant qu&#39;un réseau de neurones utilise la mémoire pour stocker les poids et pour les calculs forward et backward" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fbbe7ffb-d4d6-4403-b3f5-e272cf1f9294/_328-reseau-neurones-utilisation-memoire-poids-calculs.png.png?t=1786915214"/></div><p class="paragraph" style="text-align:left;">Les réseaux de neurones utilisent principalement la mémoire de deux façons :</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Quand ils stockent les poids du modèle (c&#39;est une utilisation mémoire fixe).</p></li><li><p class="paragraph" style="text-align:left;">Quand ils sont entraînés (c&#39;est dynamique). Cela se produit de deux façons :</p><ol start="1"><li><p class="paragraph" style="text-align:left;">Pendant le <b>forward pass</b>, lors du calcul et du stockage des activations de toutes les couches.</p></li><li><p class="paragraph" style="text-align:left;">Pendant le <b>backward pass</b>, lors du calcul des gradients à chaque couche.</p></li></ol></li></ol><p class="paragraph" style="text-align:left;">Cette seconde catégorie, l&#39;utilisation mémoire dynamique, nous empêche souvent d&#39;entraîner des modèles plus grands avec des batch sizes plus élevés.</p><div class="image"><img alt="Illustration comparant une grande batch size, non viable en mémoire, à une batch size petite ou intermédiaire, viable" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6343dc3f-11dd-4a75-8469-86efd3ec6bf8/_328-batch-size-grande-vs-petite-memoire.png.png?t=1786915254"/></div><p class="paragraph" style="text-align:left;">C&#39;est parce que l&#39;utilisation mémoire évolue proportionnellement à la taille du batch.</p><p class="paragraph" style="text-align:left;">Cela dit, il existe une technique assez incroyable qui permet d&#39;augmenter la batch size tout en maintenant l&#39;utilisation mémoire globale.</p><p class="paragraph" style="text-align:left;"><b>Elle s&#39;appelle le Gradient checkpointing</b>, et d&#39;après mon expérience, c&#39;est une technique largement sous-estimée pour réduire la surcharge mémoire des réseaux de neurones.</p><p class="paragraph" style="text-align:left;">Voyons ça plus en détail.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="comment-fonctionne-le-gradient-chec">Comment fonctionne le gradient checkpointing ?</h2><p class="paragraph" style="text-align:left;">Le gradient checkpointing repose sur deux observations clés sur le fonctionnement typique des réseaux de neurones :</p><ol start="1"><li><p class="paragraph" style="text-align:left;"><b>Les activations d&#39;une couche spécifique peuvent être calculées uniquement à partir des activations de la couche précédente.</b> Par exemple, dans l&#39;image ci-dessous, les activations de la &quot;Couche B&quot; peuvent être calculées uniquement à partir des activations de la &quot;Couche A&quot; :</p></li></ol><div class="image"><img alt="Schéma d&#39;un réseau de neurones montrant que les activations de la Couche B dépendent uniquement des activations de la Couche A" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/97184981-d0b9-44b1-acea-90c4b47a3d1d/_328-layer-b-activations-dependent-layer-a.png?t=1786915332"/><div class="image__source"><span class="image__source_text"><p>Forward pass</p></span></div></div><ol start="2"><li><p class="paragraph" style="text-align:left;"><b>La mise à jour des poids d&#39;une couche dépend uniquement de deux choses :</b></p><ol start="1"><li><p class="paragraph" style="text-align:left;">Les activations de cette couche.</p></li><li><p class="paragraph" style="text-align:left;">Les gradients calculés dans la couche suivante (à droite), ou plutôt les gradients en cours (running gradients).</p></li></ol></li></ol><div class="image"><img alt="Schéma montrant que la mise à jour de la Couche A dépend de ses activations et des gradients calculés dans la Couche B" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/223b7849-2856-4f33-a844-e0e7f5d07f08/_328-mise-a-jour-layer-a-activations-gradients.png?t=1786915403"/><div class="image__source"><span class="image__source_text"><p>Backward pass</p></span></div></div><p class="paragraph" style="text-align:left;">Le gradient checkpointing exploite ces deux observations pour optimiser l&#39;utilisation mémoire.</p><p class="paragraph" style="text-align:left;">Voici comment ça fonctionne :</p><p class="paragraph" style="text-align:left;"><b>Étape 1)</b> Diviser le réseau en segments avant le forward pass :</p><div class="image"><img alt="Schéma illustrant la division d&#39;un réseau de neurones en deux segments avant le forward pass, étape clé du gradient checkpointing" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/113e9b43-6a05-40f5-aac3-642f5247c156/_328-diviser-reseau-neurones-en-segments.png.png?t=1786915488"/></div><p class="paragraph" style="text-align:left;"><b>Étape 2)</b> Pendant le forward pass, ne stocker que les activations de la première couche de chaque segment. Le reste est supprimé une fois qu&#39;il a servi à calculer les activations de la couche suivante.</p><div class="image"><img alt="Schéma montrant comment seules les activations de la première couche de chaque segment sont stockées, le reste étant supprimé" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6d0e18b6-7e4a-4855-8099-5c922b7b7508/_328-stocker-activations-premiere-couche-segment.png.png?t=1786915549"/></div><p class="paragraph" style="text-align:left;"><b>Étape 3)</b> Vient ensuite la rétropropagation (backpropagation). Pour mettre à jour les poids d&#39;une couche, on a besoin de ses activations. On recalcule donc ces activations à partir de la première couche de ce segment.</p><p class="paragraph" style="text-align:left;">Par exemple, comme le montre l&#39;image ci-dessous, pour mettre à jour les poids des couches rouges, on recalcule leurs activations à partir des activations de la couche cyan, déjà disponibles en mémoire.</p><div class="image"><img alt="Schéma illustrant le recalcul des activations d&#39;un segment à partir de la couche précédente, uniquement si besoin" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4378b39d-be87-4543-9cbc-849ad259f512/_328-recalculer-activations-uniquement-si-necessaire.png.png?t=1786915662"/></div><p class="paragraph" style="text-align:left;">Voilà !</p><p class="paragraph" style="text-align:left;">C&#39;est ainsi que fonctionne le gradient checkpointing.</p><hr class="content_break"><p class="paragraph" style="text-align:left;"><b>Pour résumer, l&#39;idée est qu&#39;on n&#39;a pas besoin de stocker toutes les activations intermédiaires en mémoire.</b></p><p class="paragraph" style="text-align:left;">À la place, en stocker quelques-unes et recalculer le reste <b>uniquement quand c&#39;est nécessaire</b> permet de réduire significativement les besoins en mémoire.</p><p class="paragraph" style="text-align:left;">Et cette idée est assez intuitive.</p><p class="paragraph" style="text-align:left;">En fait, cela permet aussi d&#39;entraîner le réseau sur des batches de données plus grands.</p><p class="paragraph" style="text-align:left;">D&#39;après ce que j&#39;ai pu observer, le gradient checkpointing (GCP) permet généralement de réduire l&#39;utilisation mémoire d&#39;<b>au moins 50 à 60 %</b>, ce qui est énorme.</p><div class="image"><img alt="Graphique en barres comparant l&#39;utilisation mémoire d&#39;un réseau de neurones sans et avec gradient checkpointing (GCP)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/25684856-0e43-4f82-b28f-c2bed49930e2/_328-gradient-checkpointing-reduction-memoire-graphique.png.png?t=1786916200"/></div><p class="paragraph" style="text-align:left;">Bien sûr, comme certaines activations sont calculées deux fois, cela se fait au prix d&#39;un temps d&#39;exécution accru, généralement entre <b>15 et 25 %</b>.</p><p class="paragraph" style="text-align:left;">Il y a donc toujours un compromis entre mémoire et temps d&#39;exécution.</p><div class="image"><img alt="Illustration du compromis entre RAM économisée et temps d&#39;exécution accru avec le gradient checkpointing" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e681fc82-2122-4305-bdb6-19b25eeefd5f/_328-compromis-memoire-ram-temps-execution.png.png?t=1786916246"/></div><p class="paragraph" style="text-align:left;">Cela dit, un autre avantage est que ça permet d&#39;utiliser une batch size plus grande, ce qui peut légèrement (mais pas totalement) compenser cette augmentation du temps d&#39;exécution.</p><p class="paragraph" style="text-align:left;">Malgré tout, le gradient checkpointing reste une technique extrêmement puissante pour entraîner des modèles plus grands. Je l&#39;ai trouvée vraiment utile à plusieurs reprises, sans avoir à recourir à des techniques plus lourdes comme le distributed training, par exemple.</p><p class="paragraph" style="text-align:left;">Heureusement, le gradient checkpointing est aussi implémenté par de nombreux frameworks de deep learning open source comme PyTorch, entre autres.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="le-gradient-checkpointing-avec-py-t">Le gradient checkpointing avec PyTorch</h2><p class="paragraph" style="text-align:left;">Pour l&#39;utiliser, on commence par importer les bibliothèques et fonctions nécessaires :</p><div class="image"><img alt="checkpoint_sequential avec PyTorch Extrait de code Python montrant l&#39;import de la fonction checkpoint_sequential depuis torch.utils.checkpoint" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f5564606-0a0d-44ef-9ec1-17fa5aaefdb4/_328-pytorch-import-checkpoint-sequential-code.png?t=1786919793"/></div><p class="paragraph" style="text-align:left;">Ensuite, on définit notre réseau de neurones :</p><div class="image"><img alt="Extrait de code Python définissant un réseau SimpleNet et appliquant checkpoint_sequential dans la méthode forward" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/977f4226-18b8-4958-ae28-f3902e1aa2ba/_328-pytorch-simplenet-gradient-checkpointing-code.png.png?t=1786919846"/></div><p class="paragraph" style="text-align:left;">Comme montré ci-dessus, dans la méthode <code>forward</code>, on utilise la méthode <code>checkpoint_sequential</code> pour appliquer le gradient checkpointing et diviser le réseau en deux segments.</p><p class="paragraph" style="text-align:left;">Ensuite, on peut entraîner le réseau normalement, comme d&#39;habitude.</p><p class="paragraph" style="text-align:left;">Plutôt simple, non ?</p><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quelles sont tes techniques préférées pour optimiser l&#39;entraînement d&#39;un réseau de neurones ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=f4a50732-6150-43f1-bf37-23ac712b58fa&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>PyTorch n&#39;est pas fait pour la production (mais on peut arranger ça)</title>
  <description>🎯 Shot #327 - Découvre le script mode, la solution pour rendre tes modèles indépendants de Python.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/19d3f46e-df53-41fd-a083-553a0f131927/_327-pytorch-production.png" length="35558" type="image/png"/>
  <link>https://www.monshotdata.com/p/pytorch-production-python-script-mode</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/pytorch-production-python-script-mode</guid>
  <pubDate>Fri, 14 Aug 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-08-14T10:00:00Z</atom:published>
    <category><![CDATA[Deep Learning]]></category>
    <category><![CDATA[Shot Data]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">PyTorch a toujours été ma bibliothèque de référence pour construire des modèles de deep learning, grâce à sa flexibilité, son API Pythonic intuitive et sa facilité d&#39;utilisation.</p><p class="paragraph" style="text-align:left;">Cependant, déployer des modèles basés sur PyTorch dans des systèmes de production se heurte à de sérieuses limitations en matière de scalabilité et de performance, un point souvent négligé.</p><div class="image"><img alt="Schéma montrant PyTorch adapté au développement mais pas au déploiement, avec coche verte et croix rouge" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6b276e48-0123-4d69-ad8a-57ff59822b04/_327-pytorch-development-vs-deployment.png.png?t=1786692448"/></div><p class="paragraph" style="text-align:left;">Pour commencer, une contrainte majeure de PyTorch est sa dépendance quasi totale à Python.</p><div class="image"><img alt="Icône de modèles PyTorch reliée par une flèche &quot;Python centric&quot; au logo Python" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f95002af-c8f3-4a45-a02d-aab192b0c38b/_327-pytorch-models-python-centric.png?t=1786692471"/></div><p class="paragraph" style="text-align:left;">Si Python offre simplicité, polyvalence et lisibilité, il est aussi connu pour être relativement plus lent que d&#39;autres langages comme C++ ou Java.</p><div class="image"><img alt="Comparaison de vitesse entre Python, C++ et Java, Python présenté comme le plus lent des trois" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cd6082f5-b06c-437d-bad1-0f878c9db282/_327-comparaison-vitesse-python-cpp-java.png?t=1786692556"/></div><p class="paragraph" style="text-align:left;">Cela pose problème dans les scénarios où la faible latence et le haut débit sont essentiels, comme les applications et services en temps réel.</p><p class="paragraph" style="text-align:left;">D&#39;ailleurs, il est fort possible que le serveur sur lequel tu comptes déployer ton modèle utilise n&#39;importe quel autre langage que Python, comme C++, Java, et bien d&#39;autres.</p><div class="image"><img alt="Icône de serveur reliée par une flèche à des dossiers C++ et Java" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/1e97cee7-78ce-4539-a1b7-dafe826505ef/_327-serveur-cpp-java.png?t=1786692592"/></div><p class="paragraph" style="text-align:left;">Ainsi, les modèles que l&#39;on construit DOIVENT être portables vers différents environnements conçus pour gérer des requêtes concurrentes à grande échelle.</p><p class="paragraph" style="text-align:left;">Mais, comme évoqué plus haut, la nature Python-centrique des modèles PyTorch peut limiter leur intégration à ce type de systèmes ou de plateformes.</p><p class="paragraph" style="text-align:left;">Une solution simple et élégante consiste à développer tes modèles PyTorch en script mode, spécialement conçu pour les cas d&#39;usage en production.</p><p class="paragraph" style="text-align:left;">Dans PyTorch, le script mode désigne un ensemble d&#39;outils et de fonctionnalités qui permettent aux développeurs de faire tourner leurs modèles d&#39;une manière plus adaptée à la production.</p><div class="image"><img alt="Schéma du script mode transformant un modèle PyTorch couplé à Python en modèle indépendant du langage, exécutable en C++ ou en Java" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3c567e05-5e0c-4071-8fc6-03f8b39ce6d1/_327-script-mode-modele-agnostique-langage.png.png?t=1786692664"/></div><p class="paragraph" style="text-align:left;">Si tu es curieux d&#39;en savoir plus, j&#39;ai récemment publié un dossier complet sur le sujet : <i>Les modèles PyTorch ne sont pas faits pour le déploiement ! Boost-les avec TorchScript</i></p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/pytorch-torchscript-cpp-deploiement?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=pytorch-n-est-pas-fait-pour-la-production-mais-on-peut-arranger-ca" target="_blank"><div class="embed__content"><p class="embed__title"> Déployer PyTorch en C++ : Guide complet TorchScript & Production </p><p class="embed__description"> Apprends à convertir tes modèles PyTorch en TorchScript pour le déploiement C++. Élimine la dépendance Python et optimise l&#39;inférence en production. </p></div><img class="embed__image embed__image--right" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,quality=80,width=1200,onerror=redirect/uploads/asset/file/2e6bbfda-b050-4483-9b4d-13522f24dbb4/Mini-cours__18_-_PyTorch_n_est_pas_fait_pour_le_de%CC%81ploiement.png?t=1772986046"/></a></div><p class="paragraph" style="text-align:left;">Tu y apprendras comment rendre tes modèles PyTorch plus adaptés à la production et indépendants du langage.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Les compétences en déploiement sont absolument essentielles dans une carrière en data science et en machine learning.</p><p class="paragraph" style="text-align:left;">Le plus grand atout de PyTorch, c&#39;est sa simplicité et son design Pythonic.</p><p class="paragraph" style="text-align:left;">Mais cet atout introduit aussi une limite majeure au moment de déployer des modèles basés sur PyTorch.</p><p class="paragraph" style="text-align:left;">Apprendre à construire des modèles PyTorch en script mode fera une vraie différence dans ta carrière.</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=00ca5c8b-3b66-4b33-be81-f137120925ed&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Comment fonctionne vraiment le Dropout ?</title>
  <description>🎯 Shot #326 - Ce que 12 candidats ML n&#39;ont pas su me dire en entretien.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/86cf39eb-09d5-412e-a738-2d475bf54421/_326-fonctionnement-dropout.png" length="59737" type="image/png"/>
  <link>https://www.monshotdata.com/p/comment-fonctionne-vraiment-le-dropout</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/comment-fonctionne-vraiment-le-dropout</guid>
  <pubDate>Mon, 10 Aug 2026 08:30:00 +0000</pubDate>
  <atom:published>2026-08-10T08:30:00Z</atom:published>
    <category><![CDATA[Deep Learning]]></category>
    <category><![CDATA[Shot Data]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Il y a quelques semaines, une startup tech m&#39;a invité à mener leurs entretiens ML.</p><p class="paragraph" style="text-align:left;">J&#39;ai interviewé 12 candidats et je leur ai posé principalement des questions pratiques de ML.</p><p class="paragraph" style="text-align:left;">Mais il y avait aussi quelques questions conceptuelles, comme celle-ci, que j&#39;ai posée intentionnellement <b>à chaque candidat</b> :</p><ul><li><p class="paragraph" style="text-align:left;"><b>Comment fonctionne le Dropout ?</b></p></li></ul><p class="paragraph" style="text-align:left;">Plutôt simple, non ?</p><p class="paragraph" style="text-align:left;">Et pourtant, chaque candidat m&#39;a donné une réponse incomplète, que voici : </p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="rponse-des-candidats">Réponse des candidats</h2><p class="paragraph" style="text-align:left;"><i>En résumé, l&#39;idée est de mettre à zéro des neurones de façon aléatoire dans un réseau de neurones. Ça sert à régulariser le réseau.</i></p><div class="image"><img alt="Diagramme illustrant l&#39;effet du Dropout sur un réseau de neurones : avant et après application, avec les activations supprimées en noir." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/53e9b16c-7565-436c-9a21-e125d658e239/_326-dropout-effet-reseau-neurones.png.png?t=1786314287"/></div><p class="paragraph" style="text-align:left;"><i>Le Dropout n&#39;est appliqué que pendant l&#39;entraînement, et le choix des activations de neurones à mettre à zéro (ou à &quot;dropper&quot;) est déterminé à l&#39;aide d&#39;une loi de Bernoulli : </i></p><div class="image"><img alt="Schéma du processus de Bernoulli utilisé par le Dropout pour décider si une activation est conservée ou supprimée." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a9920e74-aa66-4b21-931b-2b5f20c052f4/_326-dropout-loi-bernoulli.png.png?t=1786314330"/><div class="image__source"><span class="image__source_text"><p>&quot;p&quot; est la probabilité de dropout spécifiée, <br>par exemple dans PyTorch → nn.Dropout(p).</p></span></div></div><hr class="content_break"><p class="paragraph" style="text-align:left;"><b>Ma question de relance :</b> Ok, parfait ! Est-ce qu&#39;on fait autre chose dans le Dropout ?</p><p class="paragraph" style="text-align:left;"><b>Les candidats :</b> Non, c&#39;est tout. On met juste des neurones à zéro et on entraîne le réseau normalement.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Revenons maintenant à ce Shot Data.</p><p class="paragraph" style="text-align:left;">Bien sûr, je ne dis pas que les détails ci-dessus sont faux.</p><p class="paragraph" style="text-align:left;">Ils sont corrects.</p><p class="paragraph" style="text-align:left;">Sauf que <b>ça ne représente que 50% du fonctionnement du Dropout</b>, et malheureusement, la plupart des ressources ne couvrent pas les 50% restants.</p><p class="paragraph" style="text-align:left;">Si toi aussi tu ne connaissais que les 50% que je viens de mentionner, continue à lire, il y a du nouveau pour toi.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="comment-fonctionne-rellement-le-dro">Comment fonctionne réellement le Dropout ?</h2><p class="paragraph" style="text-align:left;">Pour commencer, il faut noter que le Dropout n&#39;est appliqué que pendant l&#39;entraînement, pas pendant la phase d&#39;inférence ou d&#39;évaluation : </p><div class="image"><img alt="Comparaison entre la phase d&#39;entraînement, avec dropout actif, et la phase d&#39;inférence, sans dropout, dans un réseau de neurones." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/aff4af18-8bd1-44d2-8fcd-583083e246f4/_326-dropout-entrainement-vs-inference.png.png?t=1786314412"/></div><p class="paragraph" style="text-align:left;">Maintenant, imagine qu&#39;un neurone reçoive son entrée à partir de 100 neurones de la couche cachée précédente : </p><div class="image"><img alt="Illustration d&#39;un neurone recevant les entrées de 100 neurones de la couche précédente." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ecfc8ccd-75ff-4b83-9c9c-a726fd8f3ccf/_326-dropout-neurone-100-entrees.png.png?t=1786314455"/></div><p class="paragraph" style="text-align:left;">Pour simplifier, faisons deux hypothèses :</p><ul><li><p class="paragraph" style="text-align:left;">L&#39;activation de chaque neurone jaune est de 1.</p></li><li><p class="paragraph" style="text-align:left;">Le poids de chaque connexion entre les neurones jaunes et le neurone bleu est aussi de 1.</p></li></ul><div class="image"><img alt="Schéma montrant que l&#39;activation de chaque neurone jaune vaut 1 et que le poids de chaque connexion vaut aussi 1." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f3fab5f5-423b-4912-9269-2fa1419f96fb/_326-dropout-activations-poids-un.png.png?t=1786314511"/></div><p class="paragraph" style="text-align:left;">Résultat, l&#39;entrée reçue par le neurone bleu sera de 100, comme illustré ci-dessous : </p><div class="image"><img alt="Calcul de l&#39;entrée du neurone bleu : somme de 100 termes valant chacun 1×1." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/b78fb70f-604a-420b-b822-fa2698d6a7fa/_326-dropout-somme-100-entrees.png.png?t=1786314555"/></div><p class="paragraph" style="text-align:left;">Jusque-là tout va bien ?</p><p class="paragraph" style="text-align:left;">Maintenant, pendant l&#39;entraînement, si on utilisait le Dropout avec, disons, un taux de 40%, alors environ 40% des activations des neurones jaunes seraient mises à zéro.</p><p class="paragraph" style="text-align:left;">Résultat, l&#39;entrée reçue par le neurone bleu serait d&#39;environ 60, comme illustré ci-dessous : </p><div class="image"><img alt="Calcul de l&#39;entrée du neurone bleu après dropout : environ 40 termes sont mis à zéro, ce qui donne une somme totale d&#39;environ 60." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f51dbf9e-efe5-4ff3-814e-5ab5411a4e20/_326-dropout-somme-apres-dropout-60.png.png?t=1786314602"/></div><p class="paragraph" style="text-align:left;">Cela dit, ce dernier point n&#39;est valable que pour la phase d&#39;entraînement.</p><p class="paragraph" style="text-align:left;">Si le même scénario se produisait pendant la phase d&#39;inférence, l&#39;entrée reçue par le neurone bleu serait de 100.</p><p class="paragraph" style="text-align:left;">Donc, dans des conditions similaires :</p><ul><li><p class="paragraph" style="text-align:left;">Entrée reçue pendant l&#39;entraînement → 60.</p></li><li><p class="paragraph" style="text-align:left;">Entrée reçue pendant l&#39;inférence → 100.</p></li></ul><p class="paragraph" style="text-align:left;">Tu vois le problème ?</p><p class="paragraph" style="text-align:left;"><b>Pendant l&#39;entraînement, la moyenne des entrées des neurones est nettement plus faible que celle reçue pendant l&#39;inférence.</b></p><div class="image"><img alt="Comparaison des entrées reçues par le neurone bleu : 100 en phase d&#39;inférence, sans dropout, contre 60 en phase d&#39;entraînement, avec dropout." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/774ede5f-523c-49ee-84ba-afb58fa20914/_326-dropout-comparaison-100-vs-60.png.png?t=1786314640"/></div><p class="paragraph" style="text-align:left;">Plus formellement, l&#39;utilisation du Dropout affecte significativement l&#39;échelle des activations.</p><p class="paragraph" style="text-align:left;">Or, on veut que les neurones du modèle reçoivent, tout au long du réseau, à peu près la même moyenne (ou espérance) d&#39;activations pendant l&#39;entraînement et pendant l&#39;inférence.</p><p class="paragraph" style="text-align:left;"><b>Pour corriger ça, le Dropout effectue une étape supplémentaire.</b></p><p class="paragraph" style="text-align:left;">L&#39;idée est de <b>mettre à l&#39;échelle les entrées restantes actives</b> pendant l&#39;entraînement.</p><p class="paragraph" style="text-align:left;">La façon la plus simple de faire ça est de multiplier toutes les activations pendant l&#39;entraînement par un facteur <code>1/(1-p)</code>, où <code>p</code> est le taux de dropout.</p><p class="paragraph" style="text-align:left;">Par exemple, en appliquant cette technique à l&#39;entrée de neurone de 60, on obtient ce qui suit (rappel, on avait fixé <code>p=40%</code>) : </p><div class="image"><img alt="Formule montrant comment la mise à l&#39;échelle par 1/(1-p) ramène l&#39;entrée du neurone de 60 à 100." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/c4934494-fb30-4459-af79-eecd5d294e21/_326-dropout-mise-a-lechelle-formule.png.png?t=1786314678"/></div><p class="paragraph" style="text-align:left;">Comme illustré ci-dessus, la mise à l&#39;échelle de l&#39;entrée du neurone la ramène dans la plage souhaitée, ce qui rend les phases d&#39;entraînement et d&#39;inférence cohérentes pour le réseau.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="vrification-exprimentale">Vérification expérimentale</h2><p class="paragraph" style="text-align:left;">On peut d&#39;ailleurs vérifier que les implémentations classiques du Dropout, celle de PyTorch par exemple, effectuent bien cette étape.</p><p class="paragraph" style="text-align:left;">Définissons une couche de dropout comme suit : </p><div class="image"><img alt="Extrait de code PyTorch définissant une couche de dropout avec un taux p=0.2." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/7682761a-b732-4333-8233-aac2c7756879/_326-dropout-code-definition-couche.png.png?t=1786314723"/></div><p class="paragraph" style="text-align:left;">Maintenant, prenons un tenseur aléatoire et appliquons cette couche de dropout dessus : </p><div class="image"><img alt="Extrait de code PyTorch montrant qu&#39;après application du dropout en mode entraînement, les valeurs conservées sont mises à l&#39;échelle et augmentent." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9ac1ae12-4080-4a5b-b162-443c7f3811f3/_326-dropout-code-valeurs-augmentees.png.png?t=1786314787"/></div><p class="paragraph" style="text-align:left;">Comme illustré ci-dessus, les valeurs conservées ont augmenté.</p><ul><li><p class="paragraph" style="text-align:left;">La deuxième valeur passe de 0.13 → 0.16.</p></li><li><p class="paragraph" style="text-align:left;">La troisième valeur passe de 0.93 → 1.16.</p></li><li><p class="paragraph" style="text-align:left;">et ainsi de suite…</p></li></ul><p class="paragraph" style="text-align:left;">Mieux encore, les valeurs conservées sont exactement les mêmes que celles qu&#39;on aurait obtenues en mettant explicitement le tenseur d&#39;entrée à l&#39;échelle avec <code>1/(1-p)</code> : </p><div class="image"><img alt="Comparaison montrant que les valeurs obtenues avec le dropout correspondent exactement à celles obtenues en divisant manuellement par (1-p)." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/72818a73-e392-4164-98a7-cadf4add2363/_326-dropout-code-memes-valeurs.png.png?t=1786314821"/></div><p class="paragraph" style="text-align:left;">Si on faisait la même chose en mode évaluation, on remarque qu&#39;aucune valeur n&#39;est supprimée et qu&#39;aucune mise à l&#39;échelle n&#39;a lieu non plus, ce qui est logique puisque le Dropout n&#39;est utilisé que pendant l&#39;entraînement : </p><div class="image"><img alt="Extrait de code PyTorch montrant qu&#39;en mode évaluation, le dropout n&#39;affecte plus les valeurs du tenseur." class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ad59faf9-fe27-44a1-86a7-5479c1101999/_326-dropout-code-mode-evaluation.png.png?t=1786314871"/></div><hr class="content_break"><p class="paragraph" style="text-align:left;">Voilà les 50% restants, que, d&#39;après mon expérience, la plupart des ressources ne couvrent pas, et que la plupart des gens ignorent donc.</p><p class="paragraph" style="text-align:left;">Mais c&#39;est une étape vraiment importante dans le Dropout, qui maintient la cohérence numérique entre les phases d&#39;entraînement et d&#39;inférence.</p><p class="paragraph" style="text-align:left;">Avec ça, tu connais maintenant 100% du fonctionnement du Dropout.</p><p class="paragraph" style="text-align:left;"><b>👉 À toi de jouer :</b> quelles sont les autres façons de régulariser un réseau de neurones ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=70025c9b-670a-47d7-9dd5-f898f8d9ae0b&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>La face cachée de la régularisation L2</title>
  <description>🎯 Shot #325 - Comment elle élimine la multicolinéarité et donne son nom à la ridge regression.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/50d5c888-460a-4221-8e90-b762b6e787da/_325-regularisation-L2.png" length="123228" type="image/png"/>
  <link>https://www.monshotdata.com/p/l2-regularization-avantage-cache-multicollinearite</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/l2-regularization-avantage-cache-multicollinearite</guid>
  <pubDate>Mon, 03 Aug 2026 09:00:00 +0000</pubDate>
  <atom:published>2026-08-03T09:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Machine Learning]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Quasi tous les tutoriels, cours ou articles de blog parlant de la régularisation L2 que j&#39;ai pu voir n&#39;abordent qu&#39;une seule chose : </p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><hr class="content_break"><p class="paragraph" style="text-align:left;">Bien sûr, ces affirmations sont tout à fait correctes, et je ne le nie absolument pas.</p><p class="paragraph" style="text-align:left;">D&#39;ailleurs, on peut le vérifier avec le schéma ci-dessous :</p><div class="image"><img alt="Comparaison des frontières de décision selon la valeur du paramètre de régularisation λ sur 5 datasets" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/751613b7-b069-4202-b23c-b67a6435736b/_325-regularisation-l2-frontieres-decision-lambda.png.png?t=1785711006"/></div><p class="paragraph" style="text-align:left;">Sur l&#39;image ci-dessus, plus on se déplace vers la droite, plus le paramètre de régularisation augmente, et le modèle crée une frontière de décision plus simple sur les 5 datasets.</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Revenons à notre sujet…</p><p class="paragraph" style="text-align:left;">Ce qui me déçoit le plus, c&#39;est que la plupart des ressources ne mentionnent pas que <b>la régularisation L2 est un excellent remède contre la multicolinéarité</b>.</p><p class="paragraph" style="text-align:left;">La multicolinéarité apparaît quand deux (ou plusieurs) features sont fortement corrélées, OU quand deux (ou plusieurs) features permettent de prédire une autre feature :</p><div class="image"><img alt="Illustration de la multicolinéarité entre featureA, featureB et featureC" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/dc9e0ac9-ca77-454f-af5c-06116640538e/_325-multicollinearite-featurea-featureb-featurec.png.png?t=1785711093"/></div><p class="paragraph" style="text-align:left;">Quand on utilise la régularisation L2 dans une régression linéaire, l&#39;algorithme est aussi appelé <b>Ridge regression</b>. </p><div class="image"><img alt="Formule de la ridge regression : somme des carrés des résidus plus la pénalité L2" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3a075f87-19a2-46c4-b268-39daa6191e21/_325-formule-ridge-regression.png.png?t=1785711211"/></div><p class="paragraph" style="text-align:left;">Mais comment la régularisation L2 élimine-t-elle la multicolinéarité ?</p><p class="paragraph" style="text-align:left;">Aujourd&#39;hui, je vais te donner une intuition démonstrative sur ce sujet, qui expliquera aussi <b>pourquoi la &quot;ridge regression&quot; porte ce nom</b>.</p><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="dataset-factice">Dataset factice</h2><p class="paragraph" style="text-align:left;">Pour la démonstration, prenons ce dataset factice à deux features :</p><div class="image"><img alt="Capture de code montrant la création d&#39;un dataset factice avec featureB fortement corrélée à featureA" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e38ec8eb-905a-428a-b698-4a6cbf1cb177/_325-code-dataset-factice-featurea-featureb.png.png?t=1785711263"/></div><p class="paragraph" style="text-align:left;">Comme montré ci-dessus, on a volontairement rendu featureB fortement corrélée à featureA. Cela nous donne un dataset factice avec lequel travailler.</p><div class="blockquote"><blockquote class="blockquote__quote"></blockquote></div><hr class="content_break"><h2 class="heading" style="text-align:left;" id="rgression-linaire-sans-pnalit-l-2">Régression linéaire sans pénalité L2</h2><p class="paragraph" style="text-align:left;">Lors de la modélisation par régression, l&#39;objectif est de déterminer les paramètres spécifiques <code>(θ₁, θ₂)</code> qui minimisent la somme des carrés des résidus (<code>RSS</code>) :</p><div class="image"><img alt="Formule de la somme des carrés des résidus (RSS) à minimiser" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f94e1e68-fcea-43f9-99f0-d2c7f7692c82/_325-formule-rss-sans-l2.png.png?t=1785711305"/></div><p class="paragraph" style="text-align:left;">Voici ce qu&#39;on va faire :</p><p class="paragraph" style="text-align:left;">On va tracer la valeur du RSS pour de nombreuses combinaisons différentes de paramètres <code>(θ₁, θ₂)</code>. Cela va créer un graphique 3D :</p><ul><li><p class="paragraph" style="text-align:left;">axe x → <code>θ₁</code></p></li><li><p class="paragraph" style="text-align:left;">axe y → <code>θ₂</code></p></li><li><p class="paragraph" style="text-align:left;">axe z → valeur du <code>RSS</code></p></li></ul><p class="paragraph" style="text-align:left;">Ensuite, on va examiner visuellement ce graphique pour repérer les paramètres spécifiques <code>(θ₁, θ₂)</code> qui minimisent la valeur du <code>RSS</code>.</p><p class="paragraph" style="text-align:left;">Allons-y.</p><p class="paragraph" style="text-align:left;">Sans la pénalité L2, on obtient le graphique suivant (<i>c&#39;est le même graphique, mais vu sous différents angles</i>) :</p><div class="image"><img alt="Graphique 3D du RSS sans régularisation L2, montrant une vallée" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f6d28534-f1bc-4a83-b1c2-ed1e9d4e2a50/_325-graphique-rss-vallee-sans-l2.png.png?t=1785711382"/></div><p class="paragraph" style="text-align:left;">Tu as remarqué quelque chose ?</p><p class="paragraph" style="text-align:left;">Le graphique 3D présente une vallée. Il existe plusieurs combinaisons de valeurs de paramètres <code>(θ₁, θ₂)</code> pour lesquelles le <code>RSS</code> est minimal.</p><p class="paragraph" style="text-align:left;"><b>Il est donc impossible d&#39;obtenir une valeur unique pour les paramètres </b><code>(θ₁, θ₂)</code><b> qui minimisent le </b><code>RSS</code><b>.</b></p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="rgression-linaire-avec-pnalit-l-2">Régression linéaire avec pénalité L2</h2><p class="paragraph" style="text-align:left;">Quand on utilise une pénalité L2, l&#39;objectif est de minimiser l&#39;expression suivante :</p><div class="image"><img alt="Formule de la somme des carrés des résidus additionnée de la pénalité L2" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a8b43b42-34d2-4afb-8651-3370b43c9559/_325-formule-rss-avec-l2.png.png?t=1785711433"/></div><p class="paragraph" style="text-align:left;">En traçant à nouveau le même graphique que précédemment, on obtient ceci :</p><div class="image"><img alt="Graphique 3D du RSS avec régularisation L2, sans vallée" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3aa31ec6-d5fb-404e-9ff6-afb384d7aec9/_325-graphique-rss-sans-vallee-avec-l2.png.png?t=1785711482"/></div><p class="paragraph" style="text-align:left;">Tu remarques quelque chose de différent cette fois-ci ?</p><p class="paragraph" style="text-align:left;">Comme le montre l&#39;image ci-dessus, l&#39;utilisation de la régularisation L2 supprime la vallée qu&#39;on avait observée plus tôt et donne un minimum global à l&#39;erreur RSS.</p><p class="paragraph" style="text-align:left;"><b>Il est désormais possible d&#39;obtenir une valeur unique pour les paramètres </b><code>(θ₁, θ₂)</code><b> qui minimise le </b><code>RSS</code><b>.</b></p><p class="paragraph" style="text-align:left;">Comme par magie, la régularisation L2 nous a permis d&#39;éliminer la multicolinéarité.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="pourquoi-le-nom-ridge-regression">Pourquoi le nom &quot;ridge regression&quot; ?</h2><p class="paragraph" style="text-align:left;">C&#39;est d&#39;ailleurs de là que vient le nom &quot;ridge regression&quot; : elle élimine la crête (&quot;ridge&quot;) présente dans la <b>fonction de vraisemblance</b> quand on applique la pénalité L2.</p><div class="image"><img alt="Comparaison visuelle entre une vallée et une crête en montagne" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/12c4d2a2-1517-4799-b37f-a876bb3518f1/_325-comparaison-vallee-crete-montagne.png.png?t=1785711522"/></div><p class="paragraph" style="text-align:left;">Bien sûr, dans les démonstrations qu&#39;on vient de voir, on a observé une vallée, pas une crête.</p><p class="paragraph" style="text-align:left;">Cependant, dans ce cas, on considérait la somme des carrés des résidus, une grandeur qu&#39;on minimise pour obtenir les paramètres optimaux.</p><p class="paragraph" style="text-align:left;">La fonction d&#39;erreur donne donc logiquement une vallée.</p><p class="paragraph" style="text-align:left;">Si on utilisait plutôt la vraisemblance, une grandeur qu&#39;on cherche à maximiser, cela inverserait (en quelque sorte) le graphique et donnerait une crête à la place :</p><div class="image"><img alt="Transformation du graphique RSS (vallée) en fonction de vraisemblance (crête)" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/66aebc68-60a5-4092-ac1a-bad16c15ae88/_325-conversion-vallee-crete-vraisemblance.png.png?t=1785711559"/></div><p class="paragraph" style="text-align:left;">Apparemment, c&#39;est la fonction de vraisemblance qui a été prise en compte au moment de nommer l&#39;algorithme.</p><p class="paragraph" style="text-align:left;">Et c&#39;est pour ça qu&#39;on l&#39;a appelé &quot;ridge regression&quot;.</p><p class="paragraph" style="text-align:left;">Plutôt cool, non ?</p><p class="paragraph" style="text-align:left;">Quand j&#39;ai découvert ça il y a quelques années, je n&#39;avais littéralement aucune idée qu&#39;on avait réfléchi aussi profondément avant de nommer la ridge regression.</p><p class="paragraph" style="text-align:left;">J&#39;espère que tu as appris quelque chose de nouveau aujourd&#39;hui :)</p><p class="paragraph" style="text-align:left;">Si tu veux en savoir plus sur l&#39;origine probabiliste de la régularisation L2, jette un œil à cet article : </p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/regularisation-probabilites?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=la-face-cachee-de-la-regularisation-l2" target="_blank"><div class="embed__content"><p class="embed__title"> Découvrir la Régularisation par les Probabilités </p><p class="embed__description"> Découvre comment éviter le surapprentissage en machine learning grâce à la régularisation par probabilités et techniques MLE pour des modèles performants et généralisables. </p></div><img class="embed__image embed__image--right" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/6e2c3741-5f38-4ecf-9407-4ffe5e5eb0b8/Mini-cours__6_-_De%CC%81couvrir_la_Re%CC%81gularisation_par_les_Probabilite%CC%81s.png?t=1772986383"/></a></div><hr class="content_break"><p class="paragraph" style="text-align:left;">👉 À toi de jouer : quels sont, selon toi, d&#39;autres avantages de la régularisation L2 ?</p><hr class="content_break"></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=c551a9a3-7dff-4e42-840e-ce37c2d0c540&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Python ne respecte pas vraiment l&#39;encapsulation en POO</title>
  <description>🎯 Shot #324 - Ce que tout développeur Python doit absolument savoir sur public, protégé et privé.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/464a23f3-d16b-4f62-af34-e3dacef672c8/_324-python-encapsulation-convention-developpeur.png.png" length="200879" type="image/png"/>
  <link>https://www.monshotdata.com/p/python-encapsulation-poo</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/python-encapsulation-poo</guid>
  <pubDate>Tue, 28 Jul 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-07-28T10:00:00Z</atom:published>
    <category><![CDATA[Shot Data]]></category>
    <category><![CDATA[Python]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">Utiliser des modificateurs d&#39;accès (public, protégé et privé) est fondamental pour l&#39;encapsulation en POO.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/942fd984-6cf7-4bbd-afd3-8482bd0d1c52/_324-python-encapsulation-public-protege-prive.png.png?t=1785228562"/></div><p class="paragraph" style="text-align:left;">Ce n&#39;est pas propre à Python, c&#39;est valable pour la POO en général.</p><p class="paragraph" style="text-align:left;">Mais quand on parle spécifiquement de Python, on remarque qu&#39;il ne propose pas de véritables mécanismes d&#39;encapsulation, ceux-là mêmes qu&#39;on voudrait pourtant exploiter dans son code orienté objet.</p><p class="paragraph" style="text-align:left;">Comment ça ?</p><p class="paragraph" style="text-align:left;">Voyons ça ensemble aujourd&#39;hui !</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Comme tu le sais peut-être déjà, les attributs de classe en POO peuvent être de trois types :</p><ul><li><p class="paragraph" style="text-align:left;">Un <b>membre public</b> est accessible partout, à l&#39;intérieur comme à l&#39;extérieur de la classe de base, et il est hérité par toutes les classes enfants.</p></li><li><p class="paragraph" style="text-align:left;">Un <b>membre protégé</b> est accessible partout dans la classe de base et ses classe(s) enfant(s). Il n&#39;est pas accessible en dehors de la classe.</p></li><li><p class="paragraph" style="text-align:left;">Un <b>membre privé</b> n&#39;est accessible qu&#39;à l&#39;intérieur de la classe de base.</p></li></ul><p class="paragraph" style="text-align:left;">Mais avec Python, il n&#39;existe aucune contrainte stricte de ce type. C&#39;est différent de nombreux autres langages, comme le C++.</p><p class="paragraph" style="text-align:left;">Ainsi, les membres protégés se comportent exactement comme des membres publics.</p><p class="paragraph" style="text-align:left;">Et ce n&#39;est pas tout, les membres privés peuvent eux aussi (d&#39;une certaine manière) être accédés depuis l&#39;extérieur de la classe.</p><p class="paragraph" style="text-align:left;">Pour mieux comprendre, regarde l&#39;implémentation de classe suivante :</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8e6559ab-d288-4e05-b734-cafe36b5c0f4/_324-python-encapsulation-code-declarat.png.png?t=1785228596"/></div><p class="paragraph" style="text-align:left;">D&#39;un point de vue syntaxique, en Python :</p><ul><li><p class="paragraph" style="text-align:left;">Un <b>membre public</b> se déclare <b>sans underscore</b> au début.</p></li><li><p class="paragraph" style="text-align:left;">Un <b>membre protégé</b> se déclare avec <b>1 underscore</b> au début.</p></li><li><p class="paragraph" style="text-align:left;">Un <b>membre privé</b> se déclare avec <b>2 underscores</b> au début.</p></li></ul><p class="paragraph" style="text-align:left;">Ensuite, on instancie un objet de la classe :</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d8e1d877-48e8-473c-8f6e-1882b2bf768d/_324-python-encapsulation-instanciation-objet.png.png?t=1785228621"/></div><p class="paragraph" style="text-align:left;">Comme on peut s&#39;y attendre, l&#39;attribut public est accessible depuis l&#39;extérieur de la classe :</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/3f5f9b02-70e5-4bc2-9042-905cae8c1079/_324-python-encapsulation-attribut-public-accessible.png.png?t=1785228644"/></div><p class="paragraph" style="text-align:left;">Cependant, de la même façon, même l&#39;attribut protégé est accessible depuis l&#39;extérieur de la classe, ce qui, en théorie, ne devrait pas arriver :</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/36d4f456-5da6-421a-a4fe-ebc6f70b320d/_324-python-encapsulation-attribut-protege-accessible.png.png?t=1785228679"/></div><p class="paragraph" style="text-align:left;">Enfin, quand on déclare des membres privés, Python effectue ce qu&#39;on appelle le <i>name mangling</i>.</p><p class="paragraph" style="text-align:left;">C&#39;est une technique utilisée en programmation pour éviter les conflits de noms entre différentes classes.</p><p class="paragraph" style="text-align:left;">Python réalise ce name mangling en ajoutant le nom de la classe précédé d&#39;un underscore (<code>_MyClass</code>) devant tous les membres qui commencent par deux underscores.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9856b1c4-08bb-46d3-b89f-1a9a594e4a5f/_324-python-encapsulation-name-mangling-schema.png.png?t=1785228702"/></div><p class="paragraph" style="text-align:left;">Ainsi, même si le membre privé n&#39;est pas directement accessible avec son nom d&#39;origine, il reste accessible avec le nom modifié obtenu grâce au name mangling.</p><p class="paragraph" style="text-align:left;">C&#39;est ce que montre l&#39;exemple suivant :</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4d4643a6-e010-4f56-9250-cc0d5296d3f0/_324-python-encapsulation-name-mangling-exemple.png.png?t=1785228723"/></div><p class="paragraph" style="text-align:left;">Comme le montrent tous les exemples ci-dessus, les membres protégés et les membres privés (grâce au name mangling) peuvent être accédés comme des membres publics.</p><p class="paragraph" style="text-align:left;">Le point essentiel à retenir pour tout développeur Python qui utilise la POO, c&#39;est que Python n&#39;impose jamais l&#39;encapsulation.</p><p class="paragraph" style="text-align:left;"><b>En réalité, exploiter les mécanismes d&#39;encapsulation en Python repose surtout sur des conventions.</b></p><p class="paragraph" style="text-align:left;">Elles servent à communiquer aux autres développeurs les règles d&#39;accessibilité des membres d&#39;une classe.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/464a23f3-d16b-4f62-af34-e3dacef672c8/_324-python-encapsulation-convention-developpeur.png.png?t=1785228742"/></div><p class="paragraph" style="text-align:left;">C&#39;est donc à chaque développeur de respecter ces conventions.</p><p class="paragraph" style="text-align:left;">Voici un guide complet sur la POO en Python si tu veux approfondir le sujet : </p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/poo-python-data-scientists-partie1?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=python-ne-respecte-pas-vraiment-l-encapsulation-en-poo" target="_blank"><div class="embed__content"><p class="embed__title"> Programmation orientée objet avec Python pour les data scientists (Partie 1) </p><p class="embed__description"> Apprends la programmation orientée objet en Python : classes, objets, méthodes magiques et héritage, appliqués aux pipelines data pour data scientists. </p></div><img class="embed__image embed__image--right" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/6d251a3f-b8eb-4ac5-98f5-8a30850be514/Mini-cours__15_-_Programmation_oriente%CC%81e_objet_avec_Python_pour_les_data_scientists.png?t=1772986035"/></a></div><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/poo-python-data-scientists-partie2?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=python-ne-respecte-pas-vraiment-l-encapsulation-en-poo" target="_blank"><img class="embed__image embed__image--left" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/ea3c7186-f04b-4433-b550-86ff28efc9d8/Mini-cours__16_-_Code10.png?t=1772986036"/><div class="embed__content"><p class="embed__title"> Programmation orientée objet avec Python pour les data scientists (Partie 2) </p><p class="embed__description"> Approfondis la POO en Python : polymorphisme, encapsulation, classes avancées et optimisation pour des modèles de machine learning robustes. </p></div></a></div><p class="paragraph" style="text-align:left;">👉 <b>À toi de jouer :</b> quels sont les autres points de vigilance à connaître dans la POO en Python ?</p><hr class="content_break"><p class="paragraph" style="text-align:left;">Prêt à passer au niveau supérieur ?</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=64c1a82c-6b78-4da5-bc46-44378ecd267a&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Maîtriser l&#39;entraînement multi-GPU : DataParallel, DDP et learning rate</title>
  <description>👀​ Mini-cours #36 - La mécanique complète derrière la distribution de l&#39;entraînement sur plusieurs GPU, pour scaler tes modèles sans mauvaises surprises.</description>
      <enclosure url="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/5acc2555-842c-4ac6-801b-8eedb13b4a1f/Mini-cours_36-Entrainement-multi-GPU.png" length="67571" type="image/png"/>
  <link>https://www.monshotdata.com/p/entrainement-multi-gpu-pytorch-dataparallel-ddp</link>
  <guid isPermaLink="true">https://www.monshotdata.com/p/entrainement-multi-gpu-pytorch-dataparallel-ddp</guid>
  <pubDate>Wed, 22 Jul 2026 10:00:00 +0000</pubDate>
  <atom:published>2026-07-22T10:00:00Z</atom:published>
    <category><![CDATA[Deep Learning]]></category>
    <category><![CDATA[Scaling &amp; Calcul Distribué]]></category>
    <category><![CDATA[Pro]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#f0f7ef; }
  .bh__table_header p { color: #153c4f; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><div class="section" style="background-color:#f2eafe;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;"><span style="text-decoration:underline;"><b>Psst... Contenu Exclusif Réservé aux Membres !</b></span><br><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Ce mini-cours fait partie de notre espace premium. Rejoins dès maintenant le </span><b>Cercle des Experts</b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;"> pour débloquer l’intégralité de nos ressources, analyses approfondies et guides pratiques.</span><br><b>👉 </b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">Clique ici pour découvrir les avantages et t’inscrire : </span><b><a class="link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=maitriser-l-entrainement-multi-gpu-dataparallel-ddp-et-learning-rate" target="_blank" rel="noopener noreferrer nofollow" style="color: #2563eb">Page d’adhésion</a></b><span style="color:#3f3f46;font-family:__Figtree_2ca027, __Figtree_Fallback_2ca027, ui-sans-serif, system-ui, sans-serif, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, &quot;Noto Color Emoji&quot;;font-size:16px;">.</span></p></div><div class="section" style="background-color:transparent;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;"><span style="color:#222222;font-family:Poppins, Helvetica, sans-serif, serif, EmojiFont;font-size:16px;">⏱️ </span><i><b>Temps de lecture</b></i><i> : environ 35 minutes</i></p></div><p class="paragraph" style="text-align:left;">Dans le dossier consacré à PyTorch Lightning, on n&#39;avait pas abordé l&#39;entraînement multi-GPU. </p><p class="paragraph" style="text-align:left;">Je t&#39;avais prévenu que le sujet demandait des bases supplémentaires : comment ça fonctionne sous le capot, quelles stratégies existent, comment plusieurs GPU restent synchronisés entre eux pendant l&#39;entraînement en environnement distribué, les points de vigilance à avoir, et bien plus encore.</p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/pytorch-lightning-guide-complet?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=maitriser-l-entrainement-multi-gpu-dataparallel-ddp-et-learning-rate" target="_blank"><div class="embed__content"><p class="embed__title"> PyTorch Lightning : guide complet pour débuter </p><p class="embed__description"> Apprends à utiliser PyTorch Lightning pour simplifier l&#39;entraînement de tes modèles deep learning : callbacks, métriques, précision mixte et profiling. </p></div><img class="embed__image embed__image--right" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/571757f7-f067-4ce1-a5bc-899051c54603/Mini-cours__30_-_PyTorch_Lightning___PyTorch_booste%CC%81.png?t=1778253798"/></a></div><p class="paragraph" style="text-align:left;">Aujourd&#39;hui, on reprend ce fil. Direction les rouages techniques de l&#39;entraînement multi-GPU : comment ça marche en interne, et les détails propres à l&#39;implémentation.</p><p class="paragraph" style="text-align:left;">On va aussi passer en revue les points de vigilance essentiels pour l&#39;entraînement multi-GPU (ou distribué). Mal gérés, ils peuvent entraîner des performances sous-optimales, un entraînement plus lent, voire une instabilité pendant l&#39;entraînement.</p><p class="paragraph" style="text-align:left;">C&#39;est parti !</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="pourquoi-passer-au-multi-gpu">Pourquoi passer au multi-GPU</h2><p class="paragraph" style="text-align:left;">Par défaut, les modèles de deep learning construits avec PyTorch ne s&#39;entraînent que sur un seul GPU, même si plusieurs GPU sont disponibles.</p><div class="image"><img alt="Schéma montrant PyTorch qui n&#39;utilise qu&#39;un seul GPU actif, les GPU environnants restant inactifs" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/79ebae4c-a3cb-45fd-8a90-15917eebab0a/Mini-cours_36-multi-gpu-01-un-seul-gpu-actif.png.png?t=1784620109"/></div><p class="paragraph" style="text-align:left;">Cela ne veut pas dire qu&#39;on ne peut pas faire de l&#39;entraînement multi-GPU avec PyTorch, bien au contraire. Mais ça demande de mobiliser explicitement les capacités de traitement parallèle de PyTorch.</p><p class="paragraph" style="text-align:left;">De plus, même en exploitant plusieurs GPU avec PyTorch, les procédures d&#39;entraînement classiques restent limitées à une seule machine. Cette limitation vient du comportement par défaut de PyTorch, qui utilise une seule machine pour l&#39;entraînement du modèle.</p><div class="image"><img alt="Schéma illustrant qu&#39;un modèle PyTorch s&#39;entraîne par défaut sur une seule machine" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/9e685fb2-0f43-485b-8b40-c26aa79c4e61/Mini-cours_36-multi-gpu-02-pytorch-machine-unique.png.png?t=1784620223"/></div><p class="paragraph" style="text-align:left;">Ça devient donc un goulot d&#39;étranglement sévère dès qu&#39;on travaille avec des datasets volumineux qui demandent plus de puissance de calcul qu&#39;une seule machine ne peut en fournir.</p><p class="paragraph" style="text-align:left;">Mais réaliser qu&#39;on est limité à une seule machine pour l&#39;entraînement, c&#39;est aussi réaliser qu&#39;il reste une marge importante d&#39;optimisation du temps d&#39;exécution.</p><div class="image"><img alt="Schéma illustrant le passage d&#39;un modèle PyTorch à un entraînement distribué sur plusieurs machines" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/e3da6001-8cd5-48b6-bb1e-b0c1ae484912/Mini-cours_36-multi-gpu-03-scaler-plusieurs-machines.png.png?t=1784620335"/></div><p class="paragraph" style="text-align:left;">L&#39;entraînement multi-GPU résout ce problème.</p><p class="paragraph" style="text-align:left;">En résumé (et comme son nom l&#39;indique), l&#39;entraînement multi-GPU permet de répartir la charge de travail de l&#39;entraînement sur plusieurs GPU, voire sur plusieurs machines si nécessaire.</p><p class="paragraph" style="text-align:left;">Ça réduit considérablement le temps d&#39;entraînement pour les gros datasets et les modèles complexes, en exploitant la puissance de calcul combinée du matériel disponible.</p><p class="paragraph" style="text-align:left;">Il existe plusieurs façons (stratégies) de faire du multi-GPU, mais l&#39;une des plus courantes consiste à laisser chaque GPU ou chaque machine traiter une portion des données d&#39;entrée de façon <b>indépendante</b>.</p><p class="paragraph" style="text-align:left;">C&#39;est ce qu&#39;on appelle le parallélisme de données (data parallelism).</p><div class="section" style="background-color:#e0f2f9;border-radius:8px;margin:0.0px 0.0px 0.0px 0.0px;padding:10.0px 10.0px 10.0px 10.0px;"><p class="paragraph" style="text-align:left;">💡 En plus du parallélisme de données, d&#39;autres stratégies comme le parallélisme de modèle (model parallelism), le parallélisme de pipeline (pipeline parallelism) et le parallélisme hybride permettent aussi de faire du multi-GPU. Chacune a ses avantages et ses inconvénients, et le choix dépend des besoins spécifiques du modèle et du matériel disponible. On en reparle brièvement en fin de dossier.</p></div><h2 class="heading" style="text-align:left;" id="le-paralllisme-de-donnes">Le parallélisme de données</h2><p class="paragraph" style="text-align:left;">Dans le parallélisme de données, l&#39;idée consiste à diviser les données disponibles en petits batches, chaque batch étant traité par un GPU distinct.</p><div class="image"><img alt="Schéma du parallélisme de données : le dataset complet est divisé en batches traités par plusieurs GPU puis agrégés en un modèle mis à jour" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d2939064-d85f-40b4-a501-aa5522b45c98/Mini-cours_36-multi-gpu-04-parallelisme-donnees-schema.png.png?t=1784620423"/></div><p class="paragraph" style="text-align:left;">À la fin, les mises à jour de chaque GPU sont agrégées et utilisées pour mettre à jour les paramètres du modèle.</p><p class="paragraph" style="text-align:left;">Si tu te souviens du dossier sur l&#39;apprentissage fédéré (federated learning), l&#39;idée va te sembler familière :</p><div class="image"><img alt="Animation illustrant l&#39;apprentissage fédéré, avec un serveur central échangeant des modèles globaux et mis à jour avec plusieurs devices en entraînement local" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/62e45dea-0cfe-4353-8527-141e0e51c45c/Mini-cours_36-multi-gpu-05-apprentissage-federe.gif?t=1784620498"/></div><p class="paragraph" style="text-align:left;">En apprentissage fédéré, au lieu d&#39;avoir un seul serveur centralisé qui traite toutes les données, le modèle s&#39;entraîne sur plusieurs devices en périphérie décentralisés, chacun avec ses propres données. Les mises à jour de ces devices sont ensuite agrégées pour améliorer le modèle global.</p><p class="paragraph" style="text-align:left;">De la même façon, en parallélisme de données, chaque GPU joue le rôle d&#39;un &quot;mini-serveur&quot; : il traite une portion des données et met à jour les paramètres du modèle localement.</p><p class="paragraph" style="text-align:left;">Ces mises à jour locales sont ensuite combinées pour mettre à jour le modèle global. Ce traitement parallèle des données accélère non seulement l&#39;entraînement, mais permet aussi une utilisation efficace des ressources en environnement distribué.</p><p class="paragraph" style="text-align:left;">Une différence majeure : en apprentissage fédéré, on n&#39;a pas d&#39;accès direct au dataset local, alors qu&#39;en parallélisme de données, les données sont directement accessibles.</p><div class="embed"><a class="embed__url" href="https://www.monshotdata.com/p/guide-pratique-apprentissage-federe?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=maitriser-l-entrainement-multi-gpu-dataparallel-ddp-et-learning-rate" target="_blank"><div class="embed__content"><p class="embed__title"> Apprentissage Fédéré : Le Guide pour une IA Privée et Performante </p><p class="embed__description"> Ne centralise plus tes données. Découvre comment implémenter l&#39;apprentissage fédéré pour entraîner des modèles sur des données réelles (non-IID) tout en garantissant la confidentialité. </p></div><img class="embed__image embed__image--right" src="https://beehiiv-images-production.s3.amazonaws.com/uploads/asset/file/fa20e8e5-e2aa-4906-8a6b-8da7bbef4a51/Mini-cours__23_-_Couverture_Apprentissage_Fe%CC%81de%CC%81re%CC%81.png.png?t=1773228544"/></a></div><p class="paragraph" style="text-align:left;">Cela dit, il est assez évident que cette approche améliore non seulement l&#39;efficacité de l&#39;entraînement, mais permet aussi de scaler l&#39;entraînement pour gérer des datasets plus volumineux et des modèles plus complexes que ce qu&#39;un seul GPU ou une seule machine pourrait gérer.</p><hr class="content_break"><h2 class="heading" style="text-align:left;" id="les-stratgies-de-paralllisme-de-don">Les stratégies de parallélisme de données</h2><p class="paragraph" style="text-align:left;">Comme on vient de le voir, le <b>parallélisme de données</b> est une technique qui consiste à paralléliser l&#39;entraînement d&#39;un modèle en répartissant les données sur plusieurs devices (GPU ou machines), puis en combinant les résultats.</p><p class="paragraph" style="text-align:left;">Assez intuitivement, cette approche réduit considérablement le temps d&#39;entraînement des gros modèles et des gros datasets, en exploitant la puissance de calcul combinée de plusieurs devices.</p><p class="paragraph" style="text-align:left;">Il existe principalement deux approches pour faire du parallélisme de données.</p><h3 class="heading" style="text-align:left;" id="1-data-parallel-dp">#1) DataParallel (DP)</h3><h4 class="heading" style="text-align:left;" id="comment-a-marche">Comment ça marche ?</h4><p class="paragraph" style="text-align:left;">DataParallel implémente le parallélisme de données au niveau du module, sur une seule machine disposant de plusieurs GPU.</p><p class="paragraph" style="text-align:left;">En PyTorch (ou PyTorch Lightning), un &quot;module&quot; désigne l&#39;ensemble du modèle de réseau de neurones.</p><p class="paragraph" style="text-align:left;">Donc quand on parle de &quot;parallélisme de données au niveau du module&quot;, ça veut dire que la parallélisation s&#39;applique à tout le module du réseau de neurones, y compris tous ses paramètres et toutes ses opérations.</p><p class="paragraph" style="text-align:left;">Par exemple, si tu as un modèle de deep learning avec plusieurs couches, le parallélisme de données au niveau du module consiste à répliquer ce modèle entier sur plusieurs GPU.</p><div class="image"><img alt="Schéma montrant la réplication d&#39;un modèle sur plusieurs GPU dans la stratégie DataParallel" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4ee61eb3-f2fb-4999-b7cf-d3b210417e47/Mini-cours_36-multi-gpu-06-dataparallel-replication-modele.png.png?t=1784620600"/></div><p class="paragraph" style="text-align:left;">Chaque réplique du modèle traite ensuite une portion des données d&#39;entrée de façon indépendante, et les mises à jour reçues de chaque réplique sont ensuite combinées pour mettre à jour les paramètres du modèle.</p><p class="paragraph" style="text-align:left;">Concrètement, la stratégie DataParallel fonctionne ainsi :</p><ul><li><p class="paragraph" style="text-align:left;">Répliquer le modèle sur tous les GPU.</p></li><li><p class="paragraph" style="text-align:left;">Exécuter le forward pass sur le sous-ensemble de données reçu par chaque GPU, et renvoyer les <b>outputs</b> (pas les gradients) à la machine centrale.</p></li></ul><div class="image"><img alt="Schéma montrant chaque GPU traitant son batch de données et produisant ses outputs dans la stratégie DataParallel" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6b422de4-5840-4797-9e94-00f493429c2c/Mini-cours_36-multi-gpu-07-dataparallel-forward-pass.png.png?t=1784620697"/></div><ul><li><p class="paragraph" style="text-align:left;">Une fois les outputs reçus, la machine centrale calcule les gradients :</p></li></ul><div class="image"><img alt="Schéma montrant la machine centrale recevant les outputs de chaque GPU et calculant les gradients" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2db91860-922d-4254-9df0-27b912e23cb0/Mini-cours_36-multi-gpu-08-dataparallel-calcul-gradients.png.png?t=1784620799"/></div><ul><li><p class="paragraph" style="text-align:left;">Enfin, les gradients sont communiqués en retour à chaque GPU pour mettre à jour les répliques individuelles du modèle :</p></li></ul><div class="image"><img alt="Schéma montrant la machine centrale communiquant les gradients calculés à chaque réplique du modèle" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/911ebb43-afb5-4990-a50d-babdd3a73717/Mini-cours_36-multi-gpu-09-dataparallel-communication-updates.png?t=1784620874"/></div><hr class="content_break"><div class="section" style="background-color:#1B3A6B;border-color:#F7931E;border-radius:8px;border-style:solid;border-width:3px;margin:0.0px 0.0px 0.0px 0.0px;padding:0.0px 0.0px 0.0px 0.0px;"><p class="paragraph" style="text-align:left;">💡<span style="color:#F9FAFB;"> En continuant, tu vas découvrir : </span></p><ul><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Le code PyTorch Lightning pas à pas pour lancer un entraînement multi-GPU, et pourquoi une partie de ce code ne fonctionne plus sur les versions récentes</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Les limites concrètes de DataParallel qui expliquent sa disparition de Lightning</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Comment DistributedDataParallel synchronise les GPU sans faire exploser la mémoire</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">La règle de mise à l&#39;échelle du learning rate (Linear Scaling Rule) et pourquoi l&#39;ignorer peut instabiliser ton entraînement</span></p></li><li><p class="paragraph" style="text-align:left;"><span style="color:#F9FAFB;">Les autres stratégies de parallélisme (modèle, tenseurs) pour aller plus loin</span></p></li></ul></div><div class="paywall"><hr class="paywall__break"/><div class="paywall__content"><h2 class="paywall__header"> La suite de ce mini-cours est réservée aux membres du Cercle des Experts. </h2><p class="paywall__description"> Tu as déjà le début. Pour accéder à l’explication complète et à tous les contenus avancés, rejoins le Cercle des Experts dès maintenant. </p><p class="paywall__links"><a class="paywall__upgrade_link" href="https://www.monshotdata.com/upgrade?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=maitriser-l-entrainement-multi-gpu-dataparallel-ddp-et-learning-rate">Rejoindre le Cercle des Experts</a> Translation missing: en.app.shared.conjuction.or <a class="paywall__login_link" href="https://www.monshotdata.com/login?utm_source=www.monshotdata.com&utm_medium=newsletter&utm_campaign=maitriser-l-entrainement-multi-gpu-dataparallel-ddp-et-learning-rate">Sign In</a></p><div class="paywall__upsell"><div class="paywall__upsell_header"><h3> En devenant membre, tu débloques </h3></div><ul class="paywall__upsell_features"><li class="paywall__upsell_feature"> L’intégralité de ce mini-cours (sans coupure) </li><li class="paywall__upsell_feature"> Tous les mini-cours archivés et les ressources associées </li><li class="paywall__upsell_feature"> 1 nouveau mini-cours chaque semaine pour progresser en continu </li></ul></div></div></div></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2F1f7580ca-bca1-4bd0-ad17-425e1778d89f%2FMonCoachData-10.png%3Fv%3D1791602201&publication_name=Mon+Shot+de+Data+Science&utm_campaign=a84ddd74-6870-4dae-a6aa-a645dffc3e3e&utm_medium=post_rss&utm_source=mon_shot_de_data_science">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

  </channel>
</rss>
