На что обращать внимание при оценке ML-моделей на нейроданных: некорректные сплиты
В любой области ML сделать модель — это полдела. Важно ещё правильно её проверить и показать, что она действительно эффективна и робастна. Для этого существует много «рецептов» и правил честной оценки, начиная с самого банального: тестировать модель нужно на данных, которые она не видела при обучении. Но в нейроданных утечек и недопониманий при оценке может быть довольно много. В этом посте я хочу разобрать несколько основных примеров, специфичных именно для ML в нейро.
В ML стандартная практика — использовать разные сплиты для обучения, валидации и финального тестирования. Часто кажется, что непересечения этих подмножеств датасета уже достаточно. С нейроданными есть дополнительные нюансы.
Как говорилось в предыдущем посте, активность мозга довольно сильно индивидуальна и различается у разных людей. При этом даже у одного и того же человека сигнал может отличаться в разные дни и в ответ на разные стимулы. И именно это различие может служить для модели дополнительной информацией.
Например, возьмём несколько записей ЭЭГ от разных людей и будем решать задачу классификации «больной или здоровый». Если мы нарежем каждую запись на окна, и часть окон одного человека попадёт в трейн, а часть — в отложенный тест, то на первый взгляд модель не видела тестовых данных. Но на практике она может просто научиться «запоминать» человека по индивидуальным особенностям активности мозга и дальше использовать это как подсказку: какой человек с какой меткой связан. Тогда на окнах этого же человека тестировать модель будет гораздо легче, и метрики окажутся завышенными.
Даже если метки меняются от окна к окну, проблема никуда не исчезает. Например, если мы классифицируем воображаемые движения левой рукой, правой рукой и сжатие кулаков, модель всё равно может получить завышенные тестовые метрики просто потому, что уже увидела активность этого человека и успела подстроиться под его конкретные ритмы. Если же показать ей нового человека, которого не было в трейне, ситуация может оказаться совсем другой.
Также существует temporal leakage. Допустим, мы делаем кросс-валидацию на одной длинной записи ЭЭГ и постепенно вырезаем 20% на тест, а остальное оставляем в трейне. Те фолды, где тестовый кусок находится внутри записи, будут заметно проще, потому что модель уже видела сигнал до него и после него. В такой ситуации она может не столько обобщать на новые данные, сколько интерполировать внутри уже знакомой записи, используя длинные тренды активности мозга. Из-за этого метрики снова оказываются завышенными: кажется, что модель хорошо переносится на новые данные, хотя на самом деле она просто использует слишком тесную связь между трейном и тестом.
На практике любая индивидуальная особенность данных, будь то конкретный человек, сессия, стимул или даже аппарат записи, может стать для нейросети скрытой подсказкой, которая помогает классифицировать, но при этом разрушает обобщаемость модели и завышает метрики.
Илья Семенков