Объяснение медицинских решений в клинических условиях с помощью Amazon SageMaker Clarify

Medical decision explanation in clinical conditions using Amazon SageMaker Clarify

Объяснимость моделей машинного обучения (ML), используемых в медицинской сфере, становится всё более важной, поскольку модели должны объясняться с разных точек зрения, чтобы быть принятыми. Эти точки зрения варьируются от медицинской, технической, юридической и самой важной — пациента. Модели, разработанные на основе текста в медицинской сфере, статистически точны, но врачи этически обязаны оценивать области слабости, связанные с такими прогнозами, чтобы обеспечивать лучшую заботу о каждом пациенте. Для врачей требуется объяснение этих прогнозов, чтобы принимать правильные решения для каждого пациента.

В этом посте мы покажем, как улучшить объяснимость моделей в клинических условиях с использованием Amazon SageMaker Clarify.

Контекст

Одно из конкретных применений алгоритмов машинного обучения в медицинской сфере, которое использует большие объемы текста, — это системы поддержки принятия решений в клинической практике (CDSS) для триажа. Ежедневно пациенты поступают в больницы, и делаются записи о приеме. После этого начинается процесс триажа, и модели машинного обучения могут помочь врачам оценить клинические результаты. Это может помочь снизить операционные издержки и обеспечить оптимальное лечение пациентов. Важно понимать, почему эти решения рекомендуются моделями машинного обучения для принятия решений относительно каждого пациента.

Целью этого поста является описание того, как можно развернуть предиктивные модели с помощью Amazon SageMaker для целей триажа в условиях больницы и использовать SageMaker Clarify для объяснения этих прогнозов. Намерение — предложить ускоренный путь к принятию предиктивных методов в CDSS для множества организаций здравоохранения.

Тетрадь и код из этого поста доступны на GitHub. Чтобы запустить его самостоятельно, склонируйте репозиторий GitHub и откройте файл тетради Jupyter.

Технические основы

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

Продвижения в моделях NLP, таких как Bi-directional Encoder Representations from Transformers (BERT), позволили получать высокоточные предсказания на текстовых корпусах, таких как записи о приеме, с которыми ранее было трудно получить ценность. Их предсказания клинических показателей являются весьма применимыми для использования в CDSS.

Однако для эффективного использования новых предсказаний необходимо объяснить, как эти точные модели BERT достигают своих предсказаний. Существует несколько техник объяснения предсказаний таких моделей. Одной из таких техник является SHAP (SHapley Additive exPlanations), которая является методом-агностикой для объяснения вывода моделей машинного обучения.

Что такое SHAP

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

SHAP-значения основаны на теории игр, в частности на концепции значений Шепли, которые изначально были предложены для распределения выплаты кооперативной игры между игроками [2]. В контексте машинного обучения каждый признак в пространстве входных данных рассматривается как игрок в кооперативной игре, а предсказание модели является выплатой. SHAP-значения рассчитываются, исследуя вклад каждого признака в предсказание модели для каждой возможной комбинации признаков. Затем вычисляется средний вклад каждого признака по всем возможным комбинациям признаков, и это становится SHAP-значением для этого признака.

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

С новыми возможностями SageMaker Clarify и использованием предобученных моделей от Hugging Face, которые легко используются в SageMaker, обучение моделей и объяснимость могут быть легко выполнены в AWS.

Для целей примера end-to-end мы берем клинический исход смертности в больнице и показываем, как этот процесс можно легко реализовать в AWS с использованием предварительно обученной модели Hugging Face BERT, а предсказания будут объяснены с использованием SageMaker Clarify.

Выбор модели Hugging Face

Hugging Face предлагает различные предварительно обученные модели BERT, которые специализированы для использования в клинических записях. В этом посте мы используем модель bigbird-base-mimic-mortality. Эта модель является версией модели BigBird от Google, специально адаптированной для предсказания смертности на основе записей о приеме в МИМИК-подразделение интенсивной терапии. Задачей модели является определение вероятности того, что пациент не выживет во время пребывания в отдельной подразделении интенсивной терапии на основе записей о приеме. Одним из значительных преимуществ использования этой модели BigBird является ее способность обрабатывать более длинные контексты, что означает, что мы можем вводить полные записи о приеме без необходимости усечения.

Наши шаги включают развертывание этой настроенной модели на SageMaker. Затем мы включаем эту модель в настройку, позволяющую объяснение ее прогнозов в режиме реального времени. Для достижения такого уровня объяснимости мы используем SageMaker Clarify.

Обзор решения

SageMaker Clarify предоставляет разработчикам машинного обучения специальные инструменты для получения большего понимания их данных обучения и моделей машинного обучения. SageMaker Clarify объясняет как глобальные, так и локальные прогнозы, а также объясняет решения, принимаемые моделями компьютерного зрения (CV) и NLP.

На следующей диаграмме показана архитектура SageMaker для размещения конечной точки, обслуживающей запросы объяснений. Она включает взаимодействие между конечной точкой, контейнером модели и объяснителем SageMaker Clarify.

В примере кода мы используем блокнот Jupyter, чтобы продемонстрировать функциональность. Однако, в реальном прикладном случае, данные электронных медицинских записей (EHR) или другие приложения для медицинского ухода могут напрямую вызывать конечную точку SageMaker для получения того же ответа. В блокноте Jupyter мы развертываем контейнер модели Hugging Face в конечную точку SageMaker. Затем мы используем SageMaker Clarify для объяснения результатов, полученных из развернутой модели.

Необходимые условия

Вам понадобятся следующие предварительные условия:

  • Учетная запись AWS
  • Экземпляр блокнота SageMaker Jupyter

Получите доступ к коду из репозитория GitHub и загрузите его в свой экземпляр блокнота. Вы также можете запустить блокнот в среде Amazon SageMaker Studio, которая является интегрированной средой разработки (IDE) для разработки машинного обучения. Мы рекомендуем использовать ядро Python 3 (Data Science) в SageMaker Studio или ядро conda_python3 в экземпляре блокнота SageMaker.

Развернуть модель с включенным SageMaker Clarify

В качестве первого шага загрузите модель из Hugging Face и загрузите ее в бакет Amazon Simple Storage Service (Amazon S3). Затем создайте объект модели, используя класс HuggingFaceModel. Это использует предварительно созданный контейнер для упрощения процесса развертывания моделей Hugging Face на SageMaker. Также используется специальный скрипт вывода для выполнения прогнозов внутри контейнера. В следующем коде показан скрипт, который передается в качестве аргумента классу HuggingFaceModel:

from sagemaker.huggingface import HuggingFaceModel

# создаем класс модели Hugging Face
huggingface_model = HuggingFaceModel(
model_data = model_path_s3,
transformers_version='4.6.1',
pytorch_version='1.7.1',
py_version='py36',
role=role,
source_dir = "./{}/code".format(model_id),
entry_point = "inference.py"
)

Затем вы можете определить тип экземпляра, на котором развертывается эта модель:

instance_type = "ml.g4dn.xlarge"
container_def = huggingface_model.prepare_container_def(instance_type=instance_type)
container_def

Затем мы заполняем поля ExecutionRoleArn, ModelName и PrimaryContainer для создания модели.

model_name = "hospital-triage-model"

sagemaker_client.create_model(
ExecutionRoleArn=role,
ModelName=model_name,
PrimaryContainer=container_def,
)
print(f"Модель создана: {model_name}")

Затем создайте конфигурацию конечной точки, вызвав API create_endpoint_config. Здесь вы указываете ту же model_name, которую использовали в вызове API create_model. Теперь create_endpoint_config поддерживает дополнительный параметр ClarifyExplainerConfig для включения объяснителя SageMaker Clarify. SHAP-базовая линия является обязательной; вы можете предоставить ее как встроенные данные базовой линии (параметр ShapBaseline) или базовый файл S3 (параметр ShapBaselineUri). Для дополнительных параметров см. руководство разработчика.

В следующем коде мы используем специальный токен в качестве базовой линии:

baseline = [["<UNK>"]]
print(f"SHAP baseline: {baseline}")

TextConfig настроен с уровнем гранулярности предложений (каждое предложение является функцией, и нам нужно несколько предложений для хорошей визуализации) и языком как английским:

endpoint_config_name = "hospital-triage-model-ep-config"
csv_serializer = sagemaker.serializers.CSVSerializer()
json_deserializer = sagemaker.deserializers.JSONDeserializer()

sagemaker_client.create_endpoint_config(
EndpointConfigName=endpoint_config_name,
ProductionVariants=[
{
"VariantName": "MainVariant",
"ModelName": model_name,
"InitialInstanceCount": 1,
"InstanceType": instance_type,
}
],
ExplainerConfig={
"ClarifyExplainerConfig": {
"InferenceConfig": {"FeatureTypes": ["text"]},
"ShapConfig": {
"ShapBaselineConfig": {"ShapBaseline": csv_serializer.serialize(baseline)},
"TextConfig": {"Granularity": "sentence", "Language": "en"},
},
}
},
)

Наконец, после того, как у вас будет готова модель и конфигурация конечной точки, используйте API create_endpoint для создания конечной точки. endpoint_name должно быть уникальным в пределах региона вашей учетной записи AWS. API create_endpoint является синхронным по своей природе и возвращает немедленный ответ со статусом конечной точки, находящейся в состоянии создания.

endpoint_name = "hospital-triage-prediction-endpoint"
sagemaker_client.create_endpoint(
EndpointName=endpoint_name,
EndpointConfigName=endpoint_config_name,
)

Объяснение предсказания

Теперь, когда вы развернули конечную точку с включенной онлайн-объяснимостью, вы можете попробовать несколько примеров. Вы можете вызвать конечную точку в реальном времени, используя метод invoke_endpoint, предоставив сериализованную нагрузку, которой в данном случае являются некоторые примеры записей о приеме:

response = sagemaker_runtime_client.invoke_endpoint(
EndpointName=endpoint_name,
ContentType="text/csv",
Accept="text/csv",
Body=csv_serializer.serialize(sample_admission_note.iloc[:1, :].to_numpy())
)

result = json_deserializer.deserialize(response["Body"], content_type=response["ContentType"])
pprint.pprint(result)

В первом сценарии предположим, что следующая медицинская запись приема была сделана медработником:

“Пациент - 25-летний мужчина с жалобами на острую боль в груди. Пациент сообщает, что боль началась внезапно на работе и постоянная с тех пор. Пациент оценивает боль как 8/10 по силе. Пациент отрицает лучевую боль, одышку, тошноту или рвоту. Пациент не сообщает о предыдущей истории боли в груди. Витальные показатели следующие: артериальное давление 140/90 мм рт.ст. Частота сердечных сокращений 92 удара в минуту. Частота дыхания 18 вдохов в минуту. Насыщение кислородом 96% на воздухе. Физическое обследование показывает незначительную болезненность при пальпации над областью сердца и чистые легочные поля. ЭКГ показывает синусовую тахикардию без приподнятия или понижения СТ.”

На следующем скриншоте показаны результаты модели.

После передачи этого в конечную точку SageMaker, метка была предсказана как 0, что указывает на низкий риск смертности. Другими словами, 0 означает, что принятый пациент находится в неостром состоянии согласно модели. Однако нам нужно объяснение этого предсказания. Для этого можно использовать SHAP-значения в качестве ответа. Ответ включает SHAP-значения, соответствующие фразам входной записи, которые могут быть дополнительно закодированы цветом как зеленый или красный в зависимости от того, как SHAP-значения влияют на предсказание. В данном случае мы видим больше зеленых фраз, таких как “Пациент не сообщает о предыдущей истории боли в груди” и “ЭКГ показывает синусовую тахикардию без приподнятия или понижения СТ”, в отличие от красных, что соответствует предсказанию смертности 0.

Во втором сценарии предположим, что следующая медицинская запись приема была сделана медработником:

“Пациентка - 72-летняя женщина с жалобами на тяжелую сепсис и септический шок. Пациентка сообщает о жаре, ознобе и слабости в течение последних 3 дней, а также о снижении мочеиспускания и смущении. У пациентки имеется история хронической обструктивной болезни легких (ХОБЛ) и недавней госпитализации по поводу пневмонии. Витальные показатели следующие: артериальное давление 80/40 мм рт.ст. Частота сердечных сокращений 130 ударов в минуту. Частота дыхания 30 вдохов в минуту. Насыщение кислородом 82% на 4 литрах кислорода через назальную канюлю. Физическое обследование показывает диффузное покраснение и разогрев нижних конечностей, а также положительные признаки сепсиса, такие как измененное состояние сознания, тахикардия и тахипноэ. Взяты кровяные культуры и начата антибактериальная терапия с соответствующим покрытием.”

Следующий скриншот показывает наши результаты.

После отправки этого на SageMaker endpoint, метка была предсказана как 1, что указывает на высокий риск смертности. Это означает, что по модели пациент находится в остром состоянии. Однако нам нужно объяснение этой предсказанной метки. Опять же, вы можете использовать значения SHAP в качестве ответа. Ответ включает значения SHAP, соответствующие фразам входной заметки, которые могут быть дополнительно закодированы цветом. В данном случае мы видим больше красных фраз, таких как “Пациент сообщает о лихорадке, ознобе и слабости в течение последних 3 дней, а также о снижении выделения мочи и замешательстве”, и “Пациент – 72-летняя женщина с жалобой на тяжелый септический шок”, в отличие от зеленых фраз, соответствующих предсказанию смертности 1.

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

Очистка

Чтобы очистить ресурсы, созданные в рамках этого решения, выполните следующие операторы:

huggingface_model.delete_model()

predictor = sagemaker.Predictor(endpoint_name="triage-prediction-endpoint")

predictor.delete_endpoint()

Заключение

В этой статье показано, как использовать SageMaker Clarify для объяснения решений в области здравоохранения на основе медицинских записей, полученных на различных этапах процесса триажа. Это решение может быть интегрировано в существующие системы поддержки принятия решений, чтобы предоставить клиницистам еще одну информацию при оценке пациентов для поступления в отделение ИВЛ. Чтобы узнать больше о использовании услуг AWS в области здравоохранения, ознакомьтесь с следующими блог-постами:

  • Представление области применения “Здравоохранение” для AWS Well-Architected Framework
  • Как Telescope Health упрощает виртуальный уход в облаке
  • Путь к лучшему хирургическому уходу с аналитикой операционной комнаты на AWS
  • Прогнозирование повторного госпитализирования пациента с диабетом с использованием многомодельного обучения на Amazon SageMaker Pipelines
  • Как Pieces Technologies использует услуги AWS для прогнозирования результатов лечения пациентов

Ссылки

[1] https://aclanthology.org/2021.eacl-main.75/

[2] https://arxiv.org/pdf/1705.07874.pdf