Skip to content

About

Classical classification methods implemented from scratch with NumPy: Gaussian estimation, kNN, Parzen windows, perceptron and bagging

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

1 Commit

Folders and files

Repository files navigation

Classification statistique : implémentation et comparaison de méthodes

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.


Utilisation rapide

pip install -r requirements.txt   # installe numpy et matplotlib
jupyter notebook notebook_projet.ipynb

Le 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.


1. Contexte et objectif

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.

2. Données

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.

3. Méthodes implémentées

Partie I — Estimation de gaussiennes

  • Classifieur par distance euclidienne minimale
  • Classifieur par distance de Mahalanobis minimale, avec estimation des matrices de covariance par classe

Partie II — K plus proches voisins

  • 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)

Partie III — Fenêtres de Parzen

  • Estimation de densité par noyau uniforme et par noyau gaussien
  • Choix de la largeur de fenêtre h par validation croisée à 5 plis

Partie IV — Séparation linéaire

  • 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

Partie V — Bagging

  • 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.

4. Résultats

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.

5. Structure du dépôt

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

6. Dépendances

Python 3.13, NumPy et Matplotlib. Aucune bibliothèque d'apprentissage automatique.

7. Auteur

Valentin Fourdraine

About

Classical classification methods implemented from scratch with NumPy: Gaussian estimation, kNN, Parzen windows, perceptron and bagging

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages