top of page

MNIST Express - 8/8 - Ce que le projet m'a appris sur le Machine Learning

  • 18 mars
  • 4 min de lecture

Dernière mise à jour : 22 mars

Lien vers le repo du projet : https://github.com/vohorgeez/MNIST-Express


Ah, ça y est, le dernier article, le bout du tunnel... Et la fin du projet ! Le moment de se retourner et de faire le bilan de ce qu'on a appris...


Un mot d'abord sur MNIST : on le présente souvent comme le "Hello World" du Machine Learning. Et c'est vrai : un dataset simple, des chiffres en noir et blanc, un problème de classification presque scolaire. Commencer par là était une sorte d'évidence cosmique.


Sur le papier, tout semble clair : on entraîne un modèle, on mesure une accuracy, et on passe à autre chose (des trucs plus palpitants par exemple ?).


En construisant MNIST Express, je pensais d'abord suivre ce chemin. Pondre un projet vite fait, histoire de cocher la case "vu" ✅ et basta... Mais en réalité, avec toutes les libs à disposition (coucou scikit-learn) et surtout à l'ère de l'IA et du vibecoding, il y a une différence nette entre "pondre un projet" et comprendre son fonctionnement en profondeur. C'est même la raison d'être de ces articles : comprendre le fonctionnement profond est plus intéressant que juste peupler un portfolio...


Et surtout, ce projet en particulier m'a montré que le Machine Learning, comme tout autre type de projet, devient intéressant - et plus complexe - dès qu'il quitte le notebook.



Un modèle ne voit jamais le monde comme un humain


Dans un dataset comme MNIST, tout est propre:

  • les chiffres sont bien centrés

  • les dimensions sont fixes (28x28)

  • le bruit est contrôlé


Un utilisateur, lui, ne respecte absolument rien de tout ça (et hors de question d'exiger ça de lui).


Il dessine trop petit, trop grand, décalé, mal centré... c'est là que le vrai travail commence.


Avant même de faire une prédiction, il faut transformer ce dessin en quelque chose de comparable au dataset d'entraînement. Dans le projet, cela passe par toute une chaîne de traitement :

  • binarisation pour détecter les pixels utiles

  • détection de la zone pertinente

  • recadrage

  • redimensionnement

  • recentrage via le centre de masse


Autrement dit, le modèle ne voit jamais le dessin brut : il n'en voit qu'une interprétation (ce n'est finalement pas si différent du travail de traduction d'une langue à une autre).


C'est sans doute la première leçon importante (et qui ramène le ML dans le monde réel) :

en Machine Learning appliqué, le problème n'est pas seulement d'entraîner un modèle, mais de rendre les données comparables.

Une bonne accuracy n'est que la partie émergée de l'iceberg

Inutile de refaire ici notre précédent article sur l'accuracy. Mais c'est vrai qu'il est tentant de s'en tenir à ce chiffre, au début.


Rien de plus simple avec MNIST cependant, puisque ce chiffre est assez facilement très bon.


Mais en creusant un peu, on découvre rapidement :

  • que certaines classes sont mieux reconnues que d'autres

  • que certaines erreurs reviennent régulièrement

  • que des chiffres visuellement proches (comme 8 et 9) posent plus de problèmes


La confusion matrix devient alors plus intéressante que l'accuracy globale. Elle montre où le modèle se trompe, pas seulement à quel point il est "bon".


Et surtout, elle révèle une chose essentielle :

une moyenne flatteuse peut masquer des comportements fragiles.

Dans un contexte réel, ces erreurs localisées comptent souvent plus que la performance globale. Parce que ce sont elles que l'utilisateur va voir.


Optimiser un modèle, ce n'est pas seulement améliorer son score


Un autre piège classique consiste à croire que le progrès en Machine Learning passe uniquement par de meilleurs modèles.


Dans ce projet, j'ai comparé plusieurs stratégies pour k-NN :

  • brute force

  • KD-Tree

  • Ball-Tree


Intuitivement, on pourrait penser que les structures les plus avancées sont les plus efficaces. Et bien, en pratique, il s'avère que dans un espace à 784 dimensions, ce n'est pas le cas.


Le résultat est presque contre-intuitif :

  • toutes les méthodes donnent la même accuracy

  • la méthode la plus "simple" (brute) est la plus rapide


Autrement dit :

plus complexe ne veut pas dire meilleur

Mais le vrai gain ne vient même pas de là. Il vient du batching d'inférence : plutôt que de prédire un point à la fois, on regroupe les requêtes.


Résultat :

  • un débit multiplié

  • des performances bien plus adaptées à une application réelle


Une prédiction : juste un chiffre ?


Dans un notebook, une prédiction se résume souvent à une classe. Dans une application, ce n'est pas suffisant. Dans MNIST Express, chaque prédiction s'accompagne :

  • d'une probabilité (niveau de confiance)

  • un top 3 des classes possibles

  • un temps d'inférence


Le modèle ne dit plus seulement "c'est un 7", il préfère dire :

ALORS, je PENSE que c'est un 7, j'en suis sûr à 92%, mais il y a une chance non nulle que ce soit en fait un 1 ou un 9, et dans tous les cas j'ai mis 12 ms à répondre.

Grosso modo.


On passe d'un système qui produit une réponse à un système qui explique et contextualise cette réponse (et en plus, il gagne en prudence, ce qui est toujours appréciable... non ?).


Le Machine Learning réel est aussi un problème d'ingénierie


Enfin, ce projet m'a appris quelque chose de très concret : le Machine Learning ne se résume pas à un modèle. Il faut aussi :

  • séparer clairement entraînement (offline) et inférence (online)

  • éviter tout 'fit' en production

  • versionner les artefacts

  • centraliser la configuration

  • structurer le code en modules cohérents

  • écrire des tests, même sur des comportements flous


L'architecture du projet reflète ces contraintes :

  • un module pour le preprocessing

  • un module pour l'entraînement

  • un module pour l'inférence

  • un module pour les métriques

  • un module pour le monitoring


Et pourtant, même avec cette architecture, tout n'est pas parfaitement aligné. Certaines décisions sont des compromis et c'est normal.

Un projet réel n'est jamais une implémentation parfaite d'un design théorique, mais plutôt une série d'arbitrages entre propreté, temps et pragmatisme.

Conclusion

Au départ, MNIST Express était un exercice simple : reconnaître des chiffres manuscrits.

Mais au final, ce projet m'en a beaucoup appris (et ce "beaucoup" tient dans 8 articles !).

Il m'a appris que le Machine Learning réel, ce n'est pas :

  • seulement un modèle

  • ni seulement une métrique

C'est un ensemble de problèmes :

  • transformer des données imparfaites

  • comprendre ses erreurs

  • optimiser les performances

  • exposer des résultats compréhensibles

  • observer le comportement du système

  • structurer correctement le code


In other words :

Le Machine Learning commence vraiment quand on regarde ailleurs que juste le modèle.

Comme quoi, un simple projet sur des chiffres n'aura pas été vain !

Commentaires


RETROUVEZ-MOI

  • X
  • GitHub
  • LinkedIn
  • Instagram
  • YouTube
bottom of page