오늘 한번 살펴볼 논문은 Deep Patient: An Unsupervised Representation to Predict the Future of Patients from the Electronic Health Records입니다. 2016년 Scientific reports에 게재되었고 Creative Commons Attribution 4.0이 걸려있어, 다른 논문에 비해 논문의 내용을 자유롭게 사용할 수 있습니다.
MI는 medical informatics의 약자로 적어보았습니다. 절대 myocardial infarction 이 아닙니다.
Ref.
Miotto, R. et al. Deep Patient: An Unsupervised Representation to Predict the Future of
Patients from the Electronic Health Records. Sci. Rep. 6, 26094; doi: 10.1038/srep26094 (2016).
전자의무기록(EMR, electronic health record)은 자원의 보고 입니다. 특히 우리나라와 같이 의료 현장에서 전산화가 빨리 이루어진 환경에는, 환자의 임상 데이터는 즉각적으로 기록됩니다. 최소 몇 년 치 이상이 쌓여있죠. 그러면 사람들은 이 것으로 무엇을 하고 싶어할까요? 환자의 과거의 진료 기록을 훑어보고 지금 방문한 환자의 검사나 치료에 반영합니다. 예를 들어 이 환자가 당뇨병에 이미 이환된지 꽤 되었다. 그러면 당뇨망박병증이나 당뇨병성 족부궤양 같은 질환이 발병할 확률이 높겠죠.
연구자들은 어떻게 생각했을까요? 그러면 아예 환자의 예후를 예측해보자, 환자의 미래는어떻게 될 것인가? 물론 다소 전통적으로 여겨지는 생존분석을 통해 환자가 시간이 지남에 따라 얼마나 생존하는지를 분석해볼 수도 있겠죠. 하지만 이러한 시도는 특정 질병에 대해 적용하는 경우가 많았고, 좀 더 일반적인 방법론을 찾아보기로 합니다.
전자의무기록을 바탕으로 하는, 환자의 표현 찾기
그 중에 하나가 전자의무기록을 바탕으로 한, 환자의 표현(representation)을 찾는 것입니다. 그냥 있는 데이터를 만병통치약인 딥러닝에 때려넣으면 되는 게 아니냐. 물론 그렇게 할수도 있겠습니다만 보장은 할 수 없습니다. 제 아무리 최근 딥러닝이 뜨겁다고 해도, 애초에 정돈이 잘 되지 않은 데이터가 들어가는 것보다 어느 정도 해결하고자 하는 문제의 특성이 반영된 데이터가 들어가는 게 좋거든요. 저는 이 것을 domain knowledge의 문제라고 생각합니다.
예를 들면 논문에서는 이렇게 이야기합니다. 제2형 당뇨병( Type 2 diabetes)에 있어서 ICD-9 code (국제 질병사인분류 코드)의 250.x 계열인지, 아니면 hemoglobin A1c가 7.0 이상인건지, 혹은 그냥 자유 기술 노트에 당뇨병이라고 적혀 있는 건지, 이러한 여러 경우의 수를 어떻게 판단할 것이냐.
또한 임상적 정보의 경우 지도학습(supervised learning)을 하기위해서는 임상가들이 일일이 라벨을 달아줘야합니다. 예를 들면 JAMA에 실린 이 논문 같은 경우에도 12만 여개의 이미지에 대해 54명의 안과의사들이 열심히 라벨을 달았습니다. 이쯤되면 머신러닝이 아니라 러닝머신일 것 같지만 여튼. 하지만 지도학습의 경우 특정 도메인에 국한되는 경향이 있어, 이를 일반적 질병들에게 적용하기 위해서는 (그리고 라벨을 다는 인간의 노동력을 아끼기 위해서) 비지도학습이 중요하게 생각되었습니다.
그림 1. 이 연구의 대략적인 개괄 ([1])
그래서 이 논문에서는 무엇을 했느냐. 너무도 다양한 진단명, 처방, 시술, 랩 테스트 결과가 있으므로 차원이 너무 높기 때문에 sparse 하기도 해서 이러한 차원을 축소해보자고 생각했습니다. 또한 EMR데이터에 기록되는 여러 정보들은 불완전한 경우도 많아서 이를 보완하고 싶었던 것 같습니다. 결국 Stacked Denoising Autoencoders (SDA)를 씁니다. SDA 를 쓰면 애초에 input과 output이 같기 때문에, 따로 라벨을 달 필요가 없습니다. 그리고 중간 레이어의 값을 취하면 (perceptron의 갯수가 작은 경우), 차원 축소가 가능합니다. 차원 축소는 사실 빅데이터 분석에서 중요한 의미를 가진다고 보는데, 1) 중요한 feature를 뽑아낼 수 있고 2) computation time 및 storage 소모를 줄일 수 있기 때문입니다.
Feature의 구성
그러면 이렇게 활용할 수 있는 raw data의 feature에는 무엇이 들어갈까요? 우선 진단코드, 랩 실시 종류, 처방 종류 등이 들어갑니다. 보통 이러한 류의 연구는 아직까지 one-hot encoding을 통해서 때려넣는 경우가 많은데, 이 경우 각 랩의 특성을 반영한 특이적인 정보가 들어가지는 않습니다. 이렇게 하는 이유는 1) 검사 종류가 너무 많고 2) 어떻게 feature를 수치적으로 구성해야하는 지에 대해 명확하지 않기 때문입니다. 전자의무기록에 환자의 상태에 대한 기술에는 free-text note도 포함되기 때문에 이에 관한 처리를 Open Biomedical Annotator 를 통해 해줍니다. 자연어처리 중에서 latent dirichlet allocation을 통해 300개의 토픽을 구성하고 이를 각 환자에게 할당하여 feature에 포함시킵니다. 생각보다 이 분야에서는 자연어처리에 해당하는 방법론이 많이 쓰입니다.
학습에 대한 데이터셋
그러면 이렇게 구성된 환자의 (낮은 차원의) 표현(representation)에 대해 잘 학습 되었는지 검증이 필요합니다. 우선 데이터셋을 살펴봐야하는데, Mount Sinai 데이터 웨어하우스에 저장된 70만여명의 환자 데이터를 사용하고, 그 중에서 A군) 10번 이상 방문하고 2014년에 (2013년까지는 학습으로 쓰고 2014년에서는 split-point를 설정하여 예측으로 사용합니다) 새롭게 진단된 코드가 있는 환자를 대상으로, 미래에 등장할 코드에 대한 test와 validation을 수행합니다. 이러한 환자군을 빼고, B군) 5번 이상 방문한 환자들에 대해서는 미래에 등장할 코드 예측 작업을 위한 training을 수행합니다. 그리고 C군) 나머지 환자군들에 대해서는 적합한 환자군 (교란 변수 많은 환자 제외)에 대해서는 표현(representation)에 대한 학습을 수행합니다. 그러고서는 다음과 같이 진행합니다.
- C군에 대해서 SDA를 적용하여 representation을 구합니다. (encoding function f 를 구함)
- B군에 대해서 representation으로 변환하고 random forest를 통해 (미래의 진단 코드를) 학습 시킵니다.
- A군에 대해서 코드를 예측합니다.
결과
결과에 따르면 SDA 를 통해 unsupervised representation을 구한 것이, 그냥 생으로 feature (raw feature)를 쓴 것이나 Principal Component Analysis (PCA)를 통해 예측한 것보다 ROC/AUC 측면에서 낫다고 주장하고 있습니다. 그도 그럴수밖에 없는 것이, 아무래도 PCA는 높은 분산을 가진 차원을 하나씩 찾아가며 선형적으로 차원 축소하는 것이고, SDA의 경우에는 비선형적인 특성을 같이 고려한 것이기 때문에 아무래도 잃어버린 정보가 적을 수 밖에 없기 때문이 아닐까 합니다. 또한 각 환자의 특성을 직접 보기 위해서 특정 기간을 정해 annotation을 보고 precision@k를 메트릭으로 사용하고 있는데요, 이 경우에도 다른 차원 축소 알고리즘에 비해, 환자의 질병을 나타내는 tagging에 있어서 건져올린 것들 중에서는 연관성 있는 질병들을 잘 건져올렸다고 볼 수 있습니다.
제한점
하지만 이 논문의 한계점도 존재합니다.
- Feature aggregation이 너무 단순화 되어 있다. 환자의 특성을 반영하기 위해서는 방문 횟수 뿐만 아니라 순서도 중요합니다. 여기에서는 그러한 정보가 반영되어 있지 않습니다.
- Lab test 데이터를 좀 더 영역 특이적으로 (domain specific) 만들 수는 없을까?
- 생각보다 free text에 해당하는 feature 가 전체 feature 중 비중이 작아, 그 효과를 알길이 없다.
뭐, 언젠가는 이를 극복하고 더 좋은 방법론이 나오겠지요.
물론 찾아보면 몇가지 있습니다. :)
Reference
[1] Miotto, R. et al. Deep Patient: An Unsupervised Representation to Predict the Future of
Patients from the Electronic Health Records. Sci. Rep. 6, 26094; doi: 10.1038/srep26094 (2016).
[2] Pascal Vincent, et. al.
Stacked Denoising Autoencoders: Learning Useful Representations in a Deep Network with a Local Denoising Criterion, The Journal of Machine Learning Research, Volume 11, 3/1/2010 ,PP. 3371-3408
[3] David M. Blei, et. al. Latent dirichlet allocation, The Journal of Machine Learning Research,Volume 3, 3/1/2003 ,Pages 993-1022