BLOG

Amazon HealthLake과 Amazon SageMaker로 환자 결과 예측 애플리케이션 구축하기
작성일: 2021-08-06

의료 데이터는 다루기 어려운 분야로 AWS 고객은 데이터 및 머신 러닝(ML) 기술을 활용해 특정 비즈니스 문제들을 해결할 방법을 찾고 있습니다. 생일, 성별, 결혼 여부 등 일부 데이터는 구조화되어 있지만 진단 코드나 의사 소견서 등 대부분의 데이터는 구조화되어 있지 않습니다. 이 데이터는 인간은 이해할 수 있지만 컴퓨터는 이해할 수 없도록 설계되었습니다. 의료 데이터를 사용의 주요 과제는 다음과 같습니다.

 

  • 구조화된 데이터와 구조화되지 않은 데이터를 모두 효과적으로 사용하여 데이터를 완벽하게 보는 방법
  • 예측 결과를 직관적으로 해석하는 방법

 

하지만 이제는 AI/ML 기술의 등장으로 이러한 과제를 해결할 수 있게 되었습니다.

 

관련 사용 사례 중 하나는 급성 또는 만성질환으로 인한 병원 방문 또는 재입원 예측, 특정 관찰 기간 내 질병 진행 예측 등을 포함하는 환자 결과 예측입니다. 의료 제공자, 납부자 및 제약 회사는 예측 결과를 사용하여 조기 치료를 권장하고, 의사소통을 개선하고, 환자 진료 경험을 개선하고, 전체 비용을 절감할 수 있습니다.

 

오늘 테크블로그 포스팅으로는 딥 러닝 기반 환자 결과 예측 모델을 구축하는 예를 보여드리겠습니다. Amazon HealthLake에 저장된 MIMIC-III 데이터를 사용하여 Amazon SageMaker에서 모델을 구축하고 해석과 시각화를 위한 경량 애플리케이션으로 전환합니다. 이 예의 목표는 ICU 퇴원 후 90일 이내의 사망률 예측입니다. 필요에 맞게 대상 변수를 수정할 수 있습니다.

 

 

환자의 건강 데이터 파악이 용이한 Amazon HealthLake

HealthLake는 의료 기관, 의료 보험 회사 및 제약 회사가 페타바이트 규모의 의료 데이터를 저장, 변환, 쿼리 및 분석할 수 있도록 하는 HIPAA 지원 서비스입니다.

 

HealthLake API에서 내보낸 데이터 소스는 MIMIC-III[1]라고 합니다. 이 데이터베이스는 40,000명이 넘는 중환자실에 입원한 환자들의 비식별화된 건강 관련 데이터로 구성되어 있으며, 무료로 사용할 수 있는 대규모 데이터베이스입니다. 데이터베이스에는 인구 통계, 바이탈사인, 실험실 테스트 결과, 절차, 의약품, 간병인 메모, 영상 보고서 및 사망률과 같은 정보가 포함됩니다. 라이센스 제한으로 인해 이 게시물의 데이터를 공유할 수는 없지만 MIMIC의 공식 웹 사이트를 방문하여 데이터 액세스를 요청할 수 있습니다.

 

HealthLake는 텍스트가 Fast Healthcare Interoperable Resource(FHIR) DocumentReference 유형으로 HealthLake에 저장될 때 임상 항목을 자동으로 추출하고 ICD-10-CM 및 RxNorm 코드를 퇴원 기록와 같은 비정형 텍스트에 연결합니다. 추출된 엔티티는 FHIR 확장으로 FHIR DocumentReference 리소스에 다시 추가됩니다. DocumentReference에 포함된 텍스트는 base64로 인코딩되어야 합니다. 예측 모델을 구축할 때 추출된 정보를 다른 구조화된 데이터와 결합하여 환자의 의료 기록을 보다 전체적으로 볼 수 있습니다.

 

 

솔루션 개요

다음 설계도는 model training pipeline, inference pipeline, 및 information-rendering front end를 보여줍니다.

 

HealthLake export API를 사용하여 정규화된 데이터를 Amazon Simple Storage Service (Amazon S3) 버킷으로 내보냅니다. 그런 다음 AWS Glue crawler를 사용하여 Data Catalog를 생성합니다. Data Catalog와 함께 Amazon Athena를 사용하여 내보낸 데이터에 대해 SQL과 유사한 쿼리를 실행할 수 있습니다. 환자 기록의 비정형 데이터는 별도로 처리되어 인덱스 데이터를 추출하고 다른 정형 정보와 결합합니다. 그런 다음 TensorFlow container와 함께 SageMaker notebook을 사용하여 맞춤형 convolutional neural network 모델을 훈련합니다. Model artifact는 S3 버킷에 저장되며 나중에 보이지 않는 데이터에 대한 모델 성능을 테스트하는 데 사용됩니다. 마지막으로 SageMaker batch transform을 사용하여 모델에 대한 추론을 실행하고 결과를 Amazon S3에 저장합니다. 또한 시각화 구성 요소를 개발하고 Amazon API Gateway를 통해 렌더링하여 모델의 해석 능력을 향상시킵니다.

 

이 게시물에서는 다음 단계를 안내합니다:

  1. 훈련 및 테스트 데이터셋을 생성.
  2. 임베딩 기술을 사용해 비정형 데이터 보다 풍부하게 표현
  3. 모델 훈련.
  4. 결과 평가
  5. 사용자 정의 UI 구성 요소로 결과 시각화

 

 

교육 및 테스트 데이터셋을 생성하기

먼저 퇴원 후 90일 이내에 사망률을 대상으로 2진수 변수를 생성합니다. 환자의 사망 상태가 1 로 설정되기 전에 목표 변수 값이 0 인 기록이 여러 개 있을 수 있습니다. 이 상황은 다른 많은 환자 결과 예측 대상 변수에도 적용됩니다. 따라서 우리는 정보 유출을 방지하기 위해 patient_id 별로 데이터를 훈련, 검증 및 테스트 데이터셋으로 분할합니다. 이를 통해 단일 환자의 여러 기록이 둘 이상의 데이터 세트 범주에 나타나는 것을 방지할 수 있습니다.

 

먼저 테스트 목적으로 환자의 20%를 따로 분류하고, 이러한 환자 기록을 알고리즘에서 볼 수 없는 것으로 처리합니다. 나머지 80%의 환자 중 80%는 훈련을 위해, 20%는 검증을 위해 분류합니다. 추후에 사용할 수 있도록 해당 데이터셋을 S3 버킷에 업로드합니다.

 

 

임베딩 기술 사용하기

기존의 ML methods에서는 term frequency-inverse document frequency (TF-IDF)와 같은 주파수 카운트 기반 인코딩 기술을 사용할 수 있었습니다. 이 게시물에서는 서로 다른 의료 코드 간의 관계를 학습하여 비정형 데이터를 보다 풍부하게 표현하는 임베딩 기술을 사용합니다.

 

먼저 의료 코드 시퀀스를 수집하고 스킵그램을 사용하여 서로 다른 코드 간의 관계를 학습합니다. 각 의료 코드에 대해 학습된 임베딩은 일반적으로 개별 요소의 특성을 나타내는 n-길이 벡터(300 등)입니다. 이러한 넓이는 일반적으로 명확한 의미는 없지만 유사한 의료 개념을 특징 공간에 서로 더 가깝게 투영해야 합니다. 우리는 훈련 중에 모든 어휘에 대해 이러한 벡터를 학습하고 매트릭스로 함께 쌓았습니다. 나중에 이 임베딩 매트릭스를 사용하여 컨볼루션 신경 네트워크 모델을 훈련하고 보이지 않는 데이터에 대한 테스트를 수행합니다.

 

 

모델 훈련하기

먼저 신경 네트워크의 구조를 정의한 후 SageMaker에서 호스팅하는 TensorFlow 교육 이미지를 사용하여 모델을 교육합니다. 레이어는 다음과 같이 정의됩니다.

 

  • Embedding layer – 처리되지 않은 의료 코드 시퀀스를 가져아 각 개별 코드를 임베딩으로 변환합니다.
  • Convolutional layer – 임베딩을 취합하고 가변 필터로 결합합니다.
  • Pooling layer – 집계 계산을 적용하여 다음 레이어의 입력 크기를 줄입니다.
  • Dropout layer – 오버핏을 줄이기 위해 연결을 무작위로 끕니니다.
  • Concatenation layer – 이전 레이어에서 처리한 정보를 환자 연령 또는 성별과 같은 구조화된 정보와 결합합니다.
  • Sigmoid activation이 포함된 Fully connected layer – 최종 예측 확률을 출력합니다.

 

훈련 중에는 이러한 예측 확률을 사용하여 메트릭스를 계산하고 훈련 프로세스의 방향을 안내합니다. 테스트하는 중에 이러한 확률은 Amazon S3에 파일로 출력됩니다.

 

훈련 프로세스가 완료되면 모델 아티팩트를 저장하고 추후에 사용할 수 있도록 S3 버킷에 업로드합니다.

 

 

결과 검토하기

다음 지표는 테스트 데이터에 대한 ROC(Receiver Operating Characteristics) 곡선 및 분류 보고서를 보여줍니다.

 

 

ROC 곡선은 다양한 임계값에서 모델의 성능을 보여줍니다. ROC 곡선의 AUC(Area Under the Curve)는 0.82로, 다른 대상 클래스를 구분하는 모델의 능력을 측정합니다. 분류 보고서에서는 각 클래스에 대한 정밀도, 재현율 및 F1 점수에 대한 개요를 제공합니다. 모델의 가중 평균 F1 점수는 0.74입니다.

 

 

사용자 지정 UI 구성 요소를 사용하여 시각화하기

예측 결과는 다양한 방법으로 시각화할 수 있습니다. 이 게시물에서는 S모델의 해석 가능성을 개선하기 위해 SHAP(SHaPley Additive ExPlanations) 값을 렌더링하는 방법만 보여줍니다. SHAP는 ML 모델의 출력을 설명하는 게임 이론적 접근 방식입니다. 시각화는 각 예측의 기여 요인에 대한 세부 정보를 보여줌으로써 어떤 기능이 예측 확률을 기본 값에서 더 높이거나(1쪽으로) 더 낮게(0쪽으로) 밀어내는지 직관적으로 파악할 수 있습니다.

 

먼저 HTML 템플릿을 정의하고 템플릿에 시각화 구성 요소를 계속 추가합니다. 그런 다음 HTML 파일을 S3 버킷에 업로드하고 AWS Lamda 함수를 설정하여 HTML 콘텐츠를 검색하면 콘텐츠가 API Gateway로 전송되어 웹 페이지를 렌더링합니다.

 

 

HTML 템플릿 설정하기

다음 코드를 사용하여 빈 코드 블록이 포함된 HTML 템플릿을 정의합니다.

 

<div>

<h1>Dashboard</h1>

<div>

    <h2>Indicators</h2>

    {shap_value}

    </div>

</div>

 

나중에 Python 또는 JavaScript 라이브러리를 통해 {<html-code-block>}을 생성하고 코드를 블록에 연결할 수 있습니다.

 

 

시각화 구성 요소 생성하기

SHAP 값 시각화를 생성하는 예는 다음과 같은 코드와 같습니다.

 

explainer = shap.KernelExplainer (tf_model, X_train)

shap_values = explainer.shap_values(X_test, nsamples=100)

shap.initjs()

shap.force_plot(explainer.expected_value[0], shap_values[0][0,:], X_test.iloc[0,:])

 

이것으로 예측 이면에 있는 드라이버에 대한 직관적인 설명을 생성할 수 있습니다. 다음 시각화에서 볼 수 있듯이 빨간색 티커는 환자의 결과 예측 확률을 높은 끝(1쪽으로)으로, 파란색 티커는 낮은 끝(0쪽으로)으로 유도합니다. 따라서 이 환자는 학습 코호트 기본 값 0.4481에 비해 0.34의 확률을 갖습니다. 따라서 이 환자는 대상 변수에 양성일 가능성이 더 낮습니다.

 

 

 

HTML 파일을 구문 분석하는 Lambda function 생성하기

예제 Lambda function은 다음 코드만큼이나 단순합니다:

 

import json

import boto3

def lambda_handler(event, context):

    s3 = boto3.client(‘s3’)

    response = s3.get_object(Bucket='<bucket>’, Key='<key>’)

    return response[‘Body’].read().decode(‘utf-8’)

 

이 기능의 목적은 Amazon S3 리소스를 외부에 노출하지 않고 렌더링해야 하는 정보를 검색하여 API Gateway로 전송하는 것입니다.

 

 

HTML 파일을 렌더링하는 API Gateway 생성하기

AWS Cloud Development Kit (AWS CDK)를 사용하여 이러한 설정을 자동화할 수 있습니다. 예를 들어

api = apigw.LambdaRestApi(

    self, ‘visualization’, handler=lambda_handler, proxy=False)

integration = apigw.LambdaIntegration(

    lambda_handler, proxy=False,

passthrough_behavior=apigw.PassthroughBehavior.WHEN_NO_TEMPLATES,

    integration_responses=[{

        “statusCode”: “200”,

    “responseTemplates”: {“text/html”: “$input.path(‘$’)”},

        “responseParameters”: {

        “method.response.header.Content-Type”: “‘text/html'”}

}])

 

integration_responses부분은 반환된 콘텐츠가 API Gateway에 의해 HTML이 올바르게 렌더링되는지 확인합니다. API Gateway가 배포되면 invoke URL이 생성됩니다. 이 URL을 통해 웹 브라우저에서 시각화 결과를 확인할 수 있습니다.

 

 

마무리

오늘은 Amazon SageMaker와 Amazon HealthLake를 사용하여 의료 및 생명 과학 문제를 해결하고 시각화 기술을 통해 결과를 해석하는 딥러닝 모델을 구축하는 방법을 시연했습니다. 이 솔루션을 통해 병원은 환자를 더 잘 돌보고 환자의 결과를 예측하여 적절한 치료를 제공할 수 있습니다. ICU 퇴원 후 90일 이내에 사망률 예측에 대해 이 솔루션을 시연했으며, 다른 환자 결과 예측 사용 사례에도 동일한 방법을 적용할 수 있습니다.

 

HealthLake를 사용해 의료 데이터로 쉽게 작업하고 구조화되지 않은 임상 기록에서 관련 데이터 포인트를 추출할 수 있습니다. 딥러닝 모델링 기술은 보다 적은 기능 엔지니어링 노력으로 보다 정확한 모델을 구축할 수 있으며 AWS 기술은 lightweight front-end 솔루션을 통해 모델 해석을 시각화할 수 있습니다.

 

HealthLake에 대한 자세한 내용은 Amazon HealthLake resourcesMaking sense of your healthdata with Amazon HealthLake를 참고해 주시기 바랍니다. Amazon HealthLake workshop에서는 실습 튜토리얼을 확인하실 수 있습니다. HealthLake 및 인구 상태 사용 예제는 Population health applications with Amazon HealthLake – Part 1: Analytics and monitoring using Amazon QuickSight를 확인해 주시기 바랍니다.

 

참고문헌

[1] MIMIC-III, a freely accessible critical care database. Johnson AEW, Pollard TJ, Shen L, Lehman L, Feng M, Ghassemi M, Moody B, Szolovits P, Celi LA, and Mark RG. Scientific Data (2016). DOI: 10.1038/sdata.2016.35. Available from: http://www.nature.com/articles/sdata201635

원문URL: https://aws.amazon.com/ko/blogs/machine-learning/build-patient-outcome-prediction-applications-using-amazon-healthlake-and-amazon-sagemaker/

 

메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글이나 관련 기사 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.