Использование XGBoost для улучшения предварительной обработки данных и полуавтоматического выбора пользовательских данных

Работа с любыми «реальными» данными требует извлечения сигнала из шума, иногда из большого количества шума. Как говорится, «мусор на входе, мусор на выходе». Любой опытный специалист по данным скажет вам, что лучше использовать «плохую» модель с хорошими данными, чем «отличную» модель с плохими данными. Но часто время и усилия, необходимые для этого этапа предварительной обработки и очистки данных, могут быть значительными, что еще хуже, если это повторяющееся событие.

Пример такого сценария исходит из исследований в области нейробиологии, где электрические записи нейронов в мозге генерируют зашумленные данные. Нейроны (когда они активны) производят исключительно стереотипные ответы, которые выглядят как внезапный всплеск низкоамплитудной активности, известный как потенциал действия (см. рисунок ниже). Чтобы узнать, когда нейроны активны, мы должны определить, когда возникают эти спайки, в процессе, называемом сортировкой спайков (ссылка 1). Однако, хотя на рисунке ниже показаны очень «чистые» спайки, это бывает редко, и обычно такие данные пронизаны шумом амплитуд, похожих на спайки, но с другой формой волны (подробнее об этом позже). Следовательно, часть процесса сортировки пиков также заключается в отделении сигнала от шума.

Это может быть трудоемким процессом, который усугубляется, если присутствует значительный шум. Пример схемы этого конвейера (тот, который мы используем в моей лаборатории) приведен ниже. Для целей этой статьи нас в первую очередь интересуют шаги 1, 2 и 3 — обработка собранных данных (но я рекомендую вам узнать больше об исследованиях моей лаборатории в ссылке 3).

Кратко пройдемся по этим шагам:

  1. Электрофизиологический сигнал проходит фильтрацию верхних частот, чтобы сохранить частоты в диапазоне спайков, и устанавливается порог для исключения «предполагаемых» спайков.
  2. Предполагаемые выбросы группируются автоматически (мы используем модели смеси Гаусса) с использованием моделей с диапазоном кластеров.
  3. Сгруппированные пики выбираются вручную или дополнительно обрабатываются перед выбором пользователем по мере необходимости.

Наглядно этот процесс показан ниже. На шаге 1 предполагаемые всплески (отклонения, выходящие за порог) отмечены красными точками. Кластеризация этих пиков с использованием 3-компонентной модели смеси Гаусса показана на шаге 2. Наконец, на шаге 3 кластеры, обведенные красным, отбрасываются, а кластер, обведенный зеленым, сохраняется в виде сигналов от нейрона.

ОДНАКО этот процесс ручной проверки и выбора необходимо повторить для 64 каналов или выше (ниже). В таких случаях, как канал 01, мы можем не получить никаких пиков, а в некоторых случаях, таких как канал 02, неконтролируемая кластеризация может быть не в состоянии четко отделить пики от шумных сигналов (кластер с синим контуром), что требует еще одного раунда кластеризации перед пиками. принимаются.

На данный момент мы полностью осознаем, что много наших усилий тратится на удаление шума из наших данных, и есть конкретные преимущества в возможности 1) «отсеять» шум и 2) идентифицировать сигнал (то есть, шипы). Формально:

  1. Вычислительные ресурсы и время тратятся на кластеризацию «шума». Это можно уменьшить, удалив шум перед кластеризацией.
  2. Если формы шумовых сигналов значительно уменьшены, это также улучшит выбор данных на основе пользователей.
  3. Если мы сможем надежно пометить каналы без всплесков, пользователю не придется беспокоиться даже о прохождении этих каналов, что снова сократит время и усилия, затрачиваемые вручную на этот процесс.
  4. Наконец, если мы уверены в прогнозах классификатора, эти прогнозы также можно использовать в качестве функции на этапе неконтролируемой кластеризации, что, вероятно, еще больше улучшит качество кластеризации.

Это отождествление сигнала и шума можно легко представить как проблему классификации. Однако ограничение заключается в том, что мы не хотим ложно отбрасывать какие-либо пики (т. е. избегать ложноотрицательных результатов). Следовательно, мы попытаемся максимизировать отзыв (не обращая внимания на точность на данный момент, поскольку шум все еще можно отбросить на более позднем ручном этапе) и посмотрим, к чему это приведет. В этом случае я решил добиться полноты 0,99.

Цель состоит не в том, чтобы создать идеальный классификатор, который уберет весь шум из процесса, а в том, чтобы включить дополнительный этап предварительной обработки, который значительно улучшит качество входных данных и сократит время обработки (как для компьютера, так и для пользователя). .

Построение классификатора

Поскольку каждый пиковый сигнал представляет собой временной снимок с довольно высокой размерностью (75 моментов времени на сигнал), было бы полезно выполнить уменьшение размерности, прежде чем двигаться вперед. Потенциальными функциями для этой задачи классификации могут быть:

  1. Амплитуда сигнала
  2. Энергия волны
  3. (PCA of) Спектральная плотность мощности (полезно для отделения периодического шума от пиков)
  4. PCA осциллограммы

Здесь для простоты я решил использовать первые 10 основных компонентов сигналов с z-оценкой, что объясняет 95% изменчивость данных. Осциллограммы с Z-оценкой удалит информацию об амплитуде (которая может быть полезна при классификации), однако, учитывая стереотипность осциллограмм по сравнению с шумом, мы все же можем ожидать хорошей классификации.

Я решил использовать XGBoost для этой проблемы из-за его скорости и мощности (ссылки 4,5). Кроме того, XGBoost можно передать в GridSearchCV от Scikit-Learn для настройки гиперпараметров/выбора модели, что делает этот процесс еще более плавным.

Это работает?

Набор данных, который я использовал здесь, содержал в общей сложности около 2,5 миллионов волновых форм с примерно 48% истинных пиков и ~ 52% шума (из данных, размеченных вручную). Данные были разделены как 0,50/0,375/0,125 для обучения/тестирования/проверки. Ниже приведен график, показывающий вероятность быть классифицированным как всплеск, предсказанный с помощью классификатора в проверочном наборе. Мы видим, что распределения для «истинного выброса» и «истинного шума» хорошо разделены, что позволяет предположить, что классификатор смог изучить хорошие представления для каждого класса.

Учитывая истинные метки, мы также можем определить порог, который соответствует нашим консервативным потребностям в отзыве. Чтобы получить консервативный классификатор, я использовал тестовый набор для титрования порога принятия решения, получив тот, который дает полноту 0,99. Ниже этот порог применяется к набору проверки. Мы видим, что с учетом этого порога мы можем отбросить 93 % сигналов шума, сохранив при этом 99 % истинных пиков.

Ниже приведены примеры сигналов для различных уровней «вероятности всплесков». Мы видим, что даже при вероятности = 0,2 формы сигналов выглядят «всплески», но качество всплесков значительно возрастает в диапазоне вероятности = 0,8–1 (где находится большинство «настоящих всплесков»). Кроме того, мы видим, что сигналы в диапазоне вероятностей 0–0,2 имеют довольно низкое качество, что может помочь нам лучше отбросить «истинные пики» в этом диапазоне, поскольку на самом деле это могут быть шумовые сигналы, которые были неправильно помечены при создании набора данных.

Хотя это предварительный анализ, эти результаты весьма обнадеживают. Кажется, что мы можем значительно отбросить шум, незначительно влияя на «истинный сигнал». Кроме того, при наивном бенчмаркинге производительности классификатора время прогнозирования для ~ 2,5 миллионов точек данных (сопоставимый размер с большинством наших наборов данных) составило ~ 22 секунды с использованием одного потока процессора. Это делает этот потенциальный шаг предварительной обработки вполне возможным для включения в конвейер обработки данных без значительных накладных расходов.

Однако этот классификатор может быть полезен и на более высоком уровне. Хотя он, очевидно, эффективен для удаления шума на уровне одной формы сигнала, учитывая, что классификатор точно изучил, как должен выглядеть «истинный выброс», мы можем использовать его для сканирования всех наших каналов и помечать каналы без истинных выбросов. . Это позволит пользователям вообще пропустить пиковую сортировку этих каналов.

Хотя поначалу это может показаться проблемой, которую не стоит решать, если мы посмотрим на количество каналов в наборе данных с нейронами (ниже), мы увидим, что, хотя распределение довольно широкое, медианная доля довольно низкая (~ 0,3). Это означает, что БОЛЬШИНСТВО каналов не содержит сигналов от нейронов (т. е. значительного количества «истинных спайков»). Следовательно, пометка этих каналов значительно ускорит процесс.

Мы можем сделать эту пометку аналогично нашей классификации сигналов выше. Выполните итерацию по каналам и пометьте каналы с меньшим количеством истинных всплесков, чем определенный порог. В качестве первого прохода мы откажемся от попыток оптимизировать это требуемое количество и будем использовать соглашение из моей лаборатории, т. е. не менее 2000 осциллограмм. Хотя я не буду здесь вдаваться в подробности нашей экспериментальной парадигмы, большинство наших экспериментов длятся 40 минут. 2000 сигналов за это время дают скорость ~ 0,83 импульса в секунду; все, что медленнее этого, обычно бесполезно для наших целей и, следовательно, может быть проигнорировано.

Используя тот же порог классификации, определенный из нашего предыдущего анализа, мы проверяем, насколько хорошо наш классификатор может помечать около 1700 каналов с помеченными данными (при этом 28% каналов содержат нейроны, а остальные без различимых нейронов, просто шум). Ранее определенный порог снова дает нам отзыв 0,99 (т. е. мы правильно восстановили 99% электродов, содержащих не менее 2000 «настоящих пиков»). Несмотря на этот высокий отзыв, наш истинный отрицательный показатель составляет 58% (т. е. P(pred=False|spike=False) = 0,58). Это означает, что наш классификатор смог правильно отбросить 42% всех каналов. Следовательно, пользователь сможет пропустить безрезультатную проверку в среднем 42% каналов в одном наборе данных.

Заключение

В эпоху «больших данных», когда мы стремимся собирать все больше и больше данных, наша способность вручную проверять такие наборы данных постоянно уменьшается. Эта проблема еще больше усугубляется в случаях, когда задача пользователя состоит в том, чтобы вручную отделить сигнал от шума (что верно для большинства вариантов сортировки пиков). Однако в подобных случаях мы можем полагаться на подходы машинного обучения для полуавтоматической работы.

В этой статье я показал, как мы можем использовать XGBoost, чтобы 1) уменьшить шум, присутствующий в нейронных электрофизиологических данных, чтобы сократить время и усилия последующей обработки, и 2) соответствующим образом пометить разделы данных, чтобы пользователь мог избежать ручной проверки разделов без соответствующих « сигнал «истина».

Этот этап предварительной обработки вскоре будет добавлен в конвейер сортировки шипов Katz Lab (Github). Код для этого анализа доступен здесь.

Я искренне благодарю Нишаат Мукадам, Цзянь-Ю Лин и Ханну Жермен за их полезные отзывы об этой статье.

Рекомендации

  1. https://www.scholarpedia.org/article/Spike_sorting
  2. Дифференциация и функциональное включение ГАМКергических интернейронов, полученных из эмбриональных стволовых клеток, в зубчатую извилину мышей с височной эпилепсией — Научная фигура на ResearchGate. Доступно по адресу: https://www.researchgate.net/figure/Electrophysiology-of-transplanted-neurons-into-the-host-brain-circuitry-A-The-top-trace_fig7_51983957 [по состоянию на 26 июля 2022 г.]
  3. Мукерджи Н., Вачутка Дж., Кац Д.Б. Python сочетается с системной неврологией: доступная, масштабируемая электрофизиология с открытым исходным кодом для бодрствующих, ведущих себя грызунов. Материалы 16-й конференции Python в науке. 97–104
  4. https://xgboost.readthedocs.io/en/stable/
  5. https://en.wikipedia.org/wiki/XGBoost