Применение глубокого обучения к медицинским данным временных рядов

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

🎯Цель

Цель состоит в том, чтобы разработать прогностическую модель, которая будет предсказывать, будет ли пациент иметь право на получение «целевого препарата»*** или нет в течение следующих 30 дней. Знание того, имеет ли пациент право на участие или нет, поможет врачу, лечащему пациента, принять обоснованное решение о том, какое лечение назначить.

  • ** — Пациент считается имеющим право на получение определенного препарата, когда он впервые получил рецепт на этот препарат.

🗃️Описание набора данных

У нас есть данные в виде двух файлов ниже.

1) Train.parquet — набор данных, который будет использоваться для обучения.

2) Test.parquet — набор данных, который будет использоваться для тестирования.

🎙️Краткое описание набора данных

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

3️⃣Данные состоят в основном из трех столбцов

  1. Patient-Uid — уникальный буквенно-цифровой идентификатор пациента.
  2. Дата – дата, когда у пациента произошло событие.
  3. Инцидент – в этом столбце описывается событие, произошедшее в тот день.

💡В таблице выше представлен путь пациента a0db1e73–1c7c-11ec-ae39–16262ee38c7f

➡️Этот пациент принимал препарат 7 типа 2015–09–2022 гг., затем у пациента появился симптом 2 типа 2018–04–13, а затем снова пациент принимал препарат 7 типа 2018–05–02 и так далее. .

« 📝ПРИМЕЧАНИЕ. Все данные анонимизированы для защиты конфиденциальности пациентов, и, следовательно, инциденты такого типа, как наркотики, тесты или любая другая деятельность, являются категориальными анонимными признаками».

Выходные данные =› (3220868, 3). Это показывает, что у нас под рукой около 3 миллионов записей о пациентах, и все записи пациентов смешаны, поэтому нам нужно разделить их самостоятельно.

🔭Всего в train.parquet присутствует 27 тысяч уникальных пациентов.

Аналогично Drug_type_7, есть еще препарат под названием «Целевой препарат», этот препарат представляет интерес, всего в поезде 9 тысяч пациентов, принимавших «Целевой препарат» хотя бы один раз.

😷Ниже приведены различные типы происшествий.

📃Поскольку пациенты разделены по всему набору данных, давайте выведем все данные для каждого из пациентов в одну строку, поскольку они распределены по всему набору данных.

😉 Теперь у нас есть набор данных в необходимом формате, где каждый пациент находится в одной строке, а вся история пациента отсортирована по отметкам времени, таким как функции и метка класса.

🧑🏻‍💻См. весь код в данном репозитории GitHub.



🔎Исследовательский анализ данных

🍕ЧАСТЬ-1 Анализ показателя отказа

Лекарства обычно назначаются/назначаются врачами на определенный период времени или через регулярные промежутки времени, но по разным причинам пациенты могут прекратить прием лечения. Для лучшего понимания рассмотрим следующий пример:

«Предположим, у вас инфекция горла, врач прописывает вам антибиотик на 10 дней, но вы прекращаете прием препарата через 3 дня из-за некоторых побочных эффектов».

В приведенном выше примере идеальная продолжительность лечения составляет 10 дней, но пациенты прекратили лечение через 3 дня из-за побочных эффектов. Пациенты, прекращающие лечение, называются выбыванием.

🔶Часть А: Мы хотим изучить прекращение приема «Целевого препарата». Цель состоит в том, чтобы получить представление о том, какие события приводят к тому, что пациенты прекращают прием «Целевого препарата».

  • Учитывая, что идеальная продолжительность лечения «Целевым препаратом» составляет 1 год, поэтому мы провели анализ, показывающий, как уровень выбывания меняется в зависимости от количества пациентов, выбывающих из лечения каждый месяц.

🔶Часть Б: Затем мы проводим анализ, чтобы получить представление о том, какие события заставляют пациента прекратить прием «целевого препарата».

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

➡️ЧАСТЬ-А

Давайте начнем с:

  • Фильтрация необходимых данных (т.е. → пациентов, принявших «TARGET_DRUG»)
  • Составьте список всех дат инцидентов для каждого пациента и добавьте его в набор данных.
  • Составьте список только тех дат, в которые пациент принимает «целевой_препарат», и добавьте его также в набор данных.

💊Расчет коэффициентов высадки

Поскольку известно, что идеальная продолжительность действия «TARGET_DRUG» составляет 1 год, мы можем увидеть, когда пациент начал его использовать и когда пациент прекратил его использовать. Затем мы можем проверить, составляет ли продолжительность год.

  • Если продолжительность не составляет 1 год, мы можем рассматривать это как случай отказа и записать дату прекращения для дальнейшего анализа.

➡️ЧАСТЬ-Б

🧐Понимание того, какие события приводят к отказу от участия

Для анализа того, какие события приводят к тому, что пациенты прекращают прием «целевого_препарата», нам необходимо получить список симптомов на даты до даты прекращения приема целевого препарата для пациентов, которые его прекращают.

  • Мы уже получили список выписанных пациентов из приведенного выше, давайте проверим события до дат выписки.
  • Давайте возьмем средний интервал из 3 инцидентов, которые произошли до последнего случая приема «target_drug» пациентом.

События, произошедшие до того, как пациент прекратил прием препарата, хранятся в «events_dictionary», где ключи — это названия событий, а значения — частота того, сколько раз событие произошло.

📊Постройте график событий в соответствии с их частотой, чтобы получить представление о том, какие события могли привести к прекращению приема целевого препарата.

🧑🏻‍💻См. весь код в данном репозитории GitHub.



🍕ЧАСТЬ-2

🔶Извлечение доминирующих шаблонов рецептов из данных для более глубокого понимания.

Лекарственное средство обычно вводят пациенту по определенным схемам или через регулярные промежутки времени.

Например, химиотерапию, то есть медикаментозное лечение рака, обычно назначают пациентам с интервалом в 3–4 недели, то есть каждые 3–4 недели пациентам вводят препарат.

Подобно химиотерапии, «Целевой препарат» также вводится/назначается по определенным схемам. Мы хотим проанализировать, по каким схемам «Целевой препарат» вводится/назначается пациентам, может существовать несколько схем, по которым «Целевой препарат» вводится/назначается. .

➡️Часть А: Анализ для извлечения доминирующих закономерностей в данных с использованием кластеризации или других неконтролируемых методов.

Сначала мы создадим столбец месяца в кадре данных, чтобы использовать его при кластеризации и создании сводной таблицы, как показано ниже.

💡Теперь мы применяем кластеризацию по k-средним и находим оптимальное количество кластеров после нормализации данных.

Мы видим, что кривая изгибается при количестве кластеров = 3 и кластеров = 17, поэтому мы проверим закономерности для обоих вариантов.

➡️Часть B: Мы визуализируем шаблоны рецептов со временем по оси X (месяц) и рецепты по оси Y или каждый из шаблонов, которые вы можете извлечь.

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

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

🔎Анализ за 30 дней

  • Здесь говорится, что некоторые пациенты приняли целевой препарат, поэтому их относят к положительному классу. Теперь нам нужно за 30 дней спрогнозировать, имеет ли пациент право на этот препарат или нет.
  • Чтобы это произошло, мы должны замаскировать (удалить) записи о пациентах, которые приняли этот «целевой_препарат» после приема препарата, поскольку нам нужны данные только за 30 дней до приема целевого_препарата, поэтому что мы можем эффективно научить нашу модель прогнозировать, что лекарство будет принято, фактически не зная, что пациент принял лекарство напрямую.

💡Давайте проверим даты записей пациентов и удалим их за 30 дней до приема «TARGET_DRUG».

* Это делается только для пациентов положительного класса, а не для пациентов отрицательного класса, поскольку они не содержат «целевого препарата», что логично.

💊Процедура:

  1. Здесь мы перебираем даты записей пациента и проверяем, принял ли он «TARGET_DRUG».
  2. Если они его приняли, запишите индекс даты (или препарата), принятого до 30 дней с даты «TARGET_DRUG».
  3. Теперь все эти индексы позиций хранятся в списке под названием «cutoff_index_list».
  4. В ходе анализа мы столкнулись с пациентом, принимавшим «TARGET_DRUG» раньше, чем через 30 дней, то есть через 6 дней с момента обращения в клинику или хотя бы с момента начала записи на его имя.
  5. Наконец, мы также записываем идентификаторы пациентов, чтобы удалить их. Поскольку их данные бесполезны и рассматриваются как выбросы.

🚨Есть один пациент, данные которого не будут так полезны, потому что данные таковы, что он обратился в больницу с самим заболеванием, поэтому ему TARGET_DRUG дается в течение месяца (30 дней), поскольку нам нужны данные за 30 дней, информация об этом пациенте не так уж полезна, поэтому мы удалим этого пациента из записи для обучения. Относиться к нему/ней как к ОТЛИЧНОМУ.

👉🏻Теперь, удалив выпадающего пациента, теперь мы удалим историю пациентов, принимавших целевой препарат, прямо из того места, где они принимали целевой препарат (точнее, мы просто сохраним только историю до 30 дней с момента первого приема целевого препарата). препарат, который указывает на наличие заболевания). Причина этого заключается в том, что модель не должна иметь доступа к будущим данным, но она должна научиться прогнозировать начало заболевания на основе истории. Следовательно, до 30 дней.

⚔️Разделение поезд-проверка

  • Здесь до сих пор у нас нет итерации между пациентами, но мы проанализировали и определили характеристики независимо для каждого пациента.
  • Но теперь нам нужно токенизировать историю пациентов с помощью токенизатора TensorFlow, потому что мы планируем использовать LSTM, чтобы найти временные закономерности в истории, упорядоченные по дате.
  • Для этого типа кодирования нам нужно сначала разделить данные, а затем продолжить, чтобы избежать утечки данных.

👉🏻Всего жетонов 56, а это значит 56 видов разных препаратов, анализов и симптомов.

📝ПРИМЕЧАНИЕ. Здесь мы видим, что TARGET_DRUG отсутствует, что означает, что мы успешно и без ошибок движемся в правильном направлении.

🧑🏻‍💻См. весь код в данном репозитории GitHub.



🎖️Создание моделей

Сначала создайте полезные обратные вызовы.

  • Поскольку версия CUDA для тензорного потока Windows еще не поддерживает F1-оценку, нам нужно определить нашу собственную с помощью специального обратного вызова для его измерения, как показано ниже, изменив обратный вызов loss_history исходного тензорного потока.
  • Также добавляются все остальные обратные вызовы, такие как ранняя остановка, контрольная точка сохранения модели, а также тензорная доска для визуализации.

🏗️Базовая архитектура модели для первоначальной проверки

Тестирование исходной модели на проверочных данных с показателем F1.

“ Начальный показатель F1 модели составляет 0,767 '

⚡Разработка функций для улучшения результата

Здесь мы разрабатываем 2 вида функций:

  1. ⏲️Функции, основанные на времени, принимая во внимание разрыв между последовательными тестами, дозами лекарств или записями симптомов. Потому что они могут содержать подсказку о начале заболевания, которое приводит к TARGET_DRUG.
  2. 📊Функции, основанные на частоте, то есть сколько раз пациент принимал тот или иной симптом или препарат, что может помочь дифференцировать позитивных и негативных пациентов.

1. Функции, основанные на времени: ⌚

Разрыв между последовательными интервалами между тестами или введением лекарств в днях

  • Здесь мы также дополняем полученные векторы, отмечая пробелы для каждого пациента, чтобы избежать использования модуля кодировщика и иметь возможность напрямую их характеризовать.

После этого мы выполняем разделение проверки поезда вместе с токенизацией текста инцидента и сохраняем токенизатор, чтобы в дальнейшем использовать его для данных проверки, а также для тестовых данных во время фактического использования. Код для него можно найти в репозитории GitHub, указанном в ссылке.

2. Функции, основанные на частоте: 📊

Сколько раз за время их пребывания в должности проводится тот или иной тест или лекарство. Здесь для измерения частоты у нас есть идеальная функция преобразования векторизации Tf-Idf.

После этого мы также сохраняем этот векторизатор Tf-Idf на диск для дальнейшего использования, как мы делали выше.

🤖Моделирование

Здесь мы берем 3 типа входных данных для 3 типов функций, которые у нас есть.

🍕PART-1 LSTM с упорядочением инцидентов по времени и взятием только инцидентов до «target_drug» для положительных точек данных.

🍕ЧАСТЬ-2. Временные характеристики перерывов между приемом препаратов каждому из пациентов.

🍕ЧАСТЬ-3. Частотные функции для подсчета частоты приема каждого препарата каждому пациенту/симптому/диагнозу и т. д.

🍕ЧАСТЬ-4 Объединение всех входных слоев

Наконец, создайте модель, добавив дополнительный плотный слой к объединенному слою.

🍗Окончательная архитектура модели

После обучения этой модели необходимыми обратными вызовами, которые приведены с кодом в репозитории GitHub в ссылке в конце.

⭐Окончательный F1-балл модели

🌟Выводы и перспективы на будущее

  1. Здесь мы улучшили показатель F1 с 0,767 до 0,854, добавив дополнительные функции, связанные со временем и частотой инцидентов в истории болезни пациента.
  2. Еще один подход: просто удалить «target_drug» вместе с его датами и повторить попытку моделирования, поскольку в текущем подходе мы теряем некоторые данные, которые находятся после «target_drug». Может быть, есть некоторая польза от того, чтобы попробовать это.
  3. Дополнительные функции можно было бы разработать с помощью временных меток, таких как день, месяц, год и т. д., хотя функции временного интервала охватывают шаблон, но нам нужно посмотреть, сможем ли мы получить какое-либо улучшение с включением абсолютных значений.
  4. Можно попробовать более сложную архитектуру модели, такую ​​​​как BERT и т. д., или мы также можем изучить, какие результаты мы можем получить, используя более простые модели, такие как случайный лес, XG_Boost, которые игнорируют аспект зависимости от времени в отличие от LSTM.
  5. Можно изучить некоторые подходы к передискретизации, поскольку у нас есть несбалансированные данные.

😎🤟🏻Полезные ссылки и ссылки:

  1. 🧑🏻‍💻Найдите весь код здесь 👉🏻: https://github.com/Rohan-Thoma/Future-Patient-Eligibility-Prediction-to-a-Target-Drug
  2. 🔗Свяжитесь со мной в 🤝 LinkedIn: https://linkedin.com/in/rohan-vailala-thoma
  3. 💼Познакомьтесь с другими моими блогами по тематическим исследованиям на 😎🤟🏻: https://medium.com/@rohanvailalathoma