Il y a un an, je gagnais pour mon équipe la médaille d’or sur l’épreuve de Machine Learning lors de l’@EuCyberCup.
Dans ce thread on va parler de quelques outils fondamentaux d'IA, puis je vous explique comment j'ai obtenu un score parfait sur ce challenge.
Tout d'abord, le principe du challenge : à partir d'un très grand volume de logs sur le réseau d'une entreprise (factice) de 2500 employés, nous devions retrouver les utilisateurs malveillants en détectant leurs comportements suspects.
Ce genre d'application de l'IA à la cybersécurité est hyper intéressant dans le monde réel, car l'automatisation décuple la performance de traitement et les sources d'information tout en permettant une détection et un traitement des attaques quasi-instantanément.
À ce sujet, j'ai assisté le mois dernier à une conférence de @JamesAtack, responsable du CERT (centre de gestion des incidents cyber) de la Banque de France, qui expérimente exactement ce genre d'IA de détection sur les systèmes que supervise son équipe !
Revenons-en à notre épreuve : il s'agit d'une tâche de classification supervisée, qui représentent une grande partie des problèmes d'IA actuels (et pour lesquels il existe plein de méthodes de résolution).
Classification supervisée, ça veut dire quoi ?
Dans un problème de classification, on cherche à appliquer des étiquettes et/ou prendre une décision sur la donnée fournie. Quelques exemples:
- Filtrage anti-spam
- Reconnaissance de visages
- Maintenance prédictive et détection d'anomalies
- Analyse de thématiques dans un texte
Lorsque le machine learning est dit "supervisé", c'est quand on dispose de plein d'exemples déjà étiquetés, qui permettent à l'algorithme de comprendre et apprendre les patterns qu'il doit extraire.
Ça représente une grande majorité des problématiques actuelles en IA.
Alors c'est vrai qu'on a du mal à se représenter le contraire, un algorithme "non supervisé" : si on ne lui explicite pas sa mission de classification, comment peut-il deviner les règles à appliquer ?
En fait, on a un exemple très simple parmi tant d'autres : le clustering.
Sur l'épreuve d'IA de l'#EC2, chaque utilisateur était étiqueté (inoffensif ou malveillant), ce qui nous permettait donc un apprentissage supervisé.
Le roi de cette discipline, vous le connaissez sûrement, c'est le réseau de neurones.
Un réseau de neurones, c'est quoi ? Perso j'ai longtemps cru que c'était une puce hardware ultra complexe qui permet d'imiter le cerveau humain, mais en fait c'est BEAUCOUP plus simple que ça : un réseau de neurones, c'est un enchaînement d'additions et de multiplications.
Ça s'appelle ainsi car c'est une modélisation du fonctionnement du cerveau animal, dont les impulsions électriques entre les neurones utilisent des principes similaires à ces opérations mathématiques et sont capables d'apprendre en modifiant les variables du système.
Je ne vais pas entrer dans plus de détails, mais si ça vous intéresse d'en apprendre davantage je ne peux que vous conseiller l'excellente série de vidéos créées par @3blue1brown sur le sujet : youtube.com/playlist?list=…
En revanche, dans le cadre de l'#EC2, les réseaux de neurones ne sont pas les plus adaptés. Pour apprendre correctement, il leur faut énormément de données d'entraînement, ou alors un modèle ridiculement petit qu'on peut finalement remplacer par quelque chose de plus efficace.
Et justement, parmi ces modèles simples et puissants, il y en a un que j'apprécie en particulier. Vous avez déjà entendu parler des arbres de décision ?
Voici par exemple un arbre de décision qui détermine à quel âge vous avez le droit de passer le permis :
Ces arbres sont simplement une modélisation d'un processus de décision, à la base ils n'ont rien à voir avec le machine learning.
On commence au noeud tout en haut, on évalue l'expression qu'il contient, on emprunte le chemin qui correspond au résultat et ainsi de suite.
Les arbres de décision sont super faciles à implémenter sous forme de programme informatique, on peut tout coder avec des if/else imbriqués !
Le lien avec le machine learning, c'est qu'il existe des algorithmes qui peuvent les générer en s'appuyant sur un ensemble de décisions existantes.
Une fois l'apprentissage terminé, on peut donc utiliser l'arbre pour prendre une décision sur une donnée jamais vue auparavant.
On pouvait parfaitement utiliser cet algorithme pour le challenge de détection de l'European Cyber Cup.
L'apprentissage a besoin de données qui sont organisées et bien formatées. Impossible donc de lui filer les 60GB de logs fournis, il va falloir lui prémâcher le traitement.
Pour entraîner un arbre de décision efficacement ici, on va calculer pour chaque utilisateur plusieurs caractéristiques telles que :
- Nombre de connexions nocturnes
- Écart-type sur le nombre d'emails journaliers
- Niveau hiérarchique
On appelle ça du "feature engineering".
J'ai déterminé au total un ensemble de 41 valeurs "intéressantes" sur lequel serait basée la classification.
Ensuite, l'algorithme se charge de calculer un arbre de décision qui fait correspondre à chaque utilisateur sa classification réelle (inoffensif/malveillant).
Ce processus d'apprentissage est assez compliqué et pourrait faire l'objet d'un thread à part entière (#teasing), mais en résumé l'algorithme va essayer de trouver des critères de découpes successives qui vont séparer au mieux les données par catégorie.
Comme pour la plupart des tâches de machine learning, on n'a pas vraiment besoin d'implémenter l'algorithme car de nombreux packages le font déjà pour nous (et de manière optimisée). Notre vraie mission de data scientist, c'est le paramétrage du modèle et le feature engineering.
Le calcul des 41 features prend environ 3 minutes sur 300 lignes de Python (dont quelques calculs tricky non détaillés ici).
Pour l'apprentissage, toujours en Python, j'utilise le package Scikit-learn qui prend à peine 10 lignes et s'exécute en moins d'un millième de seconde !
La performance du modèle est déjà très correcte : le score (basé sur la mesure F1, très utilisé en machine learning) avoisine les 70%.
Mais avec une astuce très simple, on peut en réalité faire largement mieux.
En vérité, les arbres de décision sont peu utilisés tels quels en IA, à cause de leur taux d'erreur élevé.
Pour un même ensemble de données, on aura plein de configurations différentes d'arbres que l'algorithme pourra générer, sans savoir laquelle est la plus judicieuse.
À cause de leur simplicité, les arbres de décision ont du mal à généraliser et comprendre tous les cas particuliers du jeu de données d'apprentissage, surtout quand celui-ci est petit comme dans notre cas avec seulement 2500 exemples.
Ce grand nombre de configurations possibles est en réalité une force : en prenant un grand nombre d'arbres (plusieurs milliers) entraînés sur les mêmes données, on se rend compte que la décision collective des arbres sera bien meilleure que n'importe quel arbre individuel.
Ce type de classificateur s'appelle une random forest, et on peut le mettre en place en changeant deux lignes de code puisque les données d'entraînement sont rigoureusement les mêmes.
Je pensais pouvoir atteindre un score de 80-90% avec cette méthode, et ensuite devoir ajouter/modifier des features pour l'optimiser.
Finalement ça n'a pas été nécessaire, le classificateur a obtenu du premier coup le score parfait de 100% sur le dataset de validation !
Le sujet de cette première édition était vraiment cool, avec une thématique réaliste et qui a su aborder un domaine d'actualité entre la cyber et l'IA. C'est à nouveau @Quantmetry qui organise cette année, j'ai vraiment hâte de découvrir le sujet 😊
Je ne peux pas me rendre au FIC la semaine prochaine pour participer à l'@EuCyberCup 2022, mais je suivrai le direct des épreuves et des résultats sur twitch.tv/EuCyberCup.
L'EC2 est sponsor de ce thread que je voulais sortir depuis longtemps, merci pour leur soutien !
Et si je vois que ce contenu vous plaît, j'en écrirai sûrement un autre plus technique pour vous parler d'un challenge de machine learning sur StarCraft II auquel j'avais participé pendant mes études.
Vous savez ce qu'il vous reste à faire si vous voulez que je publie ça 😇
• • •
Missing some Tweet in this thread? You can try to
force a refresh
Samedi, une grosse annonce a été faite lors de la PyCon : un nouveau framework PyScript permet d'exécuter du code Python directement dans le navigateur !
Techno révolutionnaire ou hype démesurée ? Je vous propose mon analyse en quelques tweets ⤵️
À l'heure actuelle, même si cet interpréteur ne s'appuie pas sur de l'émulation JavaScript (contrairement aux précédentes tentatives de Python front-end), il faut quand même charger le package PyScript de ~20MB (+ les imports) sur toutes les pages.
C'est pas ma plus grande crainte, parce que si PyScript gagne de la popularité, il deviendra certainement intégré aux navigateurs comme JS l'a été depuis ses débuts.
LIVE TWEET - Championnats d'Europe de programmation
Pendant tout le weekend aura lieu la compétition #SWERC à Milan, je suis présent en tant que coach de 3 équipes françaises.
Je vais essayer de vous expliquer le principe et vous tenir au courant des résultats en direct.
La cérémonie d'ouverture commence par un mini concert, je prendrai le temps de vous expliquer les règles du challenge tout à l'heure
Près de 60.000 participants cette année au niveau mondial représentant 3406 universités (oui c'est un championnat réservé aux étudiant/es, c'est pour ça que je peux plus participer en tant que joueur 😁)
THREAD : Enquête sur les manipulations politiques du système d'aide au vote mis en place par les équipes d'Eric Zemmour à quelques jours de la présidentielle.
Attention, c'est pas beau à voir.
Le site mon-candidat.fr a été mis en ligne en début de semaine, et propose de déterminer votre candidat idéal en seulement 10 questions.
Aucun lien manifeste avec un parti politique n'est affiché, mais il s'agit bien d'un site appartenant au parti Reconquête de Zemmour.
Cette affiliation semble être volontairement dissimulée, que ce soit dans le questionnaire ou dans le démarchage de masse effectué pour rediriger des électeurs sur le site, comme on peut le voir sur ce SMS reçu hier par @MrsSensha :
Les pros de la programmation compétitive ne font paradoxalement pas toujours de bons développeurs/es. Mais pourquoi ?
Je vous explique ⤵️
Une compétition de code, c'est généralement une dizaine de problèmes à résoudre en solo sur une durée de 2 à 6 heures.
Pour chaque exo, le code est évalué sur un ensemble de tests cachés qui vérifient que notre solution est correcte et performante.
Une fois que tous les tests sont au vert, on archive son code source dans un dossier où il ne sera probablement plus jamais consulté, et on passe au problème suivant. Le but est de faire ça un maximum de fois dans le temps imparti.
Le groupe Lockbit, spécialisé dans les ransomwares, a menacé publiquement le ministère de publier des documents volés si jamais celui-ci refusait de payer la rançon.
Mais en fait, c'était un énorme mensonge. Je vous explique ⤵️
La recrudescence des cyberattaques par ransomware est accompagnée par un business model inédit : les gangs fournissent le malware et administrent l'extorsion des données et des fonds, mais n'importe qui peut exécuter l'infection initiale en échange d'un pourcentage de la rançon.
Cette nouvelle structuration des attaques rend ces gangs très puissants et médiatisés, là où on était précédemment habitués aux attaques menées par des petits groupes à la hiérarchie bien définie.
Hier soir, j'ai découvert un problème de sécurité sur l'app Elyze (numéro 1 des stores en France cette semaine) qui m'a permis d'apparaître comme candidat à la présidentielle sur le téléphone de plusieurs centaines de milliers de français.
Je vous explique ce qui s'est passé ⤵️
Ça fait plusieurs jours que l'appli est sous le feu des critiques car le code n'est pas open source et plusieurs bugs y ont été relevés :
- En cas d'ex aequo, l'application favorise Emmanuel Macron
- Parfois, l'ordre affiché ne correspond pas au pourcentage
Convaincu que ces problèmes ne proviennent pas d'une intention malveillante des créateurs de l'appli, j'ai décidé d'utiliser mes compétences en reverse engineering pour trouver l'origine des bugs et en faire un article.