Implémentation en Python, à partir de NumPy uniquement, de cinq familles de méthodes de classification supervisée, et comparaison de leurs performances sur trois jeux de données de difficulté croissante.
Aucune bibliothèque d'apprentissage automatique n'est utilisée : les distances, les estimateurs de densité, les règles de vote, le perceptron, le bagging et la validation croisée sont écrits intégralement.
pip install -r requirements.txt # installe numpy et matplotlib
jupyter notebook notebook_projet.ipynbLe notebook s'exécute de bout en bout sans configuration : les jeux de données sont
inclus dans data/ et chargés automatiquement. Les figures étant enregistrées dans le
fichier, le notebook est également lisible directement sur GitHub, sans l'exécuter.
Projet réalisé dans le cadre de l'UE Apprentissage automatique du Master 2 Bioinformatique et Modélisation (BIMS), Université de Rouen Normandie, 2025-2026.
L'objectif est de programmer soi-même les méthodes de classification vues en cours, d'évaluer leurs performances sur des jeux de données test, puis de les comparer afin d'identifier les situations dans lesquelles chaque famille de méthodes est pertinente.
Trois problèmes de classification à 5 classes dans R², chacun composé de :
- un jeu d'apprentissage de 100 échantillons par classe (
data_tp{1,2,3}_app.txt) - un jeu de décision de 100 échantillons par classe (
data_tp{1,2,3}_dec.txt)
Format : une ligne par échantillon, label x1 x2, séparés par des espaces.
Les trois jeux présentent une difficulté croissante : classes bien séparées pour TP1, recouvrement partiel pour TP2, recouvrement important pour TP3.
- Classifieur par distance euclidienne minimale
- Classifieur par distance de Mahalanobis minimale, avec estimation des matrices de covariance par classe
- Cas particulier du 1-PPV
- KPPV avec vote à la majorité et vote à l'unanimité, ce dernier introduisant une option de rejet
- Choix de K par validation croisée, et étude de l'influence du nombre de plis (3, 5 et 10)
- Estimation de densité par noyau uniforme et par noyau gaussien
- Choix de la largeur de fenêtre h par validation croisée à 5 plis
- Perceptron en un-contre-un, soit 10 hyperplans pour 5 classes
- Adaptation par introduction d'une marge, afin d'assurer la convergence sur les jeux non linéairement séparables
- Variante un-contre-tous, après retrait de la classe centrale
- Agrégation par bootstrap de classifieurs linéaires
- Choix du nombre de classifieurs par validation croisée
- Comparaison avec un bagging de KPPV
Chaque méthode est évaluée par son taux de bonne classification Top1 et sa matrice de confusion, et chaque partie se termine par une analyse des résultats obtenus.
Taux de bonne classification Top1, mesurés sur les jeux de décision.
| Méthode | TP1 | TP2 | TP3 |
|---|---|---|---|
| Euclidien | 99,2 % | 94,6 % | 72,8 % |
| Mahalanobis | 99,6 % | 94,6 % | 69,8 % |
| 1-PPV | 99,2 % | 92,0 % | 64,6 % |
| KPPV, vote à la majorité | 99,2 % | 94,6 % | 71,2 % |
| Parzen, noyau uniforme | 99,6 % | 94,6 % | 71,4 % |
| Parzen, noyau gaussien | 99,4 % | 94,8 % | 72,4 % |
| Perceptron un-contre-un | 99,4 % | 79,4 % | 53,8 % |
| Bagging linéaire | 99,6 % | 95,6 % | 71,0 % |
| Bagging de KPPV | 99,2 % | 95,2 % | 71,0 % |
Le vote à l'unanimité et l'un-contre-tous ne figurent pas dans ce tableau : le premier rejette une partie des points, le second est mesuré sur 4 classes seulement.
Trois enseignements se dégagent de cette comparaison. La structure des données pèse davantage que le choix du classifieur : sur TP1, où les classes sont pratiquement séparables, toutes les méthodes dépassent 99 %. Dès que le recouvrement augmente, les méthodes locales, KPPV et Parzen, résistent nettement mieux que la séparation linéaire, qui chute à 79,4 % sur TP2 et 53,8 % sur TP3. Enfin, le bagging n'apporte de gain significatif que sur un classifieur instable : appliqué au perceptron il ramène les performances au niveau des meilleures méthodes, alors qu'appliqué au KPPV, déjà stable, il ne change pratiquement rien.
machine-learning-classifiers/
├── notebook_projet.ipynb # implémentation, résultats et analyses
├── requirements.txt # numpy, matplotlib
└── data/ # jeux d'apprentissage et de décision
├── data_tp1_app.txt
├── data_tp1_dec.txt
├── data_tp2_app.txt
├── data_tp2_dec.txt
├── data_tp3_app.txt
└── data_tp3_dec.txt
Python 3.13, NumPy et Matplotlib. Aucune bibliothèque d'apprentissage automatique.
Valentin Fourdraine