RETAIN은 의료 애플리케이션을 위한 해석 가능한 예측 모델입니다. 환자 기록을 바탕으로 방문 시 각 의료 코드(진단 코드, 약물 코드, 시술 코드)가 어떻게 예측에 기여하는지 설명하면서 예측을 할 수 있습니다. 신경주의 메커니즘을 사용하여 해석이 가능합니다.
RETAIN을 사용하면 여러 방문 시 각 의료 코드(진단, 약물 또는 시술 코드)가 최종 점수에 얼마나 긍정적/부정적으로 기여하는지 계산할 수 있습니다. 이 경우 해당 환자가 심부전(HF) 진단을 받을지 여부를 예측하고 있습니다. 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에 쉽게 설치할 수 있습니다.
GPU 계산을 사용하려는 경우 CUDA를 설치하십시오.
RETAIN 코드 다운로드/복제
2단계: MIMIC-III를 사용하여 RETAIN을 테스트하는 빠른 방법
이 단계에서는 방문 기록을 사용하여 환자의 사망률을 예측하기 위해 MIMIC-III를 사용하여 최소한의 단계로 RETAIN을 훈련하는 방법을 설명합니다.
먼저 11년 동안 ICU 환자로부터 수집된 공개 전자 건강 기록인 MIMIC-III에 대한 액세스를 요청해야 합니다.
"process_mimic.py"를 사용하여 MIMIC-III 데이터세트를 처리하고 RETAIN에 적합한 교육 데이터세트를 생성할 수 있습니다. MIMIC-III CSV 파일이 있는 동일한 위치에 스크립트를 배치하고 스크립트를 실행합니다. 실행 명령은 python process_mimic.py ADMISSIONS.csv DIAGNOSES_ICD.csv PATIENTS.csv <output file>
입니다.
process_mimic.py에서 생성된 ".seqs" 및 ".morts" 파일을 사용하여 RETAIN을 실행합니다. ".seqs" 파일에는 각 환자의 방문 순서가 포함되어 있습니다. 각 방문은 여러 진단 코드로 구성됩니다. 그러나 결과를 훨씬 더 해석하기 쉽도록 ".3digitICD9.seqs" 파일을 대신 사용하는 것이 좋습니다. (또는 ICD9용 단일 수준 임상 분류 소프트웨어를 사용하여 코드 수를 수백 개로 줄여 성능을 더욱 향상시킬 수 있습니다.) ".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
데이터세트에 사용된 전체 3자리 ICD9 코드의 번호입니다.
해석을 위한 모델을 테스트하려면 6단계를 참조하십시오. 저는 개인적으로 주산기 황달(ICD9 774) 이 사망률과 높은 상관관계가 있음을 발견했습니다.
위 명령을 사용하면 모델이 0.8 이상의 AUC에 도달하지만 해석이 매우 명확하지 않습니다. 하이퍼 매개변수를 조정할 수는 있지만 상황이 크게 개선될지는 의문입니다. 결국 1회 이상 병원을 방문한 환자는 7,500명에 불과했고, 대부분은 2회만 방문했습니다.
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]]과 같을 수 있습니다. (물론 숫자는 가짜이며 첫 번째 방문 시간을 0으로 설정했습니다.) "시간 파일"을 사용하려면 --time_file <path to time file>
옵션을 사용하십시오. ".train", ". valid", ".test" 규칙은 "time file"에도 적용됩니다.
추가: 자신의 의료 코드 표현 사용
RETAIN은 훈련하는 동안 의료 코드의 벡터 표현을 내부적으로 학습합니다. 물론 이러한 벡터는 임의의 값으로 초기화됩니다.
그러나 자신만의 의료 코드 표현이 있는 경우 이를 사용할 수도 있습니다. (Skip-gram과 같은 알고리즘을 사용하여 훈련할 수 있습니다. 자세한 내용은 Med2Vec 또는 this을 참조하십시오.) 의료 코드 표현을 제공하려면 N 행의 목록(기본적으로 행렬)이어야 하며 N은 "방문 파일"의 고유 코드 수이고 M은 코드 표현의 크기인 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에게 알파 생성을 위해 128차원 숨겨진 레이어가 있는 GRU를 사용하도록 지시합니다.
드롭아웃은 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은 각 epoch 이후 검증 세트의 AUC를 확인하고, 이전 값보다 높으면 현재 모델을 저장합니다. 모델 파일은 numpy.savez_compressed에 의해 생성됩니다.
6단계: 모델 테스트
"test_retain.py" 파일을 사용하면 각 방문 시 각 의료 코드의 기여도를 계산할 수 있습니다. 먼저 numpy.savez_compressed에 의해 저장된 훈련된 모델이 필요합니다. RETAIN을 교육한 구성을 알아야 합니다(예: --time_file
사용, --use_log_time
사용).
이번에도 마찬가지로 준비한 "방문 파일"과 "라벨 파일"이 필요합니다. 그러나 이번에는 ".train", ".valid", ".test" 규칙을 따를 필요가 없습니다. 테스트 스크립트는 주어진 파일 이름을 로드하려고 시도합니다.
또한 실제 문자열 의료 코드와 해당 정수 코드 간의 매핑 정보가 필요합니다. (예: "Hypertension"은 24로 매핑됩니다.) 이 파일(이 파일을 "매핑 파일"이라고 부르겠습니다)은 키가 문자열 의료 코드이고 값이 해당 정수인 Python cPickled 사전이어야 합니다. (예: process_mimic.py에서 생성된 매핑 파일은 ".types" 파일입니다.) 이 파일은 각 의료 코드의 기여도를 사용자에게 친숙한 형식으로 인쇄하는 데 필요합니다.
--time_file
또는 --use_log_time
과 같은 추가 옵션의 경우 모델을 교육한 것과 정확히 동일한 구성을 사용해야 합니다. 자세한 내용을 보려면 "--help" 옵션을 사용하세요.
테스트 스크립트를 실행하기 위한 최소 입력은 "모델 파일", "방문 파일", "레이블 파일", "매핑 파일", "출력 파일"입니다. "출력 파일"은 기여가 저장되는 곳입니다. python test_retain.py <model file> <visit file> <label file> <mapping file> <output file>