RETAIN — это интерпретируемая прогнозная модель для приложений в сфере здравоохранения. Учитывая записи пациентов, он может делать прогнозы, объясняя, как каждый медицинский код (коды диагноза, коды лекарств или коды процедур) при каждом посещении способствует прогнозу. Интерпретация возможна благодаря использованию механизма нейронного внимания.
Используя RETAIN, вы можете подсчитать, насколько положительно или отрицательно каждый медицинский код (диагноз, код лекарства или код процедуры) при различных посещениях влияет на итоговую оценку. В этом случае мы прогнозируем, будет ли у данного пациента диагностирована сердечная недостаточность (СН). Вы можете видеть, что коды, тесно связанные с HF, вносят положительный вклад. RETAIN также учится уделять больше внимания новой информации, чем старой. Вы можете видеть, что сердечная дисритмия (CD) вносит больший вклад, поскольку она возникает во время последнего визита.
RETAIN реализует алгоритм, представленный в следующей статье:
RETAIN: An Interpretable Predictive Model for Healthcare using Reverse Time Attention Mechanism
Edward Choi, Mohammad Taha Bahadori, Joshua A. Kulas, Andy Schuetz, Walter F. Stewart, Jimeng Sun,
NIPS 2016, pp.3504-3512
В статье RETAIN модель сформулирована как способная делать прогнозы на каждом временном этапе (например, попытаться предсказать, какой диагноз пациент получит при каждом посещении) и рассматривается классификация последовательностей (например, учитывая историю болезни, будет ли у него диагностирована сердечная недостаточность в будущее?) как особый случай, поскольку классификация последовательностей делает прогноз только на последнем временном шаге.
Однако этот код реализован для выполнения задачи классификации последовательностей. Например, вы можете использовать этот код, чтобы предсказать, является ли данный пациент пациентом с сердечной недостаточностью или нет. Или вы можете предсказать, будет ли этот пациент повторно госпитализирован в будущем. Более общая версия RETAIN будет выпущена в будущем.
ШАГ 1: Установка
Установите Python, Theano. Мы используем Python 2.7, Theano 0.8. Theano можно легко установить в Ubuntu, как предложено здесь.
Если вы планируете использовать вычисления на графическом процессоре, установите CUDA.
Загрузите/клонируйте код RETAIN
ШАГ 2: Быстрый способ протестировать RETAIN с помощью MIMIC-III
На этом этапе описывается, как с минимальным количеством шагов обучить RETAIN с использованием MIMIC-III прогнозировать смертность пациентов с использованием записей их посещений.
Сначала вам необходимо запросить доступ к MIMIC-III, общедоступным электронным медицинским записям, собранным у пациентов отделения интенсивной терапии в течение 11 лет.
Вы можете использовать «process_mimic.py» для обработки набора данных MIMIC-III и создания подходящего набора обучающих данных для RETAIN. Поместите сценарий в то же место, где находятся CSV-файлы MIMIC-III, и запустите сценарий. Команда выполнения: python process_mimic.py ADMISSIONS.csv DIAGNOSES_ICD.csv PATIENTS.csv <output file>
.
Запустите RETAIN, используя файлы «.seqs» и «.morts», созданные процессом_mimic.py. Файл «.seqs» содержит последовательность посещений каждого пациента. Каждое посещение состоит из нескольких диагностических кодов. Однако мы рекомендуем вместо этого использовать файл «.3digitICD9.seqs», поскольку результаты будут гораздо более интерпретируемыми. (Или вы можете использовать программное обеспечение одноуровневой клинической классификации для МКБ9, чтобы уменьшить количество кодов до нескольких сотен, что еще больше улучшит производительность.) Файл «.morts» содержит последовательность меток смертности для каждого пациента. Команда: python retain.py <3digitICD9.seqs file> 942 <morts file> <output path> --simple_load --n_epochs 100 --keep_prob_context 0.8 --keep_prob_emb 0.5
. 942
— это количество полных трехзначных кодов ICD9, используемых в наборе данных.
Чтобы проверить интерпретацию модели, обратитесь к шагу 6. Я лично обнаружил, что перинатальная желтуха (МКБ9 774) имеет высокую корреляцию со смертностью.
Модель достигает AUC выше 0,8 с помощью приведенной выше команды, но интерпретация не очень ясна. Вы можете настроить гиперпараметры, но я сомневаюсь, что ситуация значительно улучшится. В конце концов, только 7500 пациентов посетили больницу более одного раза, а большинство из них посетили больницу только два раза.
ШАГ 3: Как подготовить собственный набор данных
Набор обучающих данных RETAIN должен представлять собой список списков Python cPickled. Самый внешний список соответствует пациентам, промежуточный — последовательности посещений каждого пациента, а самый внутренний — медицинским кодам (например, кодам диагнозов, кодам лекарств, кодам процедур и т. д.), которые имели место при каждом посещении. Во-первых, медицинские коды необходимо преобразовать в целое число. Тогда одно посещение можно рассматривать как список целых чисел. Затем пациента можно просмотреть в виде списка посещений. Например, [5,8,15] означает, что при определенном посещении пациенту был присвоен код 5, 8 и 15. Если пациент совершил два визита [1,2,3] и [4,5,6,7], его можно преобразовать в список списков [[1,2,3], [4,5,6,7] ]]. Несколько пациентов могут быть представлены как [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]], что означает есть два пациента, у которых первый пациент совершил два визита, а второй пациент - три визита. Этот список списка списков необходимо замариновать с помощью cPickle. Мы будем называть этот файл «файлом посещения».
Для запуска RETAIN необходимо общее количество уникальных медицинских кодов. Например, если набор данных использует 14 000 кодов диагностики и 11 000 кодов процедур, общее число составит 25 000.
Набор данных меток (назовем этот «файл меток») должен представлять собой список Python cPickled. Каждый элемент соответствует истинной метке каждого пациента. Например, 1 может быть основным пациентом, а 0 — контрольным пациентом. Если есть два пациента, из которых зарегистрирован только первый пациент, то мы должны иметь [1,0].
«Файл посещения» и «файл метки» должны иметь 3 набора соответственно: обучающий набор, набор проверки и набор тестов. Расширение файла должно быть «.train», «.valid» и «.test» соответственно.
Например, если вы хотите использовать файл с именем «my_visit_sequences» в качестве «файла посещения», RETAIN попытается загрузить «my_visit_sequences.train», «my_visit_sequences.valid» и «my_visit_sequences.test».
Это также верно и для «файла метки».
Вы можете использовать информацию о времени посещений в качестве дополнительного источника информации. Назовем это «файлом времени». Обратите внимание, что информация о времени может быть любой: продолжительность между последовательными посещениями, совокупное количество дней с момента первого посещения и т. д. «Файл времени» должен быть подготовлен в виде списка Python cPickled. Самый внешний список соответствует пациентам, а самый внутренний — информации о времени каждого посещения. Например, задан «файл посещения» [[[1,2,3], [4,5,6,7]], [[2,4], [8,3,1], [3]]] , соответствующий ему «файл времени» может выглядеть как [[0, 15], [0, 45, 23]], если мы используем продолжительность между последовательными посещениями. (конечно, цифры поддельные, и я установил продолжительность первого посещения равной нулю.) Используйте опцию --time_file <path to time file>
чтобы использовать «файл времени». Помните, что файлы «.train», «. valid», правило «.test» также применимо и к «файлу времени».
Дополнительно: Использование собственных представлений медицинского кода.
RETAIN внутренне изучает векторное представление медицинских кодов во время обучения. Разумеется, эти векторы инициализируются случайными значениями.
Однако вы также можете использовать свои собственные представления медицинских кодов, если они у вас есть. (Их можно обучить с помощью алгоритмов, подобных Skip-gram. Дополнительную информацию см. в Med2Vec или здесь.) Если вы хотите предоставить представления медицинского кода, это должен быть список списков (в основном матрица) из N строк и Столбцы M, где N — количество уникальных кодов в вашем «файле посещений», а M — размер представлений кода. Укажите путь к файлу представления кода, используя --embed_file <path to embedding file>
. Кроме того, даже если вы используете свои собственные представления медицинского кода, вы можете повторно обучать (т. е. точно настраивать) их по мере обучения RETAIN. Для этого используйте опцию --embed_finetune
. Если вы не предоставляете собственное представление медицинского кода, RETAIN будет использовать случайно инициализированное представление, что, очевидно, требует процесса тонкой настройки. Поскольку по умолчанию используется тонкая настройка, вам не нужно об этом беспокоиться.
ШАГ 4: Запуск RETAIN
Минимальный ввод, необходимый для запуска RETAIN, — это «файл посещений», количество уникальных медицинских кодов в «файле посещений», «файл меток» и путь вывода. Путь вывода — это место, где будут сохранены изученные веса и журнал.
python retain.py <visit file> <# codes in the visit file> <label file> <output path>
Если указать опцию --verbose
, процесс обучения будет печататься после каждых 10 мини-пакетов.
Вы можете указать размер встраивания W_emb, размер скрытого слоя GRU, генерирующего альфа-версию, и размер скрытого слоя GRU, генерирующего бета-версию. Соответствующие команды: --embed_size <integer>
, --alpha_hidden_dim_size <integer>
и --beta_hidden_dim_size <integer>
. Например, --alpha_hidden_dim_size 128
сообщит RETAIN использовать GRU со 128-мерным скрытым слоем для генерации альфы.
Выпадения применяются в двух местах: 1) к входному внедрению, 2) к вектору контекста c_i. Соответствующие показатели отсева можно настроить с помощью --keep_prob_embed {0.0, 1.0}
и --keep_prob_context {0.0, 1.0}
. Значения исключения влияют на производительность, поэтому рекомендуется настроить их для ваших данных.
Регуляризацию L2 можно применять к W_emb, w_alpha, W_beta и w_output.
Могут быть указаны дополнительные параметры, такие как размер пакета, количество эпох и т. д. Подробную информацию можно получить с помощью python retain.py --help
Моя личная рекомендация: используйте умеренную регуляризацию (0,0001 ~ 0,001) для всех четырех весов и умеренное отсев только для вектора контекста. Но это полностью зависит от ваших данных, поэтому вам всегда следует настраивать гиперпараметры под себя.
ШАГ 5: Получение результатов
RETAIN проверяет AUC набора проверки после каждой эпохи, и если он выше всех предыдущих значений, он сохраняет текущую модель. Файл модели создается с помощью numpy.savez_compressed.
Шаг 6. Тестирование вашей модели
Используя файл «test_retain.py», вы можете рассчитать вклад каждого медицинского кода при каждом посещении. Сначала вам нужно иметь обученную модель, сохраненную с помощью numpy.savez_compressed. Обратите внимание, что вам необходимо знать конфигурацию, с которой вы обучали RETAIN (например, использование --time_file
, использование --use_log_time
.)
Опять же, вам нужны «файл посещения» и «файл метки», подготовленные таким же образом. Однако на этот раз вам не нужно следовать правилам «.train», «.valid», «.test». Сценарий тестирования попытается загрузить указанное имя файла.
Вам также потребуется информация о сопоставлении между фактическими строковыми медицинскими кодами и их целочисленными кодами. (например, «Гипертония» отображается в 24). Этот файл (назовем его «файлом сопоставления») должен быть словарем Python cPickled, где ключами являются строковые медицинские коды, а значениями являются соответствующие целые числа. (например, файл сопоставления, созданный процессом_mimic.py, представляет собой файл «.types»). Этот файл необходим для печати вкладов каждого медицинского кода в удобном для пользователя формате.
Для дополнительных параметров, таких как --time_file
или --use_log_time
, вам следует использовать точно ту же конфигурацию, с которой вы обучали модель. Для получения более подробной информации используйте опцию «--help».
Минимальные входные данные для запуска сценария тестирования — это «файл модели», «файл посещения», «файл метки», «файл сопоставления» и «выходной файл». «выходной файл» — это место, где будут храниться вклады. python test_retain.py <model file> <visit file> <label file> <mapping file> <output file>