Mémoire de master : détection explicable du phishing écrit par IA
Rendu, résultat en attenteMon mémoire de master à la Liverpool John Moores University : détecter les e-mails de phishing écrits par une IA, et mesurer si les explications de chaque détecteur sont fidèles à ce qu'il fait réellement.
- Mon rôle
- Auteur : conception des expériences, code, évaluation et rédaction
- Année
- 2026
- Développé avec
- Python · scikit-learn · XGBoost · LightGBM · PyTorch · Transformers · SHAP · LIME · Integrated Gradients
Le problème
Le phishing écrit par des modèles de langage ne se lit pas comme les anciens templates, et il est difficile de se fier à un détecteur que personne ne sait expliquer, ou de l'auditer. Je me suis posé deux questions : quel type de modèle tient le coup sur des e-mails écrits par IA, et les explications sont-elles fidèles à ce que fait vraiment le modèle ?
Comment c'est construit
Trois familles de modèles comparées sur les mêmes splits : des modèles classiques (régression logistique, Bayes naïf, SVM, arbre de décision, forêt aléatoire), des ensembles à gradient boosting (XGBoost, LightGBM) et des transformers (BERT, DistilBERT, RoBERTa), avec des tests inter-corpus entre des e-mails plus anciens et des e-mails générés par IA. Les explications de SHAP, LIME et Integrated Gradients ont été évaluées en fidélité, en stabilité et en plausibilité, par rapport à une baseline d'attribution aléatoire. Le protocole a été enregistré avant les expériences, le lexique d'indices a été commité avant tout résultat, une suite de tests de contrôle positif protège les méthodes d'explication, et la mesure de plausibilité a été vérifiée auprès d'annotateurs humains et d'un LLM juge. Tout a tourné en local sur une RTX 3090.
Les décisions qui ont compté
Enregistré avant toute exécution
Les protocoles, le lexique et les hypothèses ont été commités avant qu'il existe le moindre résultat, donc rien n'a pu être choisi après coup.
Les explications ont été mesurées
Une méthode dont le score équivaut à une attribution aléatoire est présentée comme telle. Quand LIME a obtenu un score équivalent au hasard, la cause était un bug dans mon adaptateur LIME, un argument de tokenizer inversé. Je l'ai signalé, corrigé, puis j'ai relancé les calculs. Une fois corrigé, LIME était fidèle, mais c'était la méthode la moins stable.
Le modèle simple l'a emporté
Sur les e-mails générés par IA, un modèle linéaire TF-IDF optimisé a battu RoBERTa en ROC-AUC (0,9993 contre 0,9976), et SHAP l'a expliqué fidèlement, 64,5 fois plus vite que LIME corrigé.
Code tiré du dépôt
def faithfulness(champ, texts, attrs, preds, seed: int = 42) -> dict:
rng = np.random.default_rng(seed)
preds = np.asarray(preds)
p_orig = _p_pred(champ.proba(texts), preds)1
variants: list[str] = []
meta: list[tuple] = [] # (doc_i, kind, k, is_random)
for i, (text, attr, pred) in enumerate(zip(texts, attrs, preds)):
nw = len(textops.word_spans(text))
top = textops.top_k_positions(attr, int(pred), min(20, nw))
randperm = rng.permutation(nw).tolist()2
for k in K_AOPC:
variants.append(textops.remove_words(text, top[:k])); meta.append((i, "comp", k, False))3
variants.append(textops.remove_words(text, randperm[:k])); meta.append((i, "comp", k, True))
for k in K_REPORT:
variants.append(textops.keep_only_words(text, top[:k])); meta.append((i, "suff", k, False))
variants.append(textops.keep_only_words(text, randperm[:k])); meta.append((i, "suff", k, True))
P = _p_pred(champ.proba(variants), preds[[m[0] for m in meta]])4
Ligne 4. La probabilité de la classe prédite sur le document d'origine, la référence pour chaque comparaison.
Ligne 11. La baseline aléatoire : les mêmes suppressions dans un ordre de mots aléatoire, à travers le même pipeline.
Ligne 13. Comprehensiveness : on retire les top-k mots que désigne l'explication. Plus la probabilité baisse, plus l'explication est fidèle.
Ligne 19. Chaque variante de chaque document passe par le GPU en un seul batch.
Où en est le projet
Rendu en août 2026 ; le résultat est en attente. Chaque tableau et chaque figure peuvent être reproduits à partir de scripts commités et de seeds fixées. Je suis en train d'en tirer un article pour une conférence, avec mon directeur de mémoire.