De la donnée brute à une prédiction correcte à 98,44%

Détecter les spams est une problématique commune dans les problèmes de NLP. Les étapes sont toujours les mêmes, les résultats, eux, dépendent de la finesse de la tâche.

Articles liés : Nettoyage complet d’un corpus, Extraction des caractéristiques et Quelles métriques choisir ?

Comment détecter les spams ? Photo by Markus Winkler on Unsplash

Pour cet article, nous utilisons le jeu de données téléchargeable ici. Il contient 5 572 sms, classés spam ou non. Le jeu de données et les sms ont besoin d’un nettoyage avant de pouvoir réaliser la moindre classification.

Aperçu du jeu de données

Sommaire

  • Analyse exploratoire (courte)
  • Nettoyage et extraction des caractéristiques
  • Classification
  • Améliorons les résultats

1. Analyse exploratoire

Avant de nettoyer les SMS, une petite analyse statistique s’impose. Celle-ci est très courte puisque nous n’avons que deux colonnes : les SMS et leur classe d’appartenance. Nous ne pouvons guère que regarder la répartition des classes et la taille des messages.

Répartition des classes

Nous sommes clairement dans une situation d’imbalanced class : la classe non-spam est sur-représentée. Voyons tout de suite la taille des messages.

Histogramme des tailles des messages

On voit que les spams sont en moyenne plus longs que les SMS non-spams (ham). Mais il n’y a pas une séparation claire entre les deux classes. Il existe aussi de longs SMS qui ne sont pas des spams.

En parlant de longs SMS, petite pause romantique avec le SMS le plus long de notre corpus (910 caractères) :

"For me the love should start with attraction.i should feel that I need her every time around me.she should be the first thing which comes in my thoughts.I would start the day and end it with her.she should be there every time I dream.love will be then when my every breath has her name.my life should happen around her.my life will be named to her.I would cry for her.will give all my happiness and take all her sorrows.I will be ready to fight with anyone for her.I will be in love when I will be doing the craziest things for her.love will be when I don't have to proove anyone that my girl is the most beautiful lady on the whole planet.I will always be singing praises for her.love will be when I start up making chicken curry and end up makiing sambar.life will be the most beautiful then.will get every morning and thank god for the day because she is with me.I would like to say a lot..will tell later.."

2. Nettoyage et extraction des caractéristiques

Comme expliqué dans des précédents articles, plusieurs étapes sont nécessaires avant de pouvoir travailler avec les algorithmes de machine learning :

Après nettoyage, nos messages ressemblent à cela :

SMS nettoyés

Nous pouvons maintenant extraire les caractéristiques.

Nous allons nous intéresser aux mots spécifiquement présents dans les spams (“win”, “free”…). Avec seulement 13 % des sms qui sont des spams, le vectorizer TF-IDF semble tout indiqué.

Code d’extraction des caractéristiques en utilisant le vectoriser TF-IDF
Extrait du vocabulaire :  ['aa', 'aah', 'aaniye', 'aaooooright', 'aathi', 'abbey', 'abdoman', 'abeg', 'abel', 'aberdeen', 'abi', 'ability', 'abiola', 'abj', 'able', 'abnormally', 'aboutas', 'abroad', 'absence', 'absolutely', 'absolutly', 'abstract', 'abt', 'abta', 'aburo', 'abuse', 'abuser', 'academic', 'acc', 'accent', 'accenture', 'accept', 'access', 'accessible', 'accidant', 'accident', 'accidentally', 'accommodation', 'accommodationvoucher', 'accomodate'...]

Matrice TF-IDF
[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]

Dimensions matrice : (5571, 6400)

Ceci étant fait, nous allons pouvoir classifier automatiquement les SMS spams.

3. Classification

Pour des problèmes de classification comme celui-ci, le classifieur bayésien naïf est une référence. Sa classification est basée sur le théorème de bayes. Elle suppose simplement l’indépendance des caractéristiques et les regardent une par une sans prendre en compte l’ensemble. C’est pourquoi il est appelé “naïf” car dans la vraie vie, il existe une dépendance entre les différentes caractéristiques. Par exemple, si l’on cherche à prédire le genre d’une personne à partir de son poids et sa taille (les caractéristiques), ce théorème va les considérer indépendamment alors que taille et poids sont en partie corrélés.

Les maths liées à ce classifieur seront vues dans un autre article. Voyons comment la bibliothèque Sklearn peut nous aider à détecter les spams.

Classification en utilisant le classifieur naïf bayesien
Nombre d'erreurs commises : 28 sur 1672 prédictions (Accuracy : 98.33 pourcent)

C’est pas mal ! C’est même très bien ! En entreprise, on commencerait à avoir le sourire. Mais l’accuracy seule n’informe pas beaucoup, car si nous avions classifié tous les sms en non-spam, nous aurions une accuracy de 86 %…, ce qui est déjà honorable mais inutile.

Ce qui nous importe bien plus, c’est la matrice de confusion permettant de mesurer si notre algorithme classifie trop facilement des sms en tant que spam ou si, au contraire, il en oublie.

Matrice de confusion : 
[[1418 10]
[ 18 226]]

Que nous dit cette matrice ? Elle nous dit que sur les 244 spams que nous aurions dû détecter, nous n’en avons détecté que 226 (soit 18 d’oubliés). Pire que ça ! 10 sms non-spam ont été classifiés en tant que spam ! Je ne sais pas vous, mais moi j’ai horreur d’aller chercher des messages dans les spams.

Notre algorithme bayesien naïf est bien, mais pas suffisant. Cherchons autre chose.

Améliorons les résultats

Pour améliorer nos résultats, plusieurs options s’offrent à nous :

  • Travailler les données (feature engineering)
  • Manipuler le vectorizer tf-idf OU en utiliser un autre
  • Paramétrer plus efficacement notre classifieur
  • Utiliser un autre classifieur

J’ai évidemment testé chacune de ces options avant de vous proposer la plus efficace : utiliser un autre classifieur ET manipuler le vectorizer.

Cette fois-ci nous utilisons le classifieur Random Forest. Lui aussi sera expliqué dans un prochain article. Les paramètres choisis “max_feature” et “random_state” sont issus d’une sélection minutieuse et ne sont pas choisis au hasard. Voyons les résultats :

Extrait du vocabulaire :  ['aah', 'aathi', 'abi', 'ability', 'abiola', 'abj', 'able', 'absolutly', 'abt', 'abta', 'aburo', 'academic', 'acc', 'accept', 'access', 'accident', 'accidentally', 'accordingly', 'account', 'accounts', 'ache', 'acl', 'aco', 'across', 'act', 'action', 'activate', 'active', 'activity', 'actor', 'actual', 'actually', 'adam', 'add', 'addamsfa', 'addict', 'addie', 'address', 'admin', 'administrator'...]Matrice TF-IDF 
[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]
Dimensions matrice : (5571, 4000)Nombre d'erreurs commises : 26 sur 1672 prédictions (Accuracy : 98.44 pourcent)Matrice de confusion :
[[1428 0]
[ 26 218]]

Voilà qui est très intéressant ! En utilisant le classifieur Random Forest, nous commettons moins d’erreurs qu’avant, mais cette fois, nous n’avons aucun faux positif. C’est-à-dire que nous n’avons jamais classifié en tant que spam un sms qui ne l’était pas.

Le F1-Score pour cette prédiction vaut 0.99 ce qui est presque parfait.

On pourrait chercher à améliorer notre algorithme, réduire un par un le nombre de faux négatifs, mais le risque serait que notre algorithme sur-apprenne et soit moins capable de détecter les spams dans de nouveaux textes. D’un point de vue entreprise, si l’on rate 26 sms sur 1 672, ce n’est pas la mort, les perspectives d’amélioration (quelques sms tout au plus) ne valent pas plusieurs heures de travail acharné. Il en serait différemment s’il s’était agi de détection de fraudes bancaires ! Dans ce cas, on aurait préféré se tromper en considérant une fraude qui ne l’est pas, plutôt que d’en laisser passer 26.

Conclusion

On a vu dans cet article comment, à partir de données brutes, extraire des informations et en déduire un modèle qui nous permette d’apprendre et de classifier automatiquement des SMS spams. Le prochain article concernera les métriques d’évaluation d’un algorithme afin de savoir s’il performe bien ou non.

Merci de votre lecture, n’hésitez pas à laisser un commentaire ou à poser vos questions !

Data scientist jr & Javascript + Python full-stack developer… ok I like tech and do all kind of stuff

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store