Press "Enter" to skip to content

使用Amazon SageMaker Clarify在临床环境中解释医疗决策

在医疗领域中,机器学习(ML)模型的可解释性变得越来越重要,因为需要从多个角度解释模型,以便获得采用。这些角度包括医学、技术、法律以及最重要的角度——患者的角度。在医疗领域使用文本开发的模型在统计上已经变得准确,然而临床医生在道德上有责任评估与这些预测相关的弱点,以便为每个患者提供最佳护理。为了让临床医生能够根据每个患者做出正确选择,需要解释这些预测。

在本文中,我们将展示如何使用亚马逊SageMaker Clarify在临床环境中提高模型的可解释性。

背景

在医疗领域中,将大量文本与机器学习算法结合的一个具体应用是用于分诊的临床决策支持系统(CDSSs)。每天都有患者被送往医院并进行入院记录。在这些记录完成后,分诊过程开始,机器学习模型可以帮助临床医生估计临床结果。这有助于减少运营成本并为患者提供最佳护理。了解机器学习模型为什么会提出这些决策对于与每个患者相关的决策非常重要。

本文的目的是概述如何在医院环境中使用亚马逊SageMaker部署预测模型,用于分诊,并使用SageMaker Clarify解释这些预测。意图是为许多医疗组织提供预测技术在CDSSs中采用的加速路径。

本文中的笔记本和代码可在GitHub上找到。要运行它,请克隆GitHub存储库并打开Jupyter笔记本文件。

技术背景

对于任何急救医疗组织来说,其临床记录是一项重要资源。在入院时,会记录入院记录。最近的一些研究表明,通过使用自然语言处理(NLP)算法[1],可以从入院记录中准确预测诊断、手术、住院时间和住院期间的死亡率等关键指标。这些预测现在可以在仅使用入院记录的情况下高度实现,通过使用NLP模型,如双向编码器表示来自转换器(BERT)。

然而,为了有效使用这些新的预测结果,仍然需要解释这些准确的BERT模型是如何进行预测的。有几种技术可以解释这些模型的预测。其中一种技术是SHAP(SHapley Additive exPlanations),它是一种用于解释ML模型输出的模型无关技术。

SHAP是什么

SHAP值是一种解释ML模型输出的技术。它提供了一种将ML模型的预测结果进行分解并理解每个输入特征对最终预测结果的贡献程度的方法。

SHAP值基于博弈论,具体来说是Shapley值的概念,最初用于在合作博弈中分配奖金给各个参与者[2]。在ML的上下文中,输入空间中的每个特征都被认为是合作博弈中的一个参与者,模型的预测结果是奖金。SHAP值通过检查每个特征对于每个可能的特征组合的模型预测的贡献来计算。然后计算每个特征在所有可能特征组合中的平均贡献,这就成为该特征的SHAP值。

SHAP允许模型解释预测结果,而无需了解模型的内部工作原理。此外,还有一些技术可以以文本形式显示这些SHAP解释,以便医学和患者的角度都能直观地了解算法如何得出预测。

通过SageMaker Clarify的新功能以及在SageMaker中轻松使用的Hugging Face预训练模型,模型训练和可解释性都可以在AWS上轻松完成。

为了举例说明,我们以住院期间的临床结果为例,展示了如何在AWS中使用预训练的Hugging Face BERT模型轻松实现此过程,并使用SageMaker Clarify解释这些预测。

选择Hugging Face模型

Hugging Face提供了一系列专门用于临床记录的预训练BERT模型。在本文中,我们使用bigbird-base-mimic-mortality模型。这个模型是Google的BigBird模型的经过微调的版本,专门用于使用MIMIC ICU入院记录预测死亡率。该模型的任务是根据入院记录确定患者在特定ICU住院期间存活的可能性。使用这个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)。我们建议在SageMaker Studio上使用Python 3(数据科学)内核,或在SageMaker笔记本实例上使用conda_python3内核。

启用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 created: {model_name}”)

接下来,通过调用create_endpoint_config API创建一个端点配置。在这里,您提供与create_model API调用中使用的相同的model_name。create_endpoint_config现在支持额外的ClarifyExplainerConfig参数,以启用SageMaker Clarify解释器。SHAP基线是必需的;您可以通过内联基线数据(ShapBaseline参数)或S3基线文件(ShapBaselineUri参数)来提供它。有关可选参数,请参阅开发人员指南。

在下面的代码中,我们使用一个特殊的令牌作为基线:

baseline = [[“”]]
print(f”SHAP基线:{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"},
},
}
},
)

最后,当你的模型和端点配置准备好后,使用create_endpoint API创建你的端点。在你的AWS账户的特定区域内,endpoint_name必须是唯一的。create_endpoint API是同步的,返回一个立即响应,其中端点的状态是Creating。

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 mmHg。心率92次/分钟。呼吸频率18次/分钟。室氧饱和度96%。体格检查发现前心区轻度压痛和清晰的肺部。心电图显示窦性心动过速,无ST段抬高或压低。”

以下截图显示了模型的结果。

使用Amazon SageMaker Clarify在临床环境中解释医疗决策 四海 第1张

在将其转发给SageMaker端点后,标签预测为0,表示死亡风险较低。换句话说,0表示根据模型,入院患者不处于急性状态。然而,我们需要预测背后的推理。为此,您可以使用SHAP值作为响应。响应包括与输入记录的短语相对应的SHAP值,可以根据SHAP值对贡献于预测的短语进行进一步的颜色编码,绿色或红色。在这种情况下,我们看到更多的短语是绿色的,例如“患者报告没有以前的胸痛史”和“心电图显示窦性心动过速,无ST段抬高或压低”,而不是红色的,与预测的死亡率为0一致。

在第二个场景中,假设以下医疗入院记录是由医疗工作者记录的:

“患者是一名72岁的女性,主诉严重脓毒症和感染性休克。患者报告过去3天发热、寒战和虚弱,以及尿量减少和混乱。患者有慢性阻塞性肺疾病(COPD)的病史,最近因肺炎住院。生命体征如下:血压80/40 mmHg。心率130次/分钟。呼吸频率30次/分钟。室氧饱和度82%,氧气通过鼻导管给予4L。体格检查发现下肢弥漫性红斑和温热,以及脓毒症的阳性发现,如意识改变、心动过速和呼吸急促。进行了血培养,并开始使用适当的抗生素治疗。”

</

以下截图显示了我们的结果。

使用Amazon SageMaker Clarify在临床环境中解释医疗决策 四海 第2张

这个结果被转发到SageMaker端点后,标签被预测为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框架的医疗保健行业镜头
  • 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

Leave a Reply

Your email address will not be published. Required fields are marked *