Portfolio / Projets / sms-spam-detection

NLP · Deep learning · Projet académique

Comment filtrer les SMS indésirables sans bloquer les vrais messages ?

J’ai comparé deux façons de lire un SMS : un réseau de neurones qui suit l’ordre des mots (BiLSTM) et une méthode classique qui pèse les mots importants (TF-IDF + régression logistique). Les deux sont évaluées sur des messages qu’elles n’ont jamais vus.

98,32 %ExactitudeBiLSTM, test
0,930F1 spamBiLSTM, test
4Vrais messages bloquéssur 678
0,915F1 spamTF-IDF + rég. log.

Outils & technologies

Pythonscikit-learnTF-IDFBiLSTM / Keras

01 / Contexte & question

Un filtre anti-spam a deux façons d’échouer, et elles n’ont pas le même coût.

Chaque SMS reçu doit être classé ham (message légitime) ou spam (message indésirable : promotions, faux gains, numéros surtaxés).

Un filtre peut laisser passer un spam : c’est gênant. Il peut aussi bloquer un vrai message, par exemple un rendez-vous ou un code de connexion : c’est beaucoup plus grave pour l’utilisateur. Toute la suite du projet est donc construite pour mesurer ces deux erreurs séparément, et pas seulement un pourcentage global de bonnes réponses.

La question du projet

Sur ce jeu de données SMS, un modèle qui suit l’ordre des mots fait-il vraiment mieux qu’une méthode classique beaucoup plus simple ?

Avant de choisir un modèle, il fallait d’abord savoir à quoi ressemblent ces messages.

02 / Exploration des données (EDA)

L’exploration montre trois choses qui orientent toute la suite : déséquilibre, doublons, et un style propre au spam.

L’analyse exploratoire (EDA) consiste à regarder les données avant de modéliser : combien de messages, quelle proportion de spam, quelles anomalies, quelles différences visibles entre les deux classes. Elle sert à prendre les bonnes décisions de préparation et d’évaluation.

Ce que j’ai vérifié
  1. compté les messages de chaque classe et cherché les valeurs manquantes ;
  2. cherché les messages en double ;
  3. comparé la longueur des messages ham et spam ;
  4. listé les mots les plus fréquents de chaque classe.
Messages bruts5 572

4 825 ham et 747 spam, aucune valeur manquante.

Doublons exacts415

Retirés avant tout découpage.

Messages uniques5 157

4 516 ham et 641 spam.

Répartition ham et spam
Seulement 12 % des messages sont des spams : une exactitude (accuracy) élevée ne suffira pas à juger le modèle.
Longueur des messages par classe
Les spams sont nettement plus longs : médiane de 148 caractères contre 53 pour les vrais messages.
Mots les plus fréquents dans les spams
Dans les spams : free, txt, stop, claim, prize, cash, et des liens.
Mots les plus fréquents dans les vrais messages
Dans les vrais messages : un langage de conversation (ok, know, like, come, love).
Ce que ces constats changent pour la suite

Le déséquilibre impose de suivre la précision et le rappel sur le spam plutôt que l’exactitude. Les doublons doivent être retirés avant le découpage, sinon un même message pourrait être appris puis « reconnu » au test. Les liens et le vocabulaire commercial montrent qu’il ne faut pas effacer ces indices au nettoyage.

Ces observations ont directement guidé la façon de préparer le texte.

03 / Préparation du texte

Un nettoyage volontairement léger, pour garder les indices utiles au filtre.

Les transformations appliquées à chaque SMS
  1. passage en minuscules (« FREE » et « free » deviennent le même mot) ;
  2. remplacement de chaque lien par le mot urltoken : l’adresse exacte change d’un spam à l’autre, mais la présence d’un lien est un signal ;
  3. suppression de la ponctuation et des espaces multiples ;
  4. codage des étiquettes : ham = 0, spam = 1.

Je n’ai pas supprimé les mots courts ni les chiffres : dans les SMS, « txt », « 150p » ou un numéro court sont justement typiques du spam, comme l’a montré l’exploration.

Une fois les messages préparés, il fallait organiser l’évaluation avant d’entraîner quoi que ce soit.

04 / Découpage apprentissage, validation, test

Trois jeux de messages séparés, chacun avec un rôle précis.

Apprentissage · 3 609les modèles apprennent
Validation · 774réglages et seuil
Test · 774évaluation finale, une seule fois

Le vocabulaire du BiLSTM et les poids TF-IDF sont appris uniquement sur les 3 609 messages d’apprentissage. Sinon, des mots présents seulement dans le test influenceraient le modèle, et le résultat serait trop optimiste.

Avec ce cadre en place, j’ai pu entraîner deux approches très différentes dans les mêmes conditions.

05 / Deux modèles, deux façons de lire un SMS

Un modèle qui suit l’ordre des mots, face à une méthode qui pèse les mots importants.

A · BiLSTM

textenuméros de motsembeddingBiLSTMprobabilité de spam

B · TF-IDF + régression logistique

textepoids TF-IDFrégression logistiqueprobabilité de spam
Comment j’ai entraîné le BiLSTM
  1. chaque SMS est ramené à 33 mots : la longueur de 95 % des messages d’apprentissage (les plus courts sont complétés, les plus longs coupés) ;
  2. des poids de classe donnent plus d’importance aux erreurs sur le spam, minoritaire ;
  3. l’entraînement s’arrête quand l’erreur sur la validation ne baisse plus (arrêt anticipé), avant que le modèle n’apprenne par cœur.
Erreur du BiLSTM pendant l’entraînement, en apprentissage et en validation
L’erreur d’apprentissage continue de baisser, mais celle de validation se stabilise dès la deuxième époque : c’est le signal pour arrêter.

Les deux modèles produisent une probabilité ; restait à décider à partir de quand un message est déclaré spam.

06 / Choix du seuil de décision

Le seuil décide du compromis entre spams laissés passer et vrais messages bloqués.

J’ai testé les seuils sur le jeu de données de validation et gardé celui qui donne le meilleur F1 spam : 0,83 pour le BiLSTM et 0,56 pour TF-IDF + régression logistique. Le seuil élevé du BiLSTM suggère des probabilités très tranchées sur les spams nets : il peut exiger une forte certitude avant de bloquer.

Fixé avant le test.

Les deux seuils ont été figés avant la moindre évaluation sur le jeu de données de test, pour que le résultat final ne soit pas ajusté sur les messages servant à le mesurer.

Les modèles et leurs seuils étant fixés, le jeu de données de test pouvait enfin être utilisé.

07 / Résultats sur le test

Le BiLSTM gagne, mais d’une courte tête.

Le jeu de données de test contient 774 messages : 678 vrais messages et 96 spams.

ModèleExactitudePrécision spamRappel spamF1 spam
BiLSTM98,32 %95,60 %90,62 %0,930
TF-IDF + rég. logistique97,93 %93,48 %89,58 %0,915
Comparaison des deux modèles sur le test
Les deux approches sont proches sur toutes les métriques.
Matrice de confusion du BiLSTM
BiLSTM : 4 vrais messages bloqués, 9 spams laissés passer.
Matrice de confusion TF-IDF + régression logistique
TF-IDF : 6 vrais messages bloqués, 10 spams laissés passer.

Ces chiffres sont proches ; la vraie question devient : lequel choisir, et pourquoi ?

08 / Interprétation & valeur réelle

Le meilleur score ne désigne pas toujours le meilleur choix en production.

Le BiLSTM bloque deux vrais messages de moins et arrête un spam de plus : c’est le meilleur classifieur de l’expérience. Mais la méthode TF-IDF reste très proche, et elle obtient même des aires sous les courbes ROC et précision-rappel légèrement supérieures, c’est-à-dire un classement des messages tout aussi bon quand on fait varier le seuil.

En pratiqueChoisir selon le contexte

Le BiLSTM si chaque vrai message bloqué compte ; TF-IDF si la vitesse, la simplicité de mise à jour et l’explicabilité priment, puisqu’on peut lire directement les mots qui pèsent sur la décision.

Ce que montrent les erreursLe rappel est le point à améliorer

Avec 13 erreurs sur 774 messages, le BiLSTM se trompe rarement. Mais 9 spams sur 96 passent encore, soit près d’un sur dix : c’est là que des données plus récentes ou un modèle plus riche auraient le plus d’effet.

Reste à être clair sur ce que cette expérience prouve, et sur ce qu’elle ne prouve pas.

Décision : le BiLSTM est le meilleur classifieur testé, mais l’écart est suffisamment faible pour que TF-IDF + régression logistique reste un choix crédible lorsque simplicité, vitesse et explicabilité comptent davantage.

09 / Limites & apprentissages

Un résultat solide sur ce jeu de données SMS, à confirmer sur des SMS récents.

  • Jeu de données SMS (corpus) ancien et anglophone : le vocabulaire du spam a évolué.
  • Apprentissage et test viennent de la même source : pas de validation sur un autre jeu de données.
  • Pas de mesure de vitesse ni de mémoire, qui compteraient pour un déploiement.
Ce que j’ai appris

Comparer un modèle complexe à une méthode simple, avec le même découpage et un seuil choisi en validation, est plus instructif qu’un score isolé. Ici, le BiLSTM gagne, mais l’écart faible montre surtout qu’un modèle plus complexe n’est utile que si son gain justifie son coût d’exploitation.

Pour aller plus loin

Prochaines étapes envisagées : tester sur un jeu de données de SMS récents, essayer un modèle de type transformer et régler le seuil selon le coût réel de chaque erreur. Le notebook détaille chaque étape et ses résultats.

Projet suivant

Classification de fragments de verre : classifier un petit jeu de données chimique sans surévaluer le modèle.