Tous les articles

Mémoire de master : détection explicable du phishing écrit par IA

Rendu, résultat en attente

Mon 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

src/xai/metrics.pyLa fidélité, mesurée par rapport à une baseline aléatoire
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
  1. Ligne 4. La probabilité de la classe prédite sur le document d'origine, la référence pour chaque comparaison.

  2. Ligne 11. La baseline aléatoire : les mêmes suppressions dans un ordre de mots aléatoire, à travers le même pipeline.

  3. Ligne 13. Comprehensiveness : on retire les top-k mots que désigne l'explication. Plus la probabilité baisse, plus l'explication est fidèle.

  4. 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.

Article suivantFitEscala