Le même modèle, noté deux fois — Division aléatoire vs. division par sujet
Recherche · NeuroIA & personnesJ'ai entraîné le même classificateur sur les mêmes données EEG et je l'ai noté de deux façons différentes. Un des scores était un mensonge. Voici l'expérience, les chiffres, et où j'ai mal fait la première version.
Dans cet article
J’ai entraîné un classificateur sur des données EEG, je l’ai noté, et j’ai obtenu 0,871 de précision équilibrée.
Puis j’ai noté exactement le même modèle entraîné d’une manière différente, sur exactement les mêmes données, et j’ai obtenu 0,690.
Rien n’a changé dans le modèle. Rien n’a changé dans les données. Une seule chose a changé : quels essais étaient autorisés à se retrouver ensemble dans l’ensemble d’entraînement.
Deux façons de couper le même jeu de cartes
Disons que j’ai de l’EEG de 36 personnes, et pour chaque personne j’ai plusieurs courts segments : certains enregistrés au repos, certains en faisant de l’arithmétique mentale. Je veux classifier repos vs arithmétique.
La façon ordinaire d’évaluer un classificateur est la validation croisée à k plis : mélanger tous les segments ensemble, diviser en 5 plis, entraîner sur 4, tester sur 1, répéter. C’est une division aléatoire.
L’autre façon est de ne jamais laisser les segments d’une personne traverser entre entraînement et test. Choisir quelles personnes vont dans le pli de test, pas quels segments. C’est une division par sujet — dans scikit-learn, GroupKFold avec l’ID du sujet comme groupe.
Figure · leakage
Two ways to split the same data — only one survives contact with reality
Random split
leakyEvery subject appears in both sets. The model can win by recognising who, not what state.
The score looks excellent — and it is measuring familiarity, not the condition.
Leave-subjects-out
honestSubjects 1–3 train, 4–5 test. The model has never seen a test brain before.
The score is lower — and it is the only one that would survive contact with a new person.
Each row is one participant, each tile one epoch. Segments from one person really are more alike than segments from different people, so a random split quietly hands the model that signature for free — and the score stops meaning what we think it means. Brookshire et al., 2024
La division aléatoire fuit parce que les segments de la même personne se ressemblent plus que les segments de personnes différentes — même forme de crâne, même impédance d’électrode ce jour-là, même rythme cérébral de base. Un modèle peut partiellement résoudre « repos vs arithmétique » en résolvant « qui est cette personne », et une division aléatoire lui permet de faire ça gratuitement, des deux côtés de la division. Brookshire et al., 2024
Expérience 1 : repos vs arithmétique mentale (EEGMAT)
J’ai utilisé le jeu de données PhysioNet EEGMAT — 36 personnes, chacune avec un enregistrement au repos et un enregistrement d’arithmétique mentale, 21 canaux à 500 Hz. J’ai découpé chaque enregistrement en fenêtres de 10 secondes sans chevauchement, et pour chaque fenêtre j’ai calculé la puissance logarithmique par bande (delta/thêta/alpha/bêta/gamma) sur chaque canal — 100 caractéristiques par fenêtre, 850 fenêtres au total.
En plus de ça : régression logistique, avec le scaler de caractéristiques ajusté uniquement à l’intérieur de chaque pli d’entraînement — jamais sur le jeu de données complet d’abord. Ajuster un scaler avant la division est lui-même une petite fuite, et c’est une erreur facile à manquer.
| Division | Moyenne | Écart-type | Ce que ça signifie |
|---|---|---|---|
| Aléatoire (fuite) | 0,871 | ±0,025 | segments mélangés entre personnes |
| Par sujet | 0,690 | ±0,048 | personnes entières exclues |
| Nul (étiquettes mélangées) | 0,496 | ±0,015 | étiquettes randomisées, division par sujet — devrait être au hasard |
L’écart est de 0,182 — environ 18 points de précision équilibrée, dans la direction que l’histoire de la fuite prédit. Le modèle nul atterrissant presque exactement sur 0,5 est ce qui me dit que le 0,690 par sujet est un vrai signal et pas un artefact de la façon dont j’ai construit le pipeline : si le modèle nul avait aussi obtenu un score bien au-dessus du hasard, quelque chose dans mon code aurait fuité l’information d’étiquette indépendamment de la division.
Expérience 2 : poing gauche vs droit imaginé (imagerie motrice)
Même question, signal plus difficile. J’ai utilisé 10 sujets du jeu de données PhysioNet EEG Motor Movement/Imagery, mouvement de poing gauche vs droit imaginé, 64 canaux à 160 Hz, passe-bande 1–40 Hz plus un filtre coupe-bande à 60 Hz (il y a un vrai bruit secteur à 60 Hz dans ce matériel d’enregistrement — j’ai vérifié avec un spectre de puissance zoomé avant de supposer quoi que ce soit).
Ma première tentative a utilisé CSP (Common Spatial Patterns), le filtre spatial standard pour le décodage de l’imagerie motrice, suivi de LDA. Ajusté correctement à l’intérieur de chaque pli de validation croisée, sans fuite. Résultat : tout a obtenu un score de hasard.
| Division | Moyenne | Écart-type |
|---|---|---|
| Aléatoire | 0,452 | ±0,022 |
| Par sujet | 0,504 | ±0,023 |
| Nul (mélangé) | 0,490 | ±0,025 |
Les trois chiffres se trouvent dans le bruit les uns des autres. Il n’y a pas d’écart de fuite à trouver ici parce qu’il n’y a pas de signal au départ — pas un bug, un décalage de modélisation. CSP ajuste un filtre spatial par ensemble d’entraînement, et ce filtre est réglé sur la géométrie des cerveaux qui s’y trouvent. Regrouper les essais de dix personnes différentes avant d’ajuster CSP, et le filtre finit par faire un compromis entre dix dispositions spatiales différentes au lieu d’en décrire une seule correctement. C’est, à petite échelle, exactement le problème de généralisation dont parle le reste de ce projet — il est apparu dès la première base de référence.
Remplacer CSP par les mêmes caractéristiques de puissance de bande utilisées dans l’expérience 1 (puissance logarithmique sur quatre bandes, 32 canaux) l’a corrigé :
| Division | Moyenne | Écart-type |
|---|---|---|
| Aléatoire (fuite) | 0,599 | ±0,041 |
| Par sujet | 0,573 | ±0,043 |
| Nul (mélangé) | 0,456 | ±0,044 |
Maintenant le modèle nul est clairement en dessous des deux vrais scores, donc il y a un signal appris. L’écart est petit — 0,027 — bien plus petit que les 0,182 d’EEGMAT. Je lis ça comme la tâche étant réellement plus difficile, pas comme un problème de pipeline : une base de référence sur un seul sujet que j’ai exécutée plus tôt sur la même tâche gauche/droite, avec seulement 45 essais, a aussi obtenu un score faible de 0,535 ± 0,145. Repos-vs-arithmétique a une signature grande, lente, tout-cerveau. L’imagerie motrice gauche-vs-droite en a une plus subtile, plus localisée, et dix sujets et 450 essais, ce n’est pas beaucoup pour la trouver.
Ce que j’en retiens
Le résultat honnête n’est pas « diviser par sujet baisse votre score, attention ». C’est plus étroit et plus utile que ça : la taille de l’écart entre une division aléatoire et une division par sujet vous dit combien de la compétence apparente de votre modèle était de la reconnaissance de personne déguisée, et ce chiffre est différent pour chaque tâche et chaque ensemble de caractéristiques. Pour repos-vs-arithmétique avec la puissance de bande, une grande partie du score en division aléatoire était ça. Pour l’imagerie motrice, une fois le pipeline corrigé, ce n’était pas grand-chose — l’écart restant est proche de ce qu’on attendrait de deux échantillons à 5 plis légèrement différents de taille similaire.
Sources & articles utilisés pour apprendre cela
-
Data leakage in deep learning studies of translational EEG
La source principale de cet article. A passé en revue 63 études EEG publiées en deep learning et trouvé que seulement 17 évitaient clairement la fuite au niveau du sujet ; sur une ré-exécution, la précision sur un participant exclu est tombée de quasi-parfaite à quasi-hasard.
Read paper -
Electroencephalograms during Mental Arithmetic Task Performance (EEGMAT dataset)
Le jeu de données utilisé pour la première expérience — 36 sujets, EEG au repos vs arithmétique mentale, 23 canaux, courts segments sans artefacts.
Read paper -
BCI2000: A General-Purpose Brain-Computer Interface (BCI) System
Décrit le système d'acquisition derrière le jeu de données PhysioNet EEG Motor Movement/Imagery utilisé pour la deuxième expérience.
Read paper -
A review of classification algorithms for EEG-based brain-computer interfaces: a 10-year update
Contexte sur CSP et pourquoi c'est un filtre spatial ajusté à un ensemble d'enregistrements plutôt qu'un extracteur de caractéristiques universel — pertinent pour pourquoi regrouper les sujets avant d'ajuster CSP a échoué ici.
Read paper