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) :
- Longueur du sépale (en cm)
- Largeur du sépale (en cm)
- Longueur du pétale (en cm)
- Largeur du pétale (en cm)
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 :
- Les données brutes (les mesures)
- Les bonnes réponses (les étiquettes)
- 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 cm → 0.1, 7.9 cm → 1.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?
pandas(pd) : Une bibliothèque pour manipuler des tableaux de données. Le pd.read_csv() charge des fichiers CSV (Comma-Separated Values).matplotlib.pyplot(plt) : Une bibliothèque pour dessiner des graphiques.
É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 :
try/except= « Essaie ceci. Si ça échoue, fais autre chose. »pd.read_csv(url, names=noms)= Télécharge le fichier CSV, utilise tes noms de colonnesnoms[:4]= Les 4 premiers noms (« slice » en Python) = [longueur_sepale, largeur_sepale, longueur_petale, largeur_petale]df["espece"] = [...]= Ajoute une colonne « espece » au tableau
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 :
head(): Les premières 5 lignes (ou N lignes si tu précises :df.head(10))describe(): Résumé statistique pour chaque colonne numériquecount: Combien de valeurs? (Devrait être 150 si tout va bien)mean: Moyennestd: Écart-type (variation autour de la moyenne)min,25%,50%,75%,max: Les quantiles
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 :
- Quelle est la longueur moyenne d'un pétale? (Cherche « longueur_petale », ligne « mean ».)
- Quelle est la largeur maximale d'un pétale? (Cherche « largeur_petale », ligne « max ».)
- Combien de fleurs au total? (Cherche n'importe quelle colonne, ligne « count ».)
- 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
- Longueur moyenne du pétale: environ 3.76 cm (plus petit que le sépale!)
- Largeur maximale du pétale: 2.5 cm
- Total de fleurs: 150
- É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 pointsx= Longueur du pétale (horizontal)y= Largeur du pétale (vertical)c= Couleur, basée sur l'espèceastype("category").cat.codes= Convertir les noms d'espèces en nombres (Setosa=0, Versicolor=1, Virginica=2)
En regardant le graphique, réponds :
- Vois-tu trois groupes distincts? Ou sont-ils mélangés?
- Quel groupe est le plus isolé (éloigné des autres)?
- Quels deux groupes se chevauchent ou se touchent?
- 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 :
- Oui, trois groupes distincts se dessinent.
- Setosa (couleur 0) est parfaitement isolé en bas à gauche (pétales très courts).
- 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 :
- Setosa est facile. C'est complètement séparé. Une simple règle comme « Si longueur < 3, c'est Setosa » marche presque parfaitement.
- 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à.
- La visualisation aide. Les chiffres disaient « longueur moyenne = 3.76 ». Mais le graphique te montre où sont les données, comment elles sont distribuées. C'est crucial pour comprendre le problème que tu vas résoudre.
- 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.