← Comprendre les Réseaux de Neurones
📊 Phase 1 · 2-3 jours

Manipuler les données

🎯 Ce que tu retiens : Voir les données

Qu'est-ce que les données?

En Phase 0, tu as joué le jeu avec quelques fleurs à la main.

Maintenant, tu vas travailler avec un vrai jeu de données : 150 fleurs Iris réelles, mesurées au 19e siècle par un botaniste.

Pour chaque fleur, on a 4 mesures (caractéristiques) :

Et une étiquette (la réponse) : quelle espèce (Setosa, Versicolor, ou Virginica)?

Ça fait un tableau : 150 lignes (fleurs) × 5 colonnes (4 mesures + espèce).

Pour qu'un réseau de neurones apprenne, il a besoin de :

  1. Les données brutes (les mesures)
  2. Les bonnes réponses (les étiquettes)
  3. Beaucoup de paires entrée-réponse (150 fleurs, c'est un début)

Normalisation : pourquoi 0–1?

Les mesures brutes sont en centimètres : sepal_length varie de 4.3 à 7.9 cm.

Les réseaux de neurones apprennent mieux quand toutes les entrées sont dans la même plage, par ex., 0 à 1.

Normalisation = transformer 4.3 cm0.1, 7.9 cm1.0, etc.

Formule simple :

entrée_normalisée = (valeur - minimum) / (maximum - minimum)

Exemple : si sépale_length min=4.3, max=7.9, et une fleur a 5.0 :

normalisé = (5.0 - 4.3) / (7.9 - 4.3) = 0.7 / 3.6 ≈ 0.19

Maintenant tout est entre 0 et 1, et le réseau peut traiter tous les poids équitablement.

📖 Vocabulaire - français / anglais

  • jeu de données ↔ *dataset* (un tableau de données + étiquettes)
  • caractéristique ↔ *feature* (une colonne de mesures : la longueur, la largeur, etc.)
  • étiquette ↔ *label* (la réponse correcte : Setosa, Versicolor, ou Virginica)
  • normalisation ↔ *normalization* (transformer les données en plage 0-1)
  • pandas → bibliothèque Python pour manipuler des tableaux
  • matplotlib → bibliothèque Python pour tracer des graphiques

Code - Charger et explorer les données

Étape 1 : Importer les bibliothèques

import pandas as pd
import matplotlib.pyplot as plt

Qu'est-ce que ça fait?

Étape 2 : Définir les noms des colonnes

# L'ordre officiel du dataset Iris est :
# sépale_longueur, sépale_largeur, pétale_longueur, pétale_largeur, espèce
# Attention : cet ordre est CRUCIAL. L'inverser corrompt silencieusement les données.

noms = ["longueur_sepale", "largeur_sepale",
        "longueur_petale", "largeur_petale", "espece"]

Quand tu lis un fichier CSV, tu dois dire à pandas « Colonne 1 = longueur_sepale, Colonne 2 = largeur_sepale, etc. »

Étape 3 : Charger les données

# L'URL officielle du dataset Iris (hébergé à UCI)
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"

try:
    # Essayer de télécharger depuis le web
    df = pd.read_csv(url, names=noms)
except Exception:
    # Si le web ne fonctionne pas, utiliser scikit-learn (une autre bibliothèque)
    from sklearn.datasets import load_iris
    data = load_iris()
    df = pd.DataFrame(data.data, columns=noms[:4])
    df["espece"] = [data.target_names[t] for t in data.target]

Explication :

Résultat : df est un DataFrame (tableau) avec 150 lignes et 5 colonnes.

Étape 4 : Explorer les données

# Afficher les 5 premières lignes
print("Premières lignes :")
print(df.head())

# Afficher les statistiques de base (min, max, moyenne, etc.)
print("\nStatistiques :")
print(df.describe())

Qu'est-ce que tu veras :

Exercice 1.1 - Explorer le dataset

✍️ À toi de jouer

Exécute le code complet ci-dessus dans un nouveau script Python.

Quand tu vois la sortie describe(), réponds à ces questions en lisant la table :

  1. Quelle est la longueur moyenne d'un pétale? (Cherche « longueur_petale », ligne « mean ».)
  2. Quelle est la largeur maximale d'un pétale? (Cherche « largeur_petale », ligne « max ».)
  3. Combien de fleurs au total? (Cherche n'importe quelle colonne, ligne « count ».)
  4. Bonus : Quel est l'écart-type de la longueur du sépale? (Ligne « std ».)

Pour accéder à une statistique spécifique en Python :

# Moyenne de longueur_petale
print(df["longueur_petale"].mean())

# Maximum de largeur_petale
print(df["largeur_petale"].max())

# Nombre total de lignes
print(len(df))
Voir la réponse
  1. Longueur moyenne du pétale: environ 3.76 cm (plus petit que le sépale!)
  2. Largeur maximale du pétale: 2.5 cm
  3. Total de fleurs: 150
  4. Écart-type longueur sépale: environ 0.81 cm (les sépales varient, mais pas énormément)

Une erreur courante : Si tu obtiens 5.84 pour la moyenne de la « longueur du pétale », c'est que tes colonnes sont dans le mauvais ordre. Tu lis probablement le sépale, pas le pétale. Vérifie que noms est correct.

Pourquoi? Les fichiers CSV n'ont pas d'en-têtes (noms de colonnes). Pandas te fait confiance : « Tu m'as dit colonne 1 = longueur_sepale; je crois. » Si tu te trompes, tu lis les mauvaises données en silence. C'est une leçon importante : les erreurs silencieuses sont les pires.

Exercice 1.2 - Visualiser les groupes

Jusque-là, tu as vu des chiffres. Maintenant, vois les données.

La visualisation révèle ce que les statistiques cachent : est-ce que les groupes (espèces) sont séparés ou mélangés?

✍️ À toi de jouer

Copie ce code et exécute-le :

plt.scatter(df["longueur_petale"], df["largeur_petale"],
            c=df["espece"].astype("category").cat.codes)
plt.xlabel("Longueur du pétale")
plt.ylabel("Largeur du pétale")
plt.title("Les fleurs Iris - vue par longueur vs largeur du pétale")
plt.show()

Explication du code :

  • plt.scatter(x, y, c=colors) = Trace un nuage de points
  • x = Longueur du pétale (horizontal)
  • y = Largeur du pétale (vertical)
  • c = Couleur, basée sur l'espèce
  • astype("category").cat.codes = Convertir les noms d'espèces en nombres (Setosa=0, Versicolor=1, Virginica=2)

En regardant le graphique, réponds :

  1. Vois-tu trois groupes distincts? Ou sont-ils mélangés?
  2. Quel groupe est le plus isolé (éloigné des autres)?
  3. Quels deux groupes se chevauchent ou se touchent?
  4. Bonus : Où serait la « limite » pour classer les fleurs? (Une ligne droite serait-elle suffisante?)
Besoin d'un indice ?

Le graphique aura probablement une couleur pour chaque espèce. Regarde les positions :

  • Un groupe en bas à gauche (petit pétale)
  • Un groupe en haut à droite (grand pétale)
  • Un groupe au milieu?

Qui est qui?

Voir la réponse

Résultat type :

  1. Oui, trois groupes distincts se dessinent.
  2. Setosa (couleur 0) est parfaitement isolé en bas à gauche (pétales très courts).
  3. Versicolor (couleur 1) et Virginica (couleur 2) se chevauchent légèrement au milieu-haut.
# Approche plus avancée : colorier par espèce avec légende
import matplotlib.patches as mpatches
colors = {'Setosa': 'red', 'Versicolor': 'blue', 'Virginica': 'green'}
for espece in df['espece'].unique():
    mask = df['espece'] == espece
    plt.scatter(df[mask]['longueur_petale'], df[mask]['largeur_petale'],
                label=espece, color=colors[espece], alpha=0.6)
plt.xlabel("Longueur du pétale")
plt.ylabel("Largeur du pétale")
plt.title("Iris par espèce")
plt.legend()
plt.show()

Ce que tu as appris :

  1. Setosa est facile. C'est complètement séparé. Une simple règle comme « Si longueur < 3, c'est Setosa » marche presque parfaitement.
  1. Versicolor vs Virginica est difficile. Elles se chevauchent. Une seule règle ne suffira pas. C'est pour ça qu'en Phase 0, ta règle se trompait sur ces deux-là.
  1. La visualisation aide. Les chiffres disaient « longueur moyenne = 3.76 ». Mais le graphique te montre sont les données, comment elles sont distribuées. C'est crucial pour comprendre le problème que tu vas résoudre.
  1. C'est ce qu'un réseau de neurones doit apprendre. Regarder ce graphique et trouver des règles (implicites, complexes) qui séparent les groupes. Au lieu d'une règle, le réseau ajustera des milliers de poids pour tracer une limite courbe, pas droite.