<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Machine learning avec Python : le fil de l&apos;histoire - Blog IA Engineering</title>
    <link>https://clement-reboul.fr/fils/machine-learning-avec-python/</link>
    <description>Les épisodes du fil de l&apos;histoire « Machine learning avec Python », du Blog IA Engineering.</description>
    <language>fr-FR</language>
    <lastBuildDate>Thu, 05 Nov 2026 15:42:26 GMT</lastBuildDate>
    <atom:link href="https://clement-reboul.fr/fils/machine-learning-avec-python/feed.xml" rel="self" type="application/rss+xml" />
    <copyright>© 2025 Clément Reboul</copyright>
    <category>Technology</category>
    <category>Artificial Intelligence</category>
    <category>Machine Learning</category>
    <item>
      <title><![CDATA[Guide pratique : Classification avec la Régression Logistique]]></title>
      <link>https://clement-reboul.fr/blog/guide-pratique-classification-avec-la-regression-logistique/</link>
      <guid isPermaLink="true">https://clement-reboul.fr/blog/guide-pratique-classification-avec-la-regression-logistique/</guid>
      <description><![CDATA[Que faire si on veut classer des éléments dans des catégories plutôt que prédire un chiffre ?
Exemple : Déterminer si un email est un SPAM ou non, si une transaction est frauduleuse, si une tumeur est maligne...

C'est là qu'intervient la Classification !]]></description>
      <content:encoded><![CDATA[<h2>Régression vs Classification</h2>
<h3>Différence fondamentale</h3>
<table>
<thead>
<tr>
<th>Type</th>
<th>Objectif</th>
<th>Sortie</th>
<th>Exemple</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Régression</strong></td>
<td>Prédire un nombre</td>
<td>Valeur continue (n&#39;importe quel chiffre)</td>
<td>Prix : 250 000€</td>
</tr>
<tr>
<td><strong>Classification</strong></td>
<td>Classer dans une catégorie</td>
<td>Catégorie discrète (étiquette)</td>
<td>Spam : OUI ou NON</td>
</tr>
</tbody></table>
<p><strong>Analogie</strong> :</p>
<ul>
<li><strong>Régression</strong> = Donner une note sur 100 à un devoir</li>
<li><strong>Classification</strong> = Dire si l&#39;élève a réussi (A/B/C/D/F)</li>
</ul>
<hr>
<h2>Les Types de Classification</h2>
<h3>Classification Binaire ⚪⚫</h3>
<p><strong>Définition</strong> : Seulement <strong>2 catégories</strong> possibles.</p>
<p><strong>Exemples</strong> :</p>
<ul>
<li>Transaction : Fraude / Normale</li>
<li>Email : Spam / Légitime</li>
<li>Tumeur : Maligne / Bénigne</li>
<li>Diagnostic : Malade / Sain</li>
</ul>
<p><strong>Représentation</strong> : 0 ou 1, Vrai ou Faux, Oui ou Non</p>
<h3>Classification Multiclasse 🔴🔵🟢</h3>
<p><strong>Définition</strong> : Plus de <strong>2 catégories</strong> différentes.</p>
<p><strong>Exemples</strong> :</p>
<ul>
<li>Classifier des photos : Chien / Chat / Oiseau</li>
<li>Note d&#39;un film : ⭐ / ⭐⭐ / ⭐⭐⭐ / ⭐⭐⭐⭐ / ⭐⭐⭐⭐⭐</li>
<li>Type de fleur : Iris / Rose / Tulipe</li>
</ul>
<h3>Classification Multilabel 🏷️🏷️</h3>
<p><strong>Définition</strong> : Un objet peut appartenir à <strong>plusieurs catégories simultanément</strong>.</p>
<p><strong>Exemples</strong> :</p>
<ul>
<li>Film : &quot;Action&quot; ET &quot;Comédie&quot; ET &quot;Science-Fiction&quot;</li>
<li>Article de presse : &quot;Politique&quot; ET &quot;Économie&quot;</li>
<li>Maladie : Un patient peut avoir plusieurs pathologies</li>
</ul>
<h3>Catégories Ordinales vs Nominales</h3>
<p><strong>Ordinales</strong> : Il existe un <strong>ordre</strong> entre les catégories</p>
<ul>
<li>Mauvais &lt; Moyen &lt; Bon &lt; Excellent</li>
<li>Petite &lt; Moyenne &lt; Grande taille</li>
</ul>
<p><strong>Nominales</strong> : <strong>Pas d&#39;ordre</strong> naturel</p>
<ul>
<li>Couleurs : Rouge, Bleu, Vert</li>
<li>Pays : France, Japon, Brésil</li>
</ul>
<hr>
<h2>La Régression Logistique : Le Pont entre Régression et Classification</h2>
<h3>Pourquoi &quot;Régression&quot; pour faire de la &quot;Classification&quot; ? 🤔</h3>
<p>Le nom est trompeur ! La régression logistique <strong>utilise</strong> une régression pour <strong>faire</strong> de la classification.</p>
<h3>Le Processus en 3 Étapes</h3>
<h4>Étape 1 : Régression Linéaire Classique</h4>
<p>On commence comme avec la régression linéaire :</p>
<pre><code>y = a × x₁ + b × x₂ + c × x₃ + d
</code></pre>
<p><strong>Problème</strong> : <code>y</code> peut être <strong>n&#39;importe quel nombre</strong> (-∞ à +∞)</p>
<ul>
<li>Si y = 150 → Que faire ?</li>
<li>Si y = -50 → Ça n&#39;a pas de sens pour une catégorie !</li>
</ul>
<h4>Étape 2 : Fonction Logistique (Sigmoïde)</h4>
<p>On applique la <strong>fonction sigmoïde</strong> pour transformer <code>y</code> en probabilité <code>z</code> :</p>
<pre><code>z = 1 / (1 + e^(-y))
</code></pre>
<p><strong>Résultat</strong> : <code>z</code> est <strong>toujours entre 0 et 1</strong> → c&#39;est une <strong>probabilité</strong> !</p>
<p><strong>Graphique de la fonction sigmoïde</strong> :</p>
<pre><code>  1 |         ________
    |        /
z   |       /
    |      /
  0 |_____/____________
      -∞   0   +∞
           y
</code></pre>
<p><strong>Propriétés magiques</strong> :</p>
<ul>
<li>Si y = -∞ → z ≈ 0 (impossible)</li>
<li>Si y = 0 → z = 0.5 (50% de chances)</li>
<li>Si y = +∞ → z ≈ 1 (certain)</li>
</ul>
<h4>Étape 3 : Seuil de Classification</h4>
<p>On transforme la probabilité en décision ferme :</p>
<pre><code class="language-python">if z &gt;= 0.5:
    prédiction = 1  # Classe Positive
else:
    prédiction = 0  # Classe Négative
</code></pre>
<p><strong>Exemple concret</strong> :</p>
<ul>
<li>Probabilité de spam = 0.78 (78%) → <strong>SPAM</strong> ✅</li>
<li>Probabilité de spam = 0.23 (23%) → <strong>LÉGITIME</strong> ✅</li>
</ul>
<hr>
<h2>Évaluer la Performance : L&#39;Exactitude</h2>
<h3>L&#39;Exactitude (Accuracy)</h3>
<p><strong>C&#39;est quoi ?</strong> Le pourcentage de prédictions correctes.</p>
<p><strong>Formule</strong> :</p>
<pre><code>Exactitude = Nombre de bonnes prédictions / Nombre total de prédictions
</code></pre>
<p><strong>Exemple</strong> :</p>
<ul>
<li>100 emails testés</li>
<li>95 bien classés (spam ou légitime)</li>
<li><strong>Exactitude = 95%</strong> 🎉</li>
</ul>
<h3>Le Paradoxe de l&#39;Exactitude 😱</h3>
<p><strong>Problème</strong> : L&#39;exactitude peut être <strong>trompeuse</strong> !</p>
<p><strong>Exemple de la Fraude Bancaire</strong> :</p>
<ul>
<li>Dans 100 transactions, seulement <strong>1 est frauduleuse</strong> (1%)</li>
<li>Un modèle stupide qui dit <strong>TOUJOURS &quot;Pas de fraude&quot;</strong> aura :<ul>
<li>99 bonnes prédictions (les 99 légitimes)</li>
<li>1 erreur (la fraude non détectée)</li>
<li><strong>Exactitude = 99%</strong> 😮</li>
</ul>
</li>
</ul>
<p><strong>Conclusion</strong> : Ce modèle est <strong>inutile</strong> car il ne détecte <strong>aucune fraude</strong>, mais il a un score &quot;excellent&quot; !</p>
<p>C&#39;est pourquoi on a besoin d&#39;outils plus fins...</p>
<hr>
<h2>La Matrice de Confusion : Le Détective des Erreurs</h2>
<h3>Qu&#39;est-ce que c&#39;est ?</h3>
<p>Un tableau 2×2 qui croise <strong>Réalité</strong> vs <strong>Prédiction</strong> pour voir les 4 résultats possibles.</p>
<h3>Les 4 Résultats Possibles</h3>
<table>
<thead>
<tr>
<th></th>
<th><strong>Prédiction : Positif</strong></th>
<th><strong>Prédiction : Négatif</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>Réalité : Positif</strong></td>
<td>✅ <strong>Vrai Positif (TP)</strong></td>
<td>❌ <strong>Faux Négatif (FN)</strong></td>
</tr>
<tr>
<td><strong>Réalité : Négatif</strong></td>
<td>❌ <strong>Faux Positif (FP)</strong></td>
<td>✅ <strong>Vrai Négatif (TN)</strong></td>
</tr>
</tbody></table>
<h3>Explications avec Exemples</h3>
<h4>✅ Vrai Positif (TP - True Positive)</h4>
<ul>
<li><strong>Réalité</strong> : Malade</li>
<li><strong>Prédiction</strong> : Malade</li>
<li><strong>Résultat</strong> : Bien détecté ! 👍</li>
</ul>
<h4>✅ Vrai Négatif (TN - True Negative)</h4>
<ul>
<li><strong>Réalité</strong> : Sain</li>
<li><strong>Prédiction</strong> : Sain</li>
<li><strong>Résultat</strong> : Bien ignoré ! 👍</li>
</ul>
<h4>❌ Faux Positif (FP - False Positive)</h4>
<ul>
<li><strong>Réalité</strong> : Sain</li>
<li><strong>Prédiction</strong> : Malade</li>
<li><strong>Résultat</strong> : <strong>Fausse alerte</strong> ! 🚨 (Alarme inutile)</li>
</ul>
<p><strong>Exemple</strong> : Email légitime envoyé dans les spams</p>
<h4>❌ Faux Négatif (FN - False Negative)</h4>
<ul>
<li><strong>Réalité</strong> : Malade</li>
<li><strong>Prédiction</strong> : Sain</li>
<li><strong>Résultat</strong> : <strong>Cas manqué</strong> ! 😰 (Danger non détecté)</li>
</ul>
<p><strong>Exemple</strong> : Maladie non diagnostiquée</p>
<h3>Quelle est l&#39;Erreur la Plus Grave ? 🚨</h3>
<p><strong>Dans le contexte médical</strong> : Le <strong>Faux Négatif (FN)</strong> est <strong>catastrophique</strong> !</p>
<ul>
<li>Le patient est malade mais le modèle dit qu&#39;il est sain</li>
<li>La maladie n&#39;est pas traitée → Conséquences potentiellement <strong>fatales</strong></li>
</ul>
<p><strong>Dans le contexte du spam</strong> : Le <strong>Faux Positif (FP)</strong> est plus gênant</p>
<ul>
<li>Un email important est classé comme spam</li>
<li>Risque de manquer une information cruciale</li>
</ul>
<hr>
<h2>Le Rappel (Recall) : Ne Rien Manquer</h2>
<h3>Définition</h3>
<p>Le <strong>Rappel</strong> mesure la capacité du modèle à <strong>détecter tous les cas positifs</strong>.</p>
<p><strong>Question clé</strong> : Parmi tous les malades réels, combien ai-je détectés ?</p>
<h3>Formule</h3>
<pre><code>Rappel = TP / (TP + FN)
</code></pre>
<p><strong>Décryptage du dénominateur</strong> :</p>
<ul>
<li><code>TP</code> = Vrais Positifs (bien détectés)</li>
<li><code>FN</code> = Faux Négatifs (malades manqués)</li>
<li><code>TP + FN</code> = <strong>TOUS les cas réellement positifs</strong> dans les données</li>
</ul>
<h3>Exemple Concret</h3>
<p><strong>Contexte</strong> : Détection de cancer, 100 patients, 20 sont malades</p>
<table>
<thead>
<tr>
<th>Résultat</th>
<th>Nombre</th>
</tr>
</thead>
<tbody><tr>
<td>Vrais Positifs (TP)</td>
<td>18 (détectés)</td>
</tr>
<tr>
<td>Faux Négatifs (FN)</td>
<td>2 (manqués)</td>
</tr>
<tr>
<td>Total de malades réels</td>
<td>20</td>
</tr>
</tbody></table>
<p><strong>Calcul</strong> :</p>
<pre><code>Rappel = 18 / (18 + 2) = 18 / 20 = 0.90 = 90%
</code></pre>
<p><strong>Interprétation</strong> : Le modèle détecte <strong>90% des malades</strong>, mais en manque <strong>10%</strong> (2 personnes).</p>
<h3>Quand privilégier le Rappel ?</h3>
<p>✅ <strong>Situations critiques</strong> où manquer un cas est <strong>dangereux</strong> :</p>
<ul>
<li>Détection de maladies graves</li>
<li>Détection de fraudes financières</li>
<li>Détection d&#39;intrusions informatiques</li>
<li>Contrôle qualité (défauts de fabrication)</li>
</ul>
<p><strong>Objectif</strong> : <strong>NE RIEN MANQUER</strong>, même si ça génère des fausses alertes.</p>
<hr>
<h2>La Précision (Precision) : Éviter les Fausses Alertes</h2>
<h3>Définition</h3>
<p>La <strong>Précision</strong> mesure la <strong>fiabilité</strong> des alertes du modèle.</p>
<p><strong>Question clé</strong> : Parmi toutes mes alertes positives, combien étaient vraies ?</p>
<h3>Formule</h3>
<pre><code>Précision = TP / (TP + FP)
</code></pre>
<p><strong>Décryptage du dénominateur</strong> :</p>
<ul>
<li><code>TP</code> = Vrais Positifs (alertes correctes)</li>
<li><code>FP</code> = Faux Positifs (fausses alertes)</li>
<li><code>TP + FP</code> = <strong>TOUTES les fois où le modèle a dit &quot;Positif&quot;</strong></li>
</ul>
<h3>Exemple Concret</h3>
<p><strong>Contexte</strong> : Filtre anti-spam, 1000 emails</p>
<table>
<thead>
<tr>
<th>Résultat</th>
<th>Nombre</th>
</tr>
</thead>
<tbody><tr>
<td>Vrais Positifs (TP)</td>
<td>180 (vrais spams détectés)</td>
</tr>
<tr>
<td>Faux Positifs (FP)</td>
<td>20 (emails légitimes classés spam)</td>
</tr>
<tr>
<td>Total d&#39;alertes spam</td>
<td>200</td>
</tr>
</tbody></table>
<p><strong>Calcul</strong> :</p>
<pre><code>Précision = 180 / (180 + 20) = 180 / 200 = 0.90 = 90%
</code></pre>
<p><strong>Interprétation</strong> : Quand le filtre dit &quot;SPAM&quot;, il a raison <strong>90% du temps</strong>, mais se trompe <strong>10% du temps</strong> (20 emails légitimes perdus).</p>
<h3>Quand privilégier la Précision ?</h3>
<p>✅ <strong>Situations où les fausses alertes sont coûteuses</strong> :</p>
<ul>
<li>Filtre anti-spam (ne pas perdre d&#39;emails importants)</li>
<li>Système de recommandation (ne pas recommander n&#39;importe quoi)</li>
<li>Publicité ciblée (ne pas gaspiller le budget sur les mauvaises cibles)</li>
</ul>
<p><strong>Objectif</strong> : <strong>Être SÛR de ses alertes</strong>, même si on en rate quelques-unes.</p>
<hr>
<h2>Le Compromis Précision / Rappel</h2>
<h3>Le Dilemme</h3>
<p><strong>Problème</strong> : On ne peut pas maximiser les deux en même temps ! 😰</p>
<h3>Scénario 1 : Modèle Ultra-Prudent (Précision Élevée)</h3>
<p><strong>Comportement</strong> : Le modèle ne dit &quot;Positif&quot; que quand il est <strong>TRÈS SÛR</strong>.</p>
<p><strong>Conséquences</strong> :</p>
<ul>
<li>✅ <strong>Précision élevée</strong> : Peu de fausses alertes (FP↓)</li>
<li>❌ <strong>Rappel faible</strong> : Beaucoup de cas manqués (FN↑)</li>
</ul>
<p><strong>Analogie</strong> : Un détecteur de fumée qui ne sonne que si la maison est en flammes</p>
<ul>
<li>Pas de fausses alarmes ✅</li>
<li>Mais il rate les petits débuts d&#39;incendie ❌</li>
</ul>
<h3>Scénario 2 : Modèle Ultra-Sensible (Rappel Élevé)</h3>
<p><strong>Comportement</strong> : Le modèle dit &quot;Positif&quot; au moindre <strong>doute</strong>.</p>
<p><strong>Conséquences</strong> :</p>
<ul>
<li>✅ <strong>Rappel élevé</strong> : Peu de cas manqués (FN↓)</li>
<li>❌ <strong>Précision faible</strong> : Beaucoup de fausses alertes (FP↑)</li>
</ul>
<p><strong>Analogie</strong> : Un détecteur de fumée ultra-sensible</p>
<ul>
<li>Il détecte tout ✅</li>
<li>Mais il sonne pour un toast brûlé ❌</li>
</ul>
<h3>Le Rôle du Seuil de Classification</h3>
<p><strong>Rappel</strong> : On transforme la probabilité en décision avec un seuil (par défaut 0.5).</p>
<pre><code class="language-python">if probabilité &gt;= seuil:
    prédiction = Positif
else:
    prédiction = Négatif
</code></pre>
<h4>Baisser le Seuil (ex: 0.3)</h4>
<pre><code class="language-python">if probabilité &gt;= 0.3:  # Plus facile de dire &quot;Positif&quot;
    prédiction = Positif
</code></pre>
<p><strong>Effet</strong> :</p>
<ul>
<li>📈 <strong>Rappel augmente</strong> (on détecte plus de positifs)</li>
<li>📉 <strong>Précision diminue</strong> (plus de fausses alertes)</li>
</ul>
<h4>Augmenter le Seuil (ex: 0.7)</h4>
<pre><code class="language-python">if probabilité &gt;= 0.7:  # Plus difficile de dire &quot;Positif&quot;
    prédiction = Positif
</code></pre>
<p><strong>Effet</strong> :</p>
<ul>
<li>📉 <strong>Rappel diminue</strong> (on manque plus de positifs)</li>
<li>📈 <strong>Précision augmente</strong> (moins de fausses alertes)</li>
</ul>
<h3>Tableau Récapitulatif (Détection Cancer du Sein)</h3>
<table>
<thead>
<tr>
<th>Seuil</th>
<th>Précision</th>
<th>Rappel</th>
<th>Interprétation</th>
</tr>
</thead>
<tbody><tr>
<td>0.3</td>
<td>92.86%</td>
<td><strong>98.32%</strong></td>
<td>Modèle sensible : détecte presque tout, quelques fausses alertes</td>
</tr>
<tr>
<td>0.5</td>
<td>95.00%</td>
<td>96.00%</td>
<td>Équilibré</td>
</tr>
<tr>
<td>0.7</td>
<td><strong>96.58%</strong></td>
<td>94.96%</td>
<td>Modèle prudent : alertes très fiables, rate quelques cas</td>
</tr>
</tbody></table>
<hr>
<h2>La Courbe ROC et l&#39;AUC : Vue Globale</h2>
<h3>Problème</h3>
<p>Comment évaluer un modèle <strong>indépendamment du seuil</strong> choisi ?</p>
<h3>La Courbe ROC (Receiver Operating Characteristic)</h3>
<p><strong>Principe</strong> : Tracer le graphique du Rappel vs Taux de Faux Positifs pour <strong>tous les seuils possibles</strong>.</p>
<p><img src="https://support.minitab.com/fr-fr/minitab/media/generated-content/images/bctree_example_ROC.PNG" alt="Courbe ROC"></p>
<p><strong>Axes</strong> :</p>
<ul>
<li><strong>Axe Y</strong> : TPR (True Positive Rate) = Rappel = TP / (TP + FN)</li>
<li><strong>Axe X</strong> : FPR (False Positive Rate) = FP / (FP + TN)</li>
</ul>
<pre><code>  1 |    📈
    |   /|
TPR |  / |   ← Courbe du modèle
    | /  |
  0 |/_____|_____
    0    0.5    1
         FPR
</code></pre>
<h3>Interprétation de la Courbe</h3>
<h4>Modèle Aléatoire (AUC = 0.5)</h4>
<pre><code>  1 |
    |    /
TPR |   /    ← Diagonale = Tirage au sort
    |  /
  0 |/_________
    0         1
       FPR
</code></pre>
<p><strong>Signification</strong> : Le modèle est <strong>aussi bon qu&#39;une pièce de monnaie</strong> 🪙</p>
<ul>
<li>Performance équivalente au hasard</li>
<li><strong>Inutile</strong> !</li>
</ul>
<h4>Modèle Parfait (AUC = 1.0)</h4>
<pre><code>  1 |_____
    |    |
TPR |    |    ← Coin supérieur gauche
    |    |
  0 |____|_____
    0         1
       FPR
</code></pre>
<p><strong>Signification</strong> :</p>
<ul>
<li>TPR = 100% (tous les positifs détectés)</li>
<li>FPR = 0% (aucune fausse alerte)</li>
<li><strong>Modèle idéal</strong> ! 🏆</li>
</ul>
<h4>Modèle Réaliste (AUC = 0.85)</h4>
<pre><code>  1 |    ___
    |   /  |
TPR |  /   |
    | /    |
  0 |/_____|___
    0         1
       FPR
</code></pre>
<p><strong>Signification</strong> : Bon modèle, mais pas parfait</p>
<ul>
<li>Compromis entre détection et fausses alertes</li>
</ul>
<h3>L&#39;AUC (Area Under the Curve)</h3>
<p><strong>Définition</strong> : La <strong>surface sous la courbe ROC</strong>.</p>
<p><strong>Échelle d&#39;interprétation</strong> :</p>
<table>
<thead>
<tr>
<th>AUC</th>
<th>Qualité du Modèle</th>
<th>Interprétation</th>
</tr>
</thead>
<tbody><tr>
<td>0.5</td>
<td>💀 Aléatoire</td>
<td>Aussi bon qu&#39;une pièce</td>
</tr>
<tr>
<td>0.6-0.7</td>
<td>😐 Faible</td>
<td>Peu fiable</td>
</tr>
<tr>
<td>0.7-0.8</td>
<td>👍 Acceptable</td>
<td>Utilisable</td>
</tr>
<tr>
<td>0.8-0.9</td>
<td>🎯 Bon</td>
<td>Très performant</td>
</tr>
<tr>
<td>0.9-1.0</td>
<td>🏆 Excellent</td>
<td>Modèle de production</td>
</tr>
<tr>
<td>1.0</td>
<td>🦄 Parfait</td>
<td>Probablement surapprentissage !</td>
</tr>
</tbody></table>
<p><strong>Avantage</strong> : Métrique <strong>unique</strong> qui résume la performance sur <strong>tous les seuils</strong>.</p>
<hr>
<h2>Résumé : Quand Utiliser Quelle Métrique ?</h2>
<h3>Tableau de Décision</h3>
<table>
<thead>
<tr>
<th>Situation</th>
<th>Métrique à Privilégier</th>
<th>Raison</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Détection de maladie grave</strong></td>
<td>🎯 <strong>Rappel</strong></td>
<td>Manquer un malade est catastrophique</td>
</tr>
<tr>
<td><strong>Filtre anti-spam</strong></td>
<td>🔍 <strong>Précision</strong></td>
<td>Perdre un email important est problématique</td>
</tr>
<tr>
<td><strong>Détection de fraude</strong></td>
<td>🎯 <strong>Rappel</strong></td>
<td>Ne pas détecter une fraude coûte cher</td>
</tr>
<tr>
<td><strong>Recommandation de produits</strong></td>
<td>🔍 <strong>Précision</strong></td>
<td>Recommander n&#39;importe quoi énerve l&#39;utilisateur</td>
</tr>
<tr>
<td><strong>Évaluation générale</strong></td>
<td>📊 <strong>AUC</strong></td>
<td>Vision globale indépendante du seuil</td>
</tr>
<tr>
<td><strong>Dataset équilibré</strong></td>
<td>✅ <strong>Exactitude</strong></td>
<td>Quand les classes sont représentées équitablement</td>
</tr>
</tbody></table>
<hr>
<h2>🎓 Concepts Clés à Retenir</h2>
<h3>1. Régression Logistique</h3>
<p>✅ Utilise une régression linéaire + fonction sigmoïde<br>✅ Donne une <strong>probabilité</strong> entre 0 et 1<br>✅ Transformée en décision via un <strong>seuil</strong> (par défaut 0.5)</p>
<h3>2. Matrice de Confusion</h3>
<p>✅ <strong>TP</strong> : Vrai Positif (bien détecté)<br>✅ <strong>TN</strong> : Vrai Négatif (bien ignoré)<br>❌ <strong>FP</strong> : Faux Positif (fausse alerte)<br>❌ <strong>FN</strong> : Faux Négatif (cas manqué)</p>
<h3>3. Métriques</h3>
<p>✅ <strong>Exactitude</strong> : % de bonnes prédictions (attention au paradoxe !)<br>✅ <strong>Rappel</strong> : TP / (TP + FN) → Détecter tous les positifs<br>✅ <strong>Précision</strong> : TP / (TP + FP) → Fiabilité des alertes<br>✅ <strong>AUC</strong> : Surface sous courbe ROC → Évaluation globale</p>
<h3>4. Compromis Précision/Rappel</h3>
<p>✅ On ne peut pas maximiser les deux en même temps<br>✅ Le seuil permet d&#39;ajuster le compromis<br>✅ Choix dépend du contexte métier</p>
<hr>
<h2>💡 Analogies pour Bien Comprendre</h2>
<h3>Le Détecteur de Fumée</h3>
<p><strong>Rappel</strong> = Détecteur ultra-sensible</p>
<ul>
<li>✅ Détecte TOUS les incendies (même petits)</li>
<li>❌ Sonne pour un toast brûlé (fausses alertes)</li>
</ul>
<p><strong>Précision</strong> = Détecteur prudent</p>
<ul>
<li>✅ Ne sonne que pour les vrais incendies</li>
<li>❌ Rate les petits débuts de feu</li>
</ul>
<h3>Le Contrôle de Sécurité à l&#39;Aéroport</h3>
<p><strong>Rappel</strong> = Fouiller tout le monde systématiquement</p>
<ul>
<li>✅ Aucun danger ne passe</li>
<li>❌ Files d&#39;attente interminables</li>
</ul>
<p><strong>Précision</strong> = Fouiller seulement les suspects évidents</p>
<ul>
<li>✅ Flux rapide, peu de personnes embêtées</li>
<li>❌ Risque de laisser passer un danger</li>
</ul>
]]></content:encoded>
      <dc:creator>Clément Reboul</dc:creator>
      <pubDate>Sat, 13 Dec 2025 09:22:00 GMT</pubDate>
      <category>Guides pratiques</category>
    </item>
    <item>
      <title><![CDATA[Guide Pratique : Régression Linéaire sur le Dataset Advertising]]></title>
      <link>https://clement-reboul.fr/blog/guide-pratique-regression-lineaire-sur-le-dataset-advertising/</link>
      <guid isPermaLink="true">https://clement-reboul.fr/blog/guide-pratique-regression-lineaire-sur-le-dataset-advertising/</guid>
      <description><![CDATA[Ce guide vous accompagne pas à pas dans l'analyse du dataset Advertising pour prédire les ventes en fonction des budgets publicitaires (TV, radio, journaux).
]]></description>
      <content:encoded><![CDATA[<h2>📚 Introduction</h2>
<p>Ce guide vous accompagne pas à pas dans l&#39;analyse du dataset <strong>Advertising</strong> pour prédire les <strong>ventes</strong> en fonction des budgets publicitaires (TV, radio, journaux).</p>
<p><a href="https://github.com/OpenClassrooms-Student-Center/8063076-Initiez-vous-au-Machine-Learning/blob/master/data/age_vs_poids_vs_taille_vs_sexe.csv" target="_blank" rel="noopener noreferrer">Télécharger le fichier CSV</a></p>
<p><strong>Objectif</strong> : Comprendre comment construire un modèle de régression linéaire, l&#39;évaluer, et l&#39;améliorer avec des techniques simples.</p>
<hr>
<h2>Comprendre les données</h2>
<h3>Le dataset Advertising</h3>
<p><strong>200 observations</strong> avec 4 variables :</p>
<table>
<thead>
<tr>
<th>Variable</th>
<th>Description</th>
<th>Type</th>
</tr>
</thead>
<tbody><tr>
<td><strong>tv</strong></td>
<td>Budget pub TV (milliers €)</td>
<td>Variable prédictive</td>
</tr>
<tr>
<td><strong>radio</strong></td>
<td>Budget pub radio (milliers €)</td>
<td>Variable prédictive</td>
</tr>
<tr>
<td><strong>journaux</strong></td>
<td>Budget pub journaux (milliers €)</td>
<td>Variable prédictive</td>
</tr>
<tr>
<td><strong>ventes</strong></td>
<td>Volume de ventes</td>
<td><strong>Variable cible</strong> (ce qu&#39;on veut prédire)</td>
</tr>
</tbody></table>
<h3>Première exploration</h3>
<pre><code class="language-python">import pandas as pd

df = pd.read_csv(&quot;advertising.csv&quot;)
print(df.head())
print(df.describe())
</code></pre>
<p><strong>Ce qu&#39;on observe</strong> :</p>
<ul>
<li>Moyenne TV : ~147, Radio : ~23, Journaux : ~31</li>
<li>Ventes moyennes : ~14</li>
<li>Aucune valeur manquante ✅</li>
</ul>
<hr>
<h2>Visualiser les relations</h2>
<h3>Pourquoi visualiser ?</h3>
<p>Avant de construire un modèle, il faut <strong>voir</strong> si les variables sont liées aux ventes.</p>
<h3>Les graphiques avec trendline (ligne de régression)</h3>
<pre><code class="language-python">import plotly.express as px

fig = px.scatter(df, x=&quot;tv&quot;, y=&quot;ventes&quot;,
                 trendline=&quot;ols&quot;,  # Ordinary Least Squares
                 title=&quot;TV vs Ventes&quot;)
fig.show()
</code></pre>
<p><strong>Ce que montre le paramètre <code>trendline=&quot;ols&quot;</code></strong> :</p>
<ul>
<li>Trace automatiquement la <strong>meilleure droite</strong> qui passe au plus près des points</li>
<li>OLS = méthode mathématique pour trouver cette droite</li>
<li>Si les points sont proches de la ligne → forte relation 💪</li>
<li>Si les points sont dispersés → faible relation 😐</li>
</ul>
<h3>Les corrélations</h3>
<table>
<thead>
<tr>
<th>Variables</th>
<th>Corrélation avec ventes</th>
</tr>
</thead>
<tbody><tr>
<td><strong>tv</strong></td>
<td>0.78 🔥 (très forte)</td>
</tr>
<tr>
<td><strong>radio</strong></td>
<td>0.58 👍 (forte)</td>
</tr>
<tr>
<td><strong>journaux</strong></td>
<td>0.23 😐 (faible)</td>
</tr>
</tbody></table>
<p><strong>Interprétation simple</strong> :</p>
<ul>
<li><strong>0.78</strong> : Quand le budget TV augmente, les ventes augmentent beaucoup</li>
<li><strong>0.23</strong> : Les journaux ont peu d&#39;impact sur les ventes</li>
</ul>
<hr>
<h2>Construire le modèle de régression linéaire</h2>
<h3>Qu&#39;est-ce qu&#39;une régression linéaire ?</h3>
<p>C&#39;est trouver la formule mathématique qui relie les variables :</p>
<pre><code>ventes = a × tv + b × radio + c × journaux + d
</code></pre>
<p>Le modèle va chercher les meilleurs coefficients <code>a</code>, <code>b</code>, <code>c</code>, <code>d</code> pour prédire au mieux les ventes.</p>
<h3>Le code</h3>
<pre><code class="language-python">from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# 1. Préparer les données
X = df[[&quot;tv&quot;, &quot;radio&quot;, &quot;journaux&quot;]]  # Variables prédictives
y = df.ventes                        # Variable cible

# 2. Séparer en train (80%) et test (20%)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42
)

# 3. Créer et entraîner le modèle
reg = LinearRegression()
reg.fit(X_train, y_train)  # Le modèle &quot;apprend&quot;

# 4. Faire des prédictions
y_pred_test = reg.predict(X_test)
</code></pre>
<h3>🧠 Comprendre train_test_split</h3>
<p><strong>Pourquoi séparer les données ?</strong></p>
<p>Imaginez que vous préparez un examen :</p>
<ul>
<li><strong>Train (80%)</strong> = Les exercices que vous faites pour apprendre</li>
<li><strong>Test (20%)</strong> = L&#39;examen final avec des questions que vous n&#39;avez jamais vues</li>
</ul>
<p>Si vous testez sur les mêmes données que l&#39;entraînement, vous trichez ! Le modèle connaît déjà les réponses.</p>
<p><strong>Le paramètre <code>random_state=42</code></strong> :</p>
<ul>
<li>Assure que la séparation est toujours la même</li>
<li>Permet de reproduire les résultats</li>
<li>Sans ça, chaque exécution donnerait des résultats différents</li>
</ul>
<hr>
<h2>Évaluer le modèle</h2>
<h3>Les métriques d&#39;évaluation</h3>
<pre><code class="language-python">from sklearn.metrics import mean_squared_error, mean_absolute_percentage_error

rmse = mean_squared_error(y_test, y_pred_test)
mape = mean_absolute_percentage_error(y_test, y_pred_test)

print(f&quot;RMSE : {rmse}&quot;)
print(f&quot;MAPE : {mape}&quot;)
</code></pre>
<h3>📏 RMSE (Root Mean Square Error)</h3>
<p><strong>C&#39;est quoi ?</strong> L&#39;erreur moyenne de vos prédictions.</p>
<p><strong>Exemple concret</strong> :</p>
<ul>
<li>Si RMSE = 3.17</li>
<li>En moyenne, vos prédictions se trompent de <strong>±3.17 unités de ventes</strong></li>
<li>Si les vraies ventes sont 15, vous prédisez entre 11.83 et 18.17</li>
</ul>
<p><strong>Caractéristique</strong> : Pénalise fortement les grosses erreurs</p>
<ul>
<li>Se tromper de 10 compte plus que se tromper de 1 dix fois</li>
</ul>
<h3>🎯 MAPE (Mean Absolute Percentage Error)</h3>
<p><strong>C&#39;est quoi ?</strong> L&#39;erreur en <strong>pourcentage</strong>.</p>
<p><strong>Exemple concret</strong> :</p>
<ul>
<li>Si MAPE = 0.15 (soit 15%)</li>
<li>En moyenne, vos prédictions ont <strong>15% d&#39;erreur</strong></li>
<li>Si les vraies ventes sont 100, vous prédisez entre 85 et 115</li>
</ul>
<p><strong>Avantage</strong> : Plus intuitif et comparable entre différents projets</p>
<h3>Est-ce bon ou mauvais ?</h3>
<p>Pour le modèle simple :</p>
<ul>
<li>RMSE ≈ 3.17 → Pas mal 👍</li>
<li>MAPE ≈ 0.15 (15%) → Correct mais peut mieux faire 🤔</li>
</ul>
<hr>
<h2>Amélioration : La régression polynomiale</h2>
<h3>Le problème détecté</h3>
<p>En regardant le graphique TV vs Ventes, on remarque que les points forment une <strong>courbe</strong> plutôt qu&#39;une ligne droite.</p>
<p><strong>Exemple visuel</strong> :</p>
<pre><code>Budget TV faible (0-50)    → Les ventes augmentent lentement
Budget TV moyen (100-150)  → Les ventes augmentent normalement
Budget TV élevé (200-300)  → Les ventes augmentent rapidement
</code></pre>
<p>C&#39;est une <strong>accélération</strong> = relation <strong>non-linéaire</strong> !</p>
<h3>La solution : ajouter tv²</h3>
<p>Au lieu de :</p>
<pre><code>ventes = a × tv + ...
</code></pre>
<p>On fait :</p>
<pre><code>ventes = a × tv + b × tv² + ...
</code></pre>
<h3>Pourquoi tv² capture la courbure ?</h3>
<p><strong>Exemple simple</strong> :</p>
<table>
<thead>
<tr>
<th>tv</th>
<th>tv²</th>
<th>Rapport</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>100</td>
<td>-</td>
</tr>
<tr>
<td>20</td>
<td>400</td>
<td>×4 (pas ×2 !)</td>
</tr>
<tr>
<td>30</td>
<td>900</td>
<td>×9 (pas ×3 !)</td>
</tr>
</tbody></table>
<p>Le terme <code>tv²</code> augmente <strong>beaucoup plus vite</strong> que <code>tv</code>, ce qui crée l&#39;effet de courbure/accélération.</p>
<hr>
<h2>Normalisation : Pourquoi et comment ?</h2>
<h3>Le problème d&#39;échelle</h3>
<p>Après avoir créé <code>tv²</code>, on a :</p>
<ul>
<li><code>tv</code> : entre 0 et 300</li>
<li><code>tv²</code> : entre 0 et <strong>90 000</strong> ! 😱</li>
</ul>
<p>Le modèle va penser que <code>tv²</code> est beaucoup plus important juste parce que les chiffres sont gros.</p>
<h3>La solution : MinMaxScaler</h3>
<p><strong>Ce que ça fait</strong> : Ramène toutes les variables entre 0 et 1.</p>
<p><strong>Exemple</strong> :</p>
<pre><code>Avant :
tv = [0, 100, 200, 300]

Après normalisation :
tv = [0, 0.33, 0.66, 1.0]
</code></pre>
<h3>Le code</h3>
<pre><code class="language-python">from sklearn.preprocessing import MinMaxScaler

# 1. Créer tv²
df[&#39;tv2&#39;] = df.tv ** 2

# 2. Normaliser
scaler = MinMaxScaler()
data_normalized = scaler.fit_transform(df)
df_normalized = pd.DataFrame(data_normalized,
                              columns=[&#39;tv&#39;, &#39;radio&#39;, &#39;journaux&#39;, &#39;ventes&#39;, &#39;tv2&#39;])

# 3. Entraîner avec tv²
X_poly = df_normalized[[&#39;tv&#39;, &#39;radio&#39;, &#39;journaux&#39;, &#39;tv2&#39;]]
y_poly = df_normalized.ventes

X_train, X_test, y_train, y_test = train_test_split(
    X_poly, y_poly, test_size=0.20, random_state=42
)

reg_poly = LinearRegression()
reg_poly.fit(X_train, y_train)
y_pred_poly = reg_poly.predict(X_test)
</code></pre>
<h3>Comprendre fit_transform</h3>
<p><strong>Les 4 étapes du scaler</strong> :</p>
<ol>
<li><p><strong><code>fit()</code></strong> : Le scaler regarde les données et calcule :</p>
<ul>
<li>Le minimum de chaque colonne</li>
<li>Le maximum de chaque colonne</li>
</ul>
</li>
<li><p><strong><code>transform()</code></strong> : Le scaler applique la formule :</p>
<pre><code>valeur_normalisée = (valeur - min) / (max - min)
</code></pre>
</li>
<li><p><strong><code>fit_transform()</code></strong> : Fait les 2 étapes d&#39;un coup (plus rapide)</p>
</li>
</ol>
<p><strong>Exemple concret</strong> :</p>
<pre><code class="language-python">tv = [0, 100, 200, 300]

# Le scaler calcule :
min = 0
max = 300

# Puis transforme :
0   → (0 - 0) / 300 = 0
100 → (100 - 0) / 300 = 0.33
200 → (200 - 0) / 300 = 0.66
300 → (300 - 0) / 300 = 1.0
</code></pre>
<hr>
<h2>Comparaison des résultats</h2>
<h3>Tableau récapitulatif</h3>
<table>
<thead>
<tr>
<th>Modèle</th>
<th>Variables utilisées</th>
<th>RMSE</th>
<th>MAPE</th>
<th>Amélioration</th>
</tr>
</thead>
<tbody><tr>
<td>Linéaire simple</td>
<td>tv, radio, journaux</td>
<td>~3.17</td>
<td>~0.15</td>
<td>-</td>
</tr>
<tr>
<td>Polynomiale</td>
<td>tv, radio, journaux, <strong>tv²</strong></td>
<td><strong>Plus petit</strong></td>
<td><strong>Plus petit</strong></td>
<td>✅ Meilleur</td>
</tr>
</tbody></table>
<h3>Pourquoi c&#39;est mieux ?</h3>
<p>Le terme quadratique <code>tv²</code> permet de capturer la <strong>vraie relation</strong> entre TV et ventes :</p>
<ul>
<li>Pas juste une ligne droite</li>
<li>Mais une <strong>courbe</strong> qui représente l&#39;accélération des ventes avec le budget</li>
</ul>
<hr>
<h2>Convention de nommage importante</h2>
<h3>La notation <code>_pred</code></h3>
<p>En machine learning, on utilise cette convention :</p>
<table>
<thead>
<tr>
<th>Variable</th>
<th>Signification</th>
</tr>
</thead>
<tbody><tr>
<td><code>y_test</code></td>
<td>Les <strong>vraies</strong> valeurs de ventes</td>
</tr>
<tr>
<td><code>y_pred_test</code></td>
<td>Les valeurs <strong>prédites</strong> par le modèle</td>
</tr>
</tbody></table>
<p><strong>Pourquoi c&#39;est important ?</strong></p>
<ul>
<li>Distingue clairement la <strong>réalité</strong> des <strong>prédictions</strong></li>
<li>Évite les confusions dans le code</li>
<li>Standard dans toute la communauté ML</li>
</ul>
<p><strong>Analogie</strong> :</p>
<ul>
<li><code>y_test</code> = Les bonnes réponses de l&#39;examen</li>
<li><code>y_pred_test</code> = Vos réponses (ce que le modèle pense)</li>
<li>Les métriques (RMSE, MAPE) = La note de l&#39;examen (comparaison des deux)</li>
</ul>
<hr>
<h2>🎓 Concepts clés à retenir</h2>
<h3>1. Train/Test Split</h3>
<p>✅ <strong>Toujours</strong> séparer les données<br>✅ Typiquement 80/20 ou 70/30<br>✅ Le modèle n&#39;a <strong>jamais vu</strong> les données de test</p>
<h3>2. Corrélation</h3>
<p>✅ Entre -1 et +1<br>✅ Plus proche de ±1 = plus forte relation<br>✅ Proche de 0 = pas de relation</p>
<h3>3. Régression polynomiale</h3>
<p>✅ Ajouter des puissances (x²) capture les courbes<br>✅ Plus flexible que la régression linéaire simple<br>✅ Attention à ne pas &quot;sur-complexifier&quot; (overfitting)</p>
<h3>4. Normalisation</h3>
<p>✅ Met toutes les variables sur la même échelle<br>✅ Permet de comparer l&#39;importance des coefficients<br>✅ Évite que les grandes valeurs dominent</p>
<h3>5. Métriques d&#39;évaluation</h3>
<p>✅ <strong>RMSE</strong> : Erreur absolue, pénalise les grosses erreurs<br>✅ <strong>MAPE</strong> : Erreur en %, facile à interpréter<br>✅ Plus petit = meilleur modèle</p>
<hr>
<h2>🚀 Pour aller plus loin</h2>
<h3>Idées d&#39;améliorations</h3>
<ol>
<li><p><strong>Ajouter des termes croisés</strong> : <code>tv × radio</code></p>
<ul>
<li>Capture l&#39;effet combiné de campagnes multi-canal</li>
</ul>
</li>
<li><p><strong>Retirer la variable <code>journaux</code></strong></p>
<ul>
<li>Corrélation faible (0.23), peut simplifier le modèle</li>
</ul>
</li>
<li><p><strong>Tester d&#39;autres modèles</strong></p>
<ul>
<li>Random Forest, Gradient Boosting</li>
<li>Comparer les performances</li>
</ul>
</li>
<li><p><strong>Analyser les résidus</strong></p>
<ul>
<li>Différence entre prédiction et réalité</li>
<li>Identifier les patterns d&#39;erreurs</li>
</ul>
</li>
</ol>
<hr>
<h2>📝 Résumé du workflow complet</h2>
<pre><code>1. Charger les données
   ↓
2. Explorer (head, describe, visualisations)
   ↓
3. Analyser les corrélations
   ↓
4. Préparer X (variables) et y (cible)
   ↓
5. Split train/test
   ↓
6. Entraîner le modèle (fit)
   ↓
7. Prédire (predict)
   ↓
8. Évaluer (RMSE, MAPE)
   ↓
9. Améliorer (ajouter tv², normaliser)
   ↓
10. Comparer les résultats
</code></pre>
<hr>
<h2>💡 Analogies pour bien comprendre</h2>
<h3>Le modèle = Un étudiant</h3>
<ul>
<li><strong>fit()</strong> = Réviser avec les exercices du livre</li>
<li><strong>predict()</strong> = Passer l&#39;examen</li>
<li><strong>Train set</strong> = Les exercices du livre</li>
<li><strong>Test set</strong> = L&#39;examen avec de nouvelles questions</li>
<li><strong>RMSE/MAPE</strong> = La note de l&#39;examen</li>
</ul>
<h3>La régression linéaire = Tracer une droite</h3>
<ul>
<li>On a des points sur un graphique</li>
<li>On cherche la meilleure droite qui passe près de tous les points</li>
<li>Les coefficients = La pente et la hauteur de la droite</li>
<li>L&#39;erreur = La distance moyenne entre les points et la droite</li>
</ul>
<h3>La normalisation = Mettre tout en euros</h3>
<ul>
<li>Sans normalisation : comparer des pommes (2€) et des voitures (20 000€)</li>
<li>Avec normalisation : tout entre 0 et 1, on compare des proportions</li>
<li>Comme mettre toutes les valeurs en &quot;pourcentage du maximum&quot;</li>
</ul>
]]></content:encoded>
      <dc:creator>Clément Reboul</dc:creator>
      <pubDate>Thu, 11 Dec 2025 19:34:00 GMT</pubDate>
      <category>Guides pratiques</category>
    </item>
    <item>
      <title><![CDATA[Évaluer la Performance d'un Modèle Prédictif]]></title>
      <link>https://clement-reboul.fr/blog/evaluer-la-performance-d-un-modele-predictif/</link>
      <guid isPermaLink="true">https://clement-reboul.fr/blog/evaluer-la-performance-d-un-modele-predictif/</guid>
      <description><![CDATA[Pour développer un système d'intelligence artificielle fiable, il ne suffit pas d'entraîner un modèle : il faut surtout être capable de mesurer objectivement sa performance. Cette étape cruciale garantit que votre modèle fait des prédictions précises et utiles.]]></description>
      <content:encoded><![CDATA[<p>L&#39;évaluation d&#39;un modèle de Machine Learning est une étape cruciale qui permet de mesurer sa capacité à faire des prédictions fiables. Dans cet article, nous allons explorer les concepts fondamentaux de l&#39;évaluation de performance à travers un exemple concret de régression linéaire.</p>
<h2>Un exemple pratique : prédire le poids d&#39;enfants</h2>
<p>Imaginons un dataset contenant 237 échantillons d&#39;enfants âgés de 11,5 à 20 ans, avec les informations suivantes :</p>
<ul>
<li><strong>L&#39;âge</strong> (exprimé en mois, de 139 à 250 mois)</li>
<li><strong>Le sexe</strong> (variable binaire : 0 pour les garçons, 1 pour les filles)</li>
<li><strong>La taille</strong> (entre 128,27 cm et 182,88 cm)</li>
<li><strong>Le poids</strong> (entre 22,9 kg et 77,78 kg)</li>
</ul>
<p>Notre objectif est de construire un modèle qui prédit le <strong>poids</strong> d&#39;un enfant en fonction de son sexe, son âge et sa taille.</p>
<h2>Le principe de la régression linéaire</h2>
<p>Le modèle que nous cherchons à construire s&#39;exprime mathématiquement comme :</p>
<p><strong>poids = a × sexe + b × age + c × taille + bruit</strong></p>
<p>Où :</p>
<ul>
<li><strong>a, b, c</strong> sont les coefficients que le modèle doit apprendre</li>
<li><strong>Le bruit</strong> représente l&#39;information que le modèle ne peut pas capturer</li>
</ul>
<p>Ce type de modèle, appelé <strong>régression linéaire</strong>, est l&#39;un des plus simples mais aussi des plus puissants en Machine Learning.</p>
<h2>Les trois étapes de l&#39;entraînement</h2>
<h3>Étape 1 : Charger et préparer les données</h3>
<p>La première étape consiste à organiser nos données :</p>
<ul>
<li><strong>X</strong> (la matrice de design) : contient les variables prédictives (âge, sexe, taille)</li>
<li><strong>y</strong> (le vecteur cible) : contient la variable à prédire (le poids)</li>
</ul>
<p>Par convention, <strong>X</strong> représente toujours les données d&#39;entrée où chaque ligne correspond à un échantillon et chaque colonne à une variable.</p>
<h3>Étape 2 : Entraîner le modèle</h3>
<p>L&#39;entraînement consiste à trouver les meilleurs coefficients <strong>a, b, c</strong> qui minimisent l&#39;écart entre les prédictions du modèle et les vraies valeurs. Cette phase est automatiquement gérée par les bibliothèques de Machine Learning comme scikit-learn.</p>
<h3>Étape 3 : Évaluer la performance</h3>
<p>Une fois le modèle entraîné, il faut mesurer sa qualité. C&#39;est là qu&#39;interviennent les <strong>métriques d&#39;évaluation</strong>.</p>
<h2>Les fonctions de coût : le moteur de l&#39;apprentissage</h2>
<p>Une <strong>fonction de coût</strong> mesure l&#39;écart entre les prédictions du modèle et les valeurs réelles. Le but de l&#39;entraînement est de <strong>minimiser</strong> cette fonction.</p>
<p>Pour la régression linéaire, la fonction de coût la plus courante est la <strong>MSE</strong> (Mean Squared Error - Erreur Quadratique Moyenne) :</p>
<p><strong>MSE = (1/N) × Σ(yₖ - ŷₖ)²</strong></p>
<p>Où :</p>
<ul>
<li><strong>N</strong> : le nombre d&#39;échantillons</li>
<li><strong>yₖ</strong> : les valeurs réelles</li>
<li><strong>ŷₖ</strong> : les valeurs prédites par le modèle</li>
</ul>
<h3>Comment ça marche ?</h3>
<p>Imaginez la fonction de coût comme une vallée. L&#39;algorithme d&#39;entraînement (comme la <strong>descente de gradient</strong>) explore cette vallée en calculant les dérivées pour trouver le chemin qui descend le plus rapidement vers le fond - c&#39;est-à-dire le minimum d&#39;erreur.</p>
<h2>Mesurer la performance : les métriques d&#39;évaluation</h2>
<p>Une fois le modèle entraîné, nous devons évaluer sa qualité sur de nouvelles données. Plusieurs métriques existent selon le type de problème.</p>
<h3>Pour les problèmes de régression</h3>
<p><strong>1. Le coefficient de détermination R²</strong></p>
<ul>
<li>Varie de 0 (mauvais) à 1 (parfait)</li>
<li>Mesure la proportion de variance expliquée par le modèle</li>
<li><strong>Plus il est proche de 1, meilleur est le modèle</strong></li>
</ul>
<p><strong>2. La RMSE (Root Mean Square Error)</strong></p>
<ul>
<li>Mesure l&#39;écart moyen entre prédictions et valeurs réelles</li>
<li>S&#39;exprime dans la même unité que la variable cible</li>
<li><strong>Plus elle est petite, meilleur est le modèle</strong></li>
</ul>
<p><strong>3. La MAE (Mean Absolute Error)</strong></p>
<ul>
<li>Erreur absolue moyenne</li>
<li>Moins sensible aux valeurs aberrantes que la RMSE</li>
<li><strong>Plus elle est petite, meilleur est le modèle</strong></li>
</ul>
<p><strong>4. La MAPE (Mean Absolute Percentage Error)</strong></p>
<ul>
<li>Exprime l&#39;erreur en pourcentage</li>
<li>Permet de comparer des modèles sur différents datasets</li>
<li><strong>Plus elle est petite, meilleur est le modèle</strong></li>
</ul>
<h3>Exemple de résultats</h3>
<p>Sur notre modèle prédisant le poids à partir du sexe et de l&#39;âge uniquement, nous obtenons :</p>
<ul>
<li><strong>RMSE</strong> : 45,17 kg</li>
<li><strong>MAE</strong> : 5,22 kg</li>
<li><strong>MAPE</strong> : 12%</li>
</ul>
<p>En ajoutant la variable <strong>taille</strong>, les scores s&#39;améliorent significativement, démontrant l&#39;importance de choisir les bonnes variables prédictives.</p>
<h2>Le processus complet d&#39;entraînement</h2>
<p>Voici la méthodologie à suivre pour tout projet de Machine Learning :</p>
<ol>
<li><strong>Charger les données</strong> : Importer et comprendre votre dataset</li>
<li><strong>Transformer les données</strong> : Nettoyer, normaliser, créer de nouvelles features</li>
<li><strong>Scinder en train/test</strong> : Séparer les données pour évaluer objectivement</li>
<li><strong>Entraîner le modèle</strong> : Tester différentes configurations de paramètres</li>
<li><strong>Calculer les scores</strong> : Comparer les performances de chaque version</li>
<li><strong>Itérer</strong> : Recommencer pour améliorer les résultats</li>
</ol>
<p>Cette approche systématique s&#39;applique à tous les types de modèles : régression, classification, clustering.</p>
<h2>Faire des prédictions</h2>
<p>Une fois le modèle entraîné et évalué, il peut être utilisé pour faire des prédictions sur de nouvelles données. Par exemple, pour estimer le poids d&#39;un nouveau garçon de 150 mois mesurant 153 cm, il suffit de fournir ces valeurs au modèle qui retournera une estimation basée sur les patterns appris.</p>
<h2>En résumé</h2>
<ul>
<li>La <strong>fonction de coût</strong> mesure l&#39;erreur pendant l&#39;entraînement. L&#39;algorithme cherche à la minimiser.</li>
<li>Les <strong>métriques d&#39;évaluation</strong> mesurent la performance finale du modèle sur de nouvelles données.</li>
<li>Pour la régression, attention aux directions :<ul>
<li><strong>R² proche de 1 = bon modèle</strong></li>
<li><strong>RMSE, MAE, MAPE proches de 0 = bon modèle</strong></li>
</ul>
</li>
<li>Le choix des variables prédictives impacte fortement la qualité du modèle.</li>
<li>L&#39;évaluation rigoureuse nécessite de séparer les données en ensembles d&#39;entraînement et de test.</li>
</ul>
<p>La maîtrise de ces concepts d&#39;évaluation est essentielle pour développer des modèles de Machine Learning fiables et performants. Dans les prochains articles, nous explorerons plus en détail les différents types de modèles et leurs spécificités.</p>
]]></content:encoded>
      <dc:creator>Clément Reboul</dc:creator>
      <pubDate>Thu, 11 Dec 2025 16:11:00 GMT</pubDate>
      <category>Guides pratiques</category>
    </item>
    <item>
      <title><![CDATA[Les Formules de l'IA : Comprendre le Langage des Prédictions]]></title>
      <link>https://clement-reboul.fr/blog/les-formules-de-l-ia-comprendre-le-langage-des-predictions/</link>
      <guid isPermaLink="true">https://clement-reboul.fr/blog/les-formules-de-l-ia-comprendre-le-langage-des-predictions/</guid>
      <description><![CDATA[Quand on parle d'intelligence artificielle, on imagine souvent des algorithmes complexes et mystérieux. Pourtant, derrière chaque prédiction se cachent des formules mathématiques simples qui orchestrent tout le processus. Décryptons ensemble ces équations qui permettent aux machines d'apprendre et de prédire.]]></description>
      <content:encoded><![CDATA[<p>Quand on parle d&#39;intelligence artificielle, on imagine souvent des algorithmes complexes et mystérieux. Pourtant, derrière chaque prédiction se cachent des formules mathématiques simples qui orchestrent tout le processus. Décryptons ensemble ces équations qui permettent aux machines d&#39;apprendre et de prédire.</p>
<h2>La Régression Linéaire : Le Plan de Construction</h2>
<p><strong>Formule :</strong> <code>y ∼ x₁ + x₂ + ⋯ + xₙ</code></p>
<p>Imaginez que vous voulez prédire le prix d&#39;une maison. Vous avez plusieurs facteurs : la surface (x₁), le nombre de chambres (x₂), la distance au centre-ville (x₃), etc. La régression linéaire, c&#39;est le <strong>plan de construction</strong> de votre modèle.</p>
<p><strong>Ce qu&#39;elle fait :</strong></p>
<ul>
<li>Combine tous vos facteurs d&#39;entrée (les x) pour prédire une valeur continue (y)</li>
<li>Attribue un poids à chaque facteur selon son importance</li>
<li>Trouve la meilleure &quot;ligne&quot; qui relie vos données</li>
</ul>
<p><strong>Logique à retenir :</strong> C&#39;est comme une recette de cuisine. Chaque ingrédient (x) contribue au résultat final (y), et la formule vous dit dans quelles proportions les mélanger.</p>
<p><strong>Exemple concret :</strong></p>
<pre><code>Prix maison ∼ (surface × 2000€) + (chambres × 10000€) - (distance × 500€)
</code></pre>
<h2>RMSE : Le Juge de l&#39;Erreur</h2>
<p><strong>Formule :</strong> <code>RMSE = √(1/N × Σ(yₖ - ŷₖ)²)</code></p>
<p>Une fois votre modèle construit, il faut le juger. Le RMSE (Root Mean Square Error) est le <strong>juge impartial</strong> qui évalue la qualité de vos prédictions pour les valeurs continues.</p>
<p><strong>Ce qu&#39;elle fait :</strong></p>
<ul>
<li>Compare vos prédictions (ŷ) avec les vraies valeurs (y)</li>
<li>Calcule l&#39;écart au carré pour chaque prédiction</li>
<li>Fait la moyenne et prend la racine carrée</li>
</ul>
<p><strong>Logique à retenir :</strong> Plus le chiffre est petit, mieux c&#39;est. Un RMSE de 0 signifierait des prédictions parfaites (en pratique impossible).</p>
<p><strong>Pourquoi c&#39;est important :</strong></p>
<ul>
<li>Un RMSE de 5000€ sur des prédictions de prix de maison ? Acceptable.</li>
<li>Un RMSE de 5000€ sur des prédictions de température ? Catastrophique !</li>
</ul>
<p>Le RMSE doit être interprété dans le contexte de votre problème.</p>
<h2>Le Rappel : L&#39;Agent de Sécurité</h2>
<p><strong>Formule :</strong> <code>Rappel = TP / (TP + FN)</code></p>
<p>Le rappel (ou <em>recall</em> en anglais) est votre <strong>agent de sécurité</strong>. Son job ? Ne rien manquer d&#39;important.</p>
<p><strong>Vocabulaire :</strong></p>
<ul>
<li><strong>TP (True Positive)</strong> : Alarmes justifiées qu&#39;on a détectées</li>
<li><strong>FN (False Negative)</strong> : Alarmes qu&#39;on a ratées (danger !)</li>
</ul>
<p><strong>Ce qu&#39;elle mesure :</strong>
Parmi tous les cas positifs réels, combien en avez-vous détectés ?</p>
<p><strong>Logique à retenir :</strong> Minimiser les FN (Faux Négatifs). On ne veut <strong>rien manquer</strong>.</p>
<p><strong>Exemples d&#39;usage :</strong></p>
<ul>
<li><strong>Détection de spam :</strong> Un rappel de 95% = on a attrapé 95% des spams</li>
<li><strong>Diagnostic médical :</strong> Un rappel de 98% = on a détecté 98% des maladies</li>
<li><strong>Fraude bancaire :</strong> Un rappel de 90% = on a bloqué 90% des transactions frauduleuses</li>
</ul>
<p><strong>Le piège :</strong> On peut avoir un rappel de 100% en classant TOUT comme positif... mais on aura plein de fausses alertes ! D&#39;où l&#39;importance de la précision.</p>
<h2>La Précision : Le Contrôleur Qualité</h2>
<p><strong>Formule :</strong> <code>Précision = TP / (TP + FP)</code></p>
<p>La précision est le <strong>contrôleur qualité</strong> de vos alarmes. Elle répond à la question : &quot;Quand mon modèle dit OUI, a-t-il raison ?&quot;</p>
<p><strong>Vocabulaire :</strong></p>
<ul>
<li><strong>TP (True Positive)</strong> : Alarmes justifiées</li>
<li><strong>FP (False Positive)</strong> : Fausses alarmes (danger !)</li>
</ul>
<p><strong>Ce qu&#39;elle mesure :</strong>
Parmi toutes vos alertes, combien sont vraiment justifiées ?</p>
<p><strong>Logique à retenir :</strong> Minimiser les FP (Faux Positifs). On veut que l&#39;alarme soit <strong>fiable</strong>.</p>
<p><strong>Exemples d&#39;usage :</strong></p>
<ul>
<li><strong>Filtre anti-spam :</strong> Précision de 99% = 99% des emails classés spam sont vraiment des spams</li>
<li><strong>Virement bancaire :</strong> Précision de 95% = 95% des virements bloqués sont réellement frauduleux</li>
<li><strong>Reconnaissance faciale :</strong> Précision de 98% = 98% des identifications sont correctes</li>
</ul>
<p><strong>Le piège :</strong> On peut avoir une précision de 100% en ne détectant que les cas ultra-évidents... mais on ratera beaucoup de cas ! D&#39;où l&#39;importance du rappel.</p>
<h2>Le Dilemme Rappel vs Précision</h2>
<p>En pratique, on doit souvent choisir :</p>
<p><strong>Privilégier le Rappel (ne rien manquer) :</strong></p>
<ul>
<li>Diagnostic médical (mieux vaut une fausse alerte qu&#39;un cancer raté)</li>
<li>Détection de fraude (on accepte de bloquer quelques virements légitimes)</li>
<li>Système de sécurité (mieux vaut une fausse alarme qu&#39;un intrus non détecté)</li>
</ul>
<p><strong>Privilégier la Précision (alarmes fiables) :</strong></p>
<ul>
<li>Recommandations produits (ne pas spammer l&#39;utilisateur)</li>
<li>Validation de documents (ne bloquer que les vrais problèmes)</li>
<li>Notifications push (éviter de fatiguer l&#39;utilisateur avec de fausses alertes)</li>
</ul>
<h2>Conclusion : Les Formules comme Boussole</h2>
<p>Ces formules ne sont pas de simples équations mathématiques. Ce sont des <strong>outils de décision</strong> qui guident la construction et l&#39;évaluation des modèles d&#39;IA :</p>
<ol>
<li><strong>Régression linéaire</strong> : Définit comment combiner les facteurs</li>
<li><strong>RMSE</strong> : Évalue la qualité des prédictions continues</li>
<li><strong>Rappel</strong> : S&#39;assure qu&#39;on ne rate rien d&#39;important</li>
<li><strong>Précision</strong> : S&#39;assure que nos alertes sont fiables</li>
</ol>
<p>Comprendre ces formules, c&#39;est comprendre le langage des prédictions. Et dans un monde où l&#39;IA prend des décisions de plus en plus importantes, savoir décoder ce langage devient essentiel.</p>
<hr>
<p><strong>Pour aller plus loin :</strong></p>
<ul>
<li>F1-Score : La moyenne harmonique entre rappel et précision</li>
<li>AUC-ROC : Pour évaluer globalement un modèle de classification</li>
<li>MAE vs RMSE : Choisir la bonne métrique pour les régressions</li>
</ul>
]]></content:encoded>
      <dc:creator>Clément Reboul</dc:creator>
      <pubDate>Mon, 15 Sep 2025 19:17:00 GMT</pubDate>
      <category>Guides pratiques</category>
    </item>
  </channel>
</rss>
