7.18.2 EP07_02 🟡 Normalisation Z-score et Robustesse du k-NN à des Échelles Distinctes
Cet exercice revisite le classificateur implémenté dans l’EP07_01, cette fois sous l’angle discuté dans la section L’Impact de l’Échelle et la Normalisation des Caractéristiques du chapitre : le k-NN décide en se basant sur la distance entre les vecteurs, de sorte qu’une caractéristique mesurée sur une échelle beaucoup plus grande que les autres tend à dominer le calcul de la distance, même lorsqu’elle n’est pas la plus pertinente pour séparer les classes.
Un système d’inspection enregistre, pour chaque pièce, sa superficie (en pixels, pouvant atteindre des centaines ou des milliers) et sa circularité (toujours entre \(0\) et \(1\)). Vous êtes chargé de classer de nouvelles pièces par k-NN de deux manières — avec et sans la standardisation Z-score présentée dans le chapitre — et de rapporter dans quels cas les deux approches divergent.
7.18.2.1 📋 Directives d’Implémentation
- Quantité et paramètre : Lire l’entier \(N\) (nombre d’exemples d’entraînement) et l’entier impair \(k\).
- Exemples d’entraînement : Pour chacun des \(N\) exemples, lire trois valeurs : la superficie \(x_1\) (réelle), la circularité \(x_2\) (réelle) et l’étiquette \(r\) (entier, \(0\) ou \(1\)).
- Requêtes : Lire l’entier \(Q\) puis les coordonnées \(x_1, x_2\) de chaque requête.
- Classification sans normalisation : Pour chaque requête, classifiez-la par k-NN directement sur \((x_1, x_2)\), avec la distance euclidienne et les mêmes règles de départage que l’EP07_01 (ordre de lecture pour les distances à égalité ; voisin le plus proche entre les classes à égalité lors du vote).
- Paramètres de normalisation : Calculer la moyenne \(\mu_j\) et l’écart-type populationnel \(\sigma_j\) (division par \(N\), non par \(N-1\) — la même convention adoptée par la classe
StandardScaler) de chaque caractéristique \(j \in \{1,2\}\), exclusivement sur l’ensemble d’entraînement. - Standardisation : Transformez chaque caractéristique d’entraînement et de requête par \[ z_j = \frac{x_j - \mu_j}{\sigma_j}. \] Si \(\sigma_j = 0\) (caractéristique constante dans l’entraînement), définissez \(z_j = 0\) pour tous les échantillons de cette caractéristique, évitant ainsi la division par zéro.
- Classification avec normalisation : Répétez la classification k-NN du point 4, désormais sur les vecteurs standardisés \((z_1, z_2)\), avec les mêmes règles de départage.
- Sortie : Pour chaque requête, dans l’ordre d’entrée, imprimer les deux classes prédites. À la fin, imprimer le nombre de requêtes où les deux classifications divergent.
7.18.2.2 📌 Contraintes Computationnelles
- Ajustement uniquement sur l’entraînement : \(\mu_j\) et \(\sigma_j\) sont calculés uniquement à partir de l’ensemble d’entraînement et réappliqués aux requêtes — jamais recalculés à partir de celles-ci. Cette pratique évite la fuite de données (data leakage), mentionnée dans la section sur la normalisation du chapitre.
- Écart-type populationnel : utilisez \(\sigma_j = \sqrt{\frac{1}{N}\sum_i (x_{i,j}-\mu_j)^2}\), et non la version échantillonnale (division par \(N-1\)).
- Caractéristique constante : traitez \(\sigma_j = 0\) comme un cas spécial (point 6) ; aucune erreur de division par zéro ne doit survenir.
- Règles de départage : réutilisez exactement les conventions de l’EP07_01, tant pour la sélection des \(k\) voisins que pour le vote majoritaire.
7.18.2.3 🧠 Fondements Théoriques
| Élément | Rôle |
|---|---|
| Standardisation Z-score | Rééchelonne chaque caractéristique pour une moyenne de \(0\) et un écart-type de \(1\), rendant les échelles hétérogènes comparables |
| Ajustement (fit) uniquement sur l’entraînement | Garantit que l’évaluation sur les requêtes reflète uniquement ce que le modèle a appris lors de l’entraînement |
| Distance euclidienne sans normalisation | Dominée par la caractéristique de plus grande amplitude — ici, la superficie |
| Prédiction divergente | Met en évidence que l’échelle des caractéristiques, et pas seulement l’algorithme ou les données, peut déterminer la frontière de décision du k-NN |
Cet exercice renforce, de manière contrôlée, la raison pour laquelle le StandardScaler est appliqué avant le k-NN tout au long du chapitre : sans cette étape, les caractéristiques de circularité — même étant hautement discriminatives — peuvent être pratiquement ignorées par le classificateur face à une caractéristique de superficie avec une amplitude des centaines de fois plus grande.
7.18.2.4 📦 Spécification d’Entrée et de Sortie (VPL)
Entrée :
- Ligne 1 : Entiers \(N\) et \(k\), séparés par un espace.
- Les \(N\) lignes suivantes : trois valeurs par ligne — \(x_1\), \(x_2\) (réelles) et \(r\) (entier \(\in \{0,1\}\)), séparées par un espace.
- Ligne suivante : entier \(Q\).
- Les \(Q\) lignes suivantes : deux valeurs par ligne — \(x_1\), \(x_2\) (réelles) de la requête, séparées par un espace.
Sortie :
- \(Q\) lignes, au format
SemNorm=<0|1> ComNorm=<0|1>, dans l’ordre d’entrée des requêtes. - Dernière ligne :
Divergiu: <int>.
7.18.2.5 📌 Exemples
| Entrée | Sortie | Observation |
|---|---|---|
| 4 3 10 0.9 0 12 0.85 0 900 0.2 1 950 0.25 1 1 500 0.88 |
SemNorm=1 ComNorm=0 Divergiu: 1 |
Sans normalisation, la superficie (échelle des centaines) domine la distance et la requête est classée comme classe 1. Après standardisation, la circularité — beaucoup plus proche des échantillons de classe 0 — commence à peser de manière comparable, et la prédiction change pour 0. |
| 2 1 0 0.5 0 100 0.5 1 1 60 0.5 |
SemNorm=1 ComNorm=1 Divergiu: 0 |
La circularité est constante dans l’entraînement (\(\sigma_2=0\)) ; selon la règle du point 6, \(z_2=0\) pour tous les échantillons, et la classification ne dépend que de la superficie dans les deux cas. |
%%writefile EP07_02.py
# Code PythonOverwriting EP07_02.py
TestSuite("EP07_02.py").run()✔️ EP07_02.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP07_02.cases
🔍 Test de Python : EP07_02.py
⚠️ EP07_02.py : fichier vide (moins de 3 lignes). Tests ignorés.