Около 30% генерируемых в мире данных связаны со здравоохранением. Большая часть этих данных состоит из электронных медицинских карт (EHR), неотъемлемой части информационной системы больницы.

Некоторыми примерами EHR являются заметки врача, ежедневные графики прогресса, записи актов гражданского состояния, сведения о рецептах, сведения о поступлении и выписке пациентов. Извлечение полезной информации из таких отчетов может помочь медицинским работникам в принятии решений. Некоторыми из приложений являются идентификация диагностических критериев, предикация диагноза (уровень смертности в отделении интенсивной терапии, начало сепсиса и т. д.), классификация пациентов и управление ресурсами больницы. Многие автоматизированные подходы с применением обработки естественного языка (NLP) использовались ранее для извлечения информации из электронных медицинских карт (Никифору Аи др., 2013).

Мотивация

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

В приведенном выше подходе есть несколько узких мест.
A) Алгоритмы RegEx очень точны в сборе информации, но они не поддаются обобщению. Например, для извлечения информации из другого типа текста (например, из кардиологической практики) необходимо разработать совершенно новый набор алгоритмов.
B) Масштабируемость конвейера сомнительна, поскольку он включает ручную классификацию. текста.

Таким образом, этот проект направлен на оптимизацию текущего конвейера извлечения информации путем разработки инструмента классификации текста на основе НЛП, который является точным, обобщаемым и масштабируемым.

Данные

Данные представляют собой неструктурированные записи врачей из обширной неврологической базы данных. Размеченный набор данных содержит в общей сложности 17000 врачебных заметок, разделенных на шесть разных классов: степень I, степень II, степень III, степень VI, без оценки и недействительные. Оценки определяются врачом на основе ответов пациента на анкету и встраиваются где-то в свободный текст.

Помеченный набор данных содержит два дополнительных класса: No Score и Invalid. Ни один балл не имеет врачебных заметок, но записи не содержат никакой оценки, тогда как в случае Недействительно, справка врача содержит неоднозначную информацию о категории.

Данные имеют высокий уровень дисбаланса классов. Класс invalid представляет менее 1 % всех данных, тогда как Нет оценок – около 50 % всех данных. данные.

Дисбаланс классов влияет на способность предсказания данной модели. Чтобы упростить задачу, давайте поместим «Нет оценки» под меткой C0, «Недействительно» как C1, а x будут функциями. В этом случае, используя правило Байеса, мы можем написать:

Таким образом, теоретически модель, обученная на этих данных, всегда будет правильно предсказывать класс C0, но в меньшей степени с классом C1.

Сбалансировать данные?

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

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

Вложения слов:

«Если вы измените свой взгляд на вещи, изменится и то, на что вы смотрите», — Уэйн Дайер

Я решил использовать TF-IDF и CountVectorizer из-за того, насколько по-разному они преобразуют данные. Я проведу аналогию с поисковой оптимизацией, чтобы объяснить, как эти векторизаторы заставляют данные выглядеть по-разному.

CountVectorizer

ctv = CountVectorizer(analyzer='word',token_pattern=r'\w{1,}',
            ngram_range=(1, 3), stop_words = 'english')

CountVectorizer строит матрицу признаков, подсчитывая частоту каждого слова (токена) в тексте. Это может быть не оптимальным встраиванием для оптимизаторов, так как это приведет к спаму токенов и, таким образом, к нежелательному пользовательскому опыту.

TF-IDF

TF-IDF пытается нормализовать слова, чтобы наиболее часто встречающиеся слова не перевешивали менее часто встречающиеся слова. Этот подход отлично подходит для поисковой оптимизации, где понимание общего содержания текста необходимо для ранжирования статьи.

tfv = TfidfVectorizer(min_df=3,  max_features=None,  
                      strip_accents='unicode', 
                      analyzer='word',token_pattern=r'\w{1,}',
                      ngram_range=(1, 3),use_idf=1,smooth_idf=1,
                      sublinear_tf=1,stop_words = 'english')

Выбор модели

«Красота заключается в глазах смотрящего» — Маргарет Хангерфорд.

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

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

Параметрические модели

  • Логистическая регрессия. Логистическая регрессия предполагает определенный уровень линейной

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

  • Наивный байесовский классификатор. NB — это линейный классификатор, который предполагает высокий уровень независимости функций. Ее основой является теорема Байеса.

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

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

Непараметрические модели:

  • Случайный лес: по сравнению с параметрическими моделями непараметрические модели проявляют себя лучше, когда границы решений нелинейны (Kaitlin Kirasich, 2018). Случайные леса стараются придать одинаковое значение всем функциям. Все функции не созданы равными; некоторые из них являются независимыми переменными, в то время как другие представляют собой простой шум. Таким образом, если в вашем функциональном пространстве много шума, маловероятно, что RF даст наилучшую производительность из коробки.

  • Усиленные деревья

Показатели модели машинного обучения

Подгонка различных моделей к данным — отличный способ изучить сами данные. Из моих экспериментов с разными моделями видно, что CoutVectorizer показал несколько лучшую производительность при работе с данными. Я немного расскажу об этом.

Достигнута 97% точность тестовых данных с помощью CountVectorizer и XGBoost

clf = xgb.XGBClassifier(max_depth=7, n_estimators=200, 
                        colsample_bytree=0.8, 
                        subsample=0.8, nthread=10,         
                        learning_rate=0.1)

Оценка F1: 0,968

Модель дала точность 97% на тестовых данных с оценкой F1 0,968. Я думаю, что следующие причины способствовали успеху этой модели.

Небольшое преимущество CountVectorizer над TF-IDF предполагает потерю информации во время встраивания TF-IDF, такой как фактическая частота и наличие или отсутствие признаков. Однако CountVectorizer смог сохранить эту информацию, что повысило мощность прогнозирования XGBoost.

Одним из самых ошибочно предсказанных классов здесь является Invalid. Этот конкретный класс представляет менее 1% обучающих данных.

Глубокое обучение

Я пробовал несколько моделей (DNN, CNN, LSTM, BI-Directional LSTM, GRU) с различными вложениями, такими как spacy, GloVe и BERT. Все эти модели довольно хорошо работали на обучающих данных, но с треском провалились на данных проверки.

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

Этот проект был моей работой Insight в сотрудничестве с частной медицинской компанией. Поэтому я не могу углубляться в фактические данные.

Эта статья находится в стадии разработки…