top of page

L’IA pour lutter contre les arnaques

L'article original est publié sur Medium via le compte de La Javaness R&D.

Nous vous recommandons de consulter l'article original sur le site Medium pour visualiser l'ensemble des illustrations et exemples.

 

Clustering des thématiques de spams

Photo de GuerrillaBuzz Blockchain PR Agency sur Unsplash


Introduction

Données

Les données traitées sont des mails reçus par des particuliers et signalés à signal-spam. Ce genre de mails frauduleux peut venir sous plusieurs formats :

  • texte

  • texte + pièce jointe

  • photo (texte contenu dans une photo collée dans le mail)

  • une combinaison de tous ces formats.

Devant cette diversité de formats, nous nous sommes restreints dans notre étude que sur les mails contenant du contenu textuel ou plus précisément : contenant du contenu html que l’on réussira à lire via des outils tels que BeautifulSoup. Traiter le contenu des images était hors périmètre (tâche complexifiée par l’ajout d’un module d’OCR) et traiter le contenu des pièces jointes était dangereux et risqué (supposé infection par des malwares en tout genre). Par ailleurs, étant donné que ces mails proviennent de chez des particuliers qui ont eu le bon geste de les transférer à signal-spam, ils peuvent contenir des informations personnelles (noms/prénoms, adresses, téléphones…) — de cette manière les personnes malveillantes pensent les rendre plus “personnalisés” pour but de mettre leurs victimes en confiance — il est necessaire d’effectuer une anonymisation de ces mails avant de les restituer aux utilisateurs métier. On enchaîne ensuite avec une phase de détection des spams doublons (certains spams sont exactement les mêmes ou bien ne peuvent différer que par certains mots personnalisés). Pour un souci d’espace et de redondance, on prend soin de vérifier si le mails traité ne ressemble pas à un autre mail déjà étudié auparavant (ressemblance mesurée à l’aide de la distance de similarité cosine-similarity).

Modélisation

Contraintes

À partir de ces données, nous souhaiterions idéalement étudier l’évolution des tendances des spams afin de mieux protéger les internautes. En effet les personnes frauduleuses redoublent d’innovation pour rendre les arnaques moins reconnaissables et plus convaincantes, mais ils les envoient en masse aux victimes et les mots-clés restent (quasiment) les mêmes. Ce sont ces mots-clés là qu’on voudrait idéalement faire ressortir. Cela se présente alors comme un problème d’apprentissage non supervisé. Des contraintes nous étaient imposées pour des raisons techniques et architecturales :

  • pas d’apprentissage profond (indisponibilité de GPUs)

  • stabilité de ré-apprentissage : les traitements effectués sont périodiques (1 fois / semaine) et on ne voudrait pas intervenir en changeant et adaptant les hyper-paramètres à chaque fois avant le déploiement d’un modèle.

  • Passage à l’échelle possible : le flux de mails entrants par semaine avoisinait les ~100k mails, d’où la nécessité d’une méthode qui puisse facilement être mise à grande échelle et qui s’execute avec une complexité raisonnable (temporelle et spatiale).

  • peu de flexibilité sur l’utilisation de librairie “non conventionnelles” : on veut parler bien sûr de solutions disponibles par des tiers sur Github et qui ne sont pas/peu utilisées à grandes échelles et non autorisées par le pôle sécurité informatique du régulateur en question.

Chargement des mails

On utilise la librairie exchangelib afin de récupérer les mails à traiter. La librairie est très adaptée pour notre tâche et dispose de multitudes de paramètres à fixer afin d’accélérer la récupération des mails.

Processing

En ayant toutes ces points importants en tête, nous sommes donc partis sur l’approche suivante : 1- Suppression des “stop-words” et lemmatization : En utilisant un dictionnaire de mots définis (disponible via la librairie nltk ), nous commençons par parcourir les mots de chaque mail pour supprimer les “stop-words” (le, les, et, donc …) N.B : On a bien pris soin de ne pas exclure certains mots tels que ‘or’ qui peut être une conjonction de coordination mais qui porte en même temps sur le minerai (objet de plusieurs arnaques), d’où l’importance de la discussion avec les utilisateurs finaux de toute application Machine Learning. Par ailleurs, on retrouve tout type d’erreurs dans les spams (erreurs de traductions principalement, typos…), on procède par éliminer les mots dont la longueur de caractères est inférieure ou supérieure à un certain seuil (2–24 pour notre cas) et on ne garde que les radicaux des mots afin d’éviter d’avoir à traiter plusieurs occurrences d’un certain mots à quelques lettres de différences près (les mots “finance”, “finances”, “financer” vont être transformer en un seul terme “financ”) N.B : Parfois, certaines de ces erreurs sont volontairement introduites afin que le spam ne soit pas détecté par les filtres anti-spams qui se basent sur des techniques naïves de détection.



Des caractères de 1px sont intercalés entre chaque caractère de taille normale. Exemple de code de processing :

2- Vectorization des mails via TF-IDF :

  • Cette méthode de vectorization permet de trouver un encodage adéquat qui concilie entre rareté et importance d’un certain mot (le poids d’un mot augmente proportionnellement au nombre d’occurrences du mot dans le document mais il varie également en fonction de sa fréquence dans le corpus — l’ensemble des documents à traiter — )

  • L’implémentation sur scikit-learn ou sur gensim de cette méthode est assez optimisée pour vectorizer un grand nombre de documents.

Certes en se basant sur cette vectorization on ignore le contexte des mots clés dans leur mail d’origine, mais cela semblait largement suffisant pour la tâche à accomplir. N.B 1 : Nous avons également étudié la possibilité d’utiliser des vecteurs de mots tels que FastText (qui sont des vecteurs de meilleurs qualités que les TF-IDF) mais le compromis performances/rapidité d’exécution nous a fait choisir une approche classique. N.B 2 : Afin de détecter les mots clés d’un document, on a testé l’approche K-cores qui revient à modéliser un texte par un graphe (chaque noeud est un mot et chaque lien représente la co-occurrence des deux mots dans une fenêtre glissante à largeur définie préalablement), le poids d’un lien est proportionnel à la fréquence de co-occurence. Le but étant d’accélérer la vectorization en ne traitant que les mots considérés importants. Mais cela impliquait d’effectuer plusieurs choix techniques qui rendait les résultats obtenus via cette méthode instables (largeur de la fenêtre glissante, quel k-cores considérer, des stop-words non filtrés -non présents dans la liste de nltk mais considéré comme stop-words par le métier- apparaissent comme mots clés- )


“Mathematical aspects of computer-aided share trading. We consider problems of statistical analysis of share prices and propose probabilistic characteristics to describe the price series. We discuss three methods of mathematical modeling of price series with given probabilistic characteristics.”, Window = 8 words

Segmentation

  • K-means :

Quand on parle de segmentation, une des premières méthodes qui nous vient à l’esprit est l’algorithme de “K-means”. Cette méthode permet de diviser le dataset (documents) en K groupes de façon à minimiser une certaine fonction (dans notre cas, ce serait la distance Euclidienne). On considère la distance d’un point à la moyenne des points de son cluster, la fonction à minimiser est la somme des carrés de ces distances. K-Means assigne un unique topic à chaque document, mais en pratique en un document ne contient pas toujours un seul et unique topic mais plutôt un mix de topics, chose que K-means ne peut représenter. De plus, le besoin formulé va plus loin que simplement “grouper les mails par similarité de thèmes abordés”, on voudrait également extraire les mots-clés qui ont permis de catégoriser chaque document à un groupe donné. Cela est totalement possible avec des heuristiques et des analyses sur les clusters retournés par la méthode K-means. On a donc préféré l’approche LDA pour cela puisqu’elle permet de réaliser les deux objectifs conjointement (détermination de topics et leurs mots-clés respectifs ainsi que représenter un document comme un mélange de topics).

  • LDA : Latent Dirichlet Allocation



L’idée principale derrière cet algorithme est de construire un modèle (une loi) qui va nous générer un ensemble de mots qui constituent notre document synthétique. On ira ensuite comparer ce document créé à un vrai document dans notre corpus pour évaluer la qualité de génération de documents de notre loi. Une fois que l’on est satisfait de la qualité et cohérence des documents que nous génère cette loi, on ira analyser ses paramètres “appris” afin de determiner : les topics et les mots-clés de chaque topic correspondants aux jeu de données utilisé pour “entraîner” notre modèle. Ces excellentes videos illustrent très bien le fonctionnement de l’algorithme et la méthode d’optimisation utilisée pour entrainer le modèle. On utilise la librairie gensim afin d’entraîner un modèle LDA. De plus, la librairie propose aussi :

  • une méthode pour vectorizer notre corpus en TF-IDF (mais également en Bag-of-words).

  • un apprentissage géré en Multicore via gensim.models.LdaMulticore qui permet n’accélérer l’entraînement en répartissant les tâches sur un nombre de workers défini en paramètre.

Une fois l’entrainement effectué (la métrique d’évaluation est la cohérence moyenne des clusters trouvés), il ne reste plus qu’à restituer les résultats obtenus (en prenant soin de les stocker pour une ré-utilisation future sur une base de données — SQL par exemple — ou bien sur l’espace disque).

Résultats

Afin de visualiser les topics, on utilise la librairie pyLDAvis qui effectue une réduction de dimension en 2D puis représente, sous forme de cercles, les centres des clusters — plus les centres sont éloignés, moins les topics sont similaires et vice-versa-. La taille des cercles quand à elle représente la proportion de documents du corpus auxquels ce topic est attribué. La couleur représente enfin la “cohérence” de ce topic : une métrique qualifiant la confiance du modèle quand à la qualité et homogénéité du topic détecté (vert : topic homogène, rouge : topic moins homogène), cette métrique est sur la base de la similarité (vectorielle) entre les mots constituant un même topic. Les principaux paramètres pour étoffer les analyses des clusters sont :

  • La durée temporelle de l’analyse : Clustering effectué sur les mails des X semaines précédentes.

  • Le choix de la date d’analyse : afin de voir l’évolution des clusters trouvés semaine/semaine

  • Inclure les doublons ou pas : On prend en compte la multiplicité des mails dans la construction des vecteurs TF-IDF et donc la construction des clusters.

  • Le nombre de thèmes recherchés : Afin d’avoir une stabilité des résultats et des analyses cohérentes, des nombres de clusters ont été définis conjointement avec les utilisateurs de l’application au lieu de le définir automatiquement via des méthodes comme “Elbow method” ou bien faire du clustering hiérarchique.



On affiche également les mots-clés de chaque cluster (la section “mots groupés” affiche les mots qui donnent le même radical).


Cluster autour du topic : vin/vignoble… Ces deux écrans permettent de parcourir les clusters (Nous préconisons l’analyse des clusters “verts” ), afin de visualiser l’évolution des tendances des spams. Des exemples concrets de détection des de signaux faibles :

  • Une tendance d’arnaque à la “vache laitière”

  • Une émergence des arnaques autour de matériel médical (masques…) en début de la période “Covid”

  • Une émergence des arnaques d’investissements dans la crypto-monnaie (Bitcoin, Ethereum…)

Conclusion et perspectives

Nous voici arrivés à terme de ce blog relatant comment La Javaness R&D a développé un module d’analyse d’évolution des tendances de spams pour le compte d’un régulateur Français. Évidemment, l’application déployée était beaucoup plus complexe (boucles de retour pour l’ajout de “stop-words” métier -mots non intéressants pour les analyses futures-, ré-entrainements, optimisations pour le passage à l’échelle…) mais ce qui a été présenté dans ce blog représente le coeur de l’application à savoir : un apprentissage non supervisé à l’aide de la LDA. Cette solution présente néanmoins des limitations. On a observé des clusters “rouges” (sur lesquels le modèle n’est pas bien confiant de leur cohérence), cela indique qu’il faudrait modifier certains paramètre et ajuster l’entraînement en fonction des données. Mais étant donné que cela n’est pas envisageable à long terme, on pourrait par exemple imposer des contraintes (des à-priori) sur les clusters à trouver, chose qui peut être faite via la “Guided-LDA” qui permet de forcer le modèle à constituer des clusters qui contiennent certains mots dont on a une connaissance préalable, ce qui donne plus de contrôle et de liberté aux experts métiers sur l’entraînement et donc par la même occasion augmente la qualité des clusters constitués.

Remerciement

Merci à notre collègue Anh VU pour la revue de l’article.

A propos de l’auteur

Al Houceine KILANI est data scientist à La Javaness depuis 2020.

34 vues0 commentaire
bottom of page