[BME, MI, CS] Deep Patient: 전자의무기록을 통한 환자의 미래 예측하기 => 비지도학습 기반의 표현을 바탕으로

in kr-science •  7 years ago  (edited)

오늘 한번 살펴볼 논문은 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)에 대한 학습을 수행합니다. 그러고서는 다음과 같이 진행합니다.

  1. C군에 대해서 SDA를 적용하여 representation을 구합니다. (encoding function f 를 구함)
  2. B군에 대해서 representation으로 변환하고 random forest를 통해 (미래의 진단 코드를) 학습 시킵니다.
  3. A군에 대해서 코드를 예측합니다.

결과
결과에 따르면 SDA 를 통해 unsupervised representation을 구한 것이, 그냥 생으로 feature (raw feature)를 쓴 것이나 Principal Component Analysis (PCA)를 통해 예측한 것보다 ROC/AUC 측면에서 낫다고 주장하고 있습니다. 그도 그럴수밖에 없는 것이, 아무래도 PCA는 높은 분산을 가진 차원을 하나씩 찾아가며 선형적으로 차원 축소하는 것이고, SDA의 경우에는 비선형적인 특성을 같이 고려한 것이기 때문에 아무래도 잃어버린 정보가 적을 수 밖에 없기 때문이 아닐까 합니다. 또한 각 환자의 특성을 직접 보기 위해서 특정 기간을 정해 annotation을 보고 precision@k를 메트릭으로 사용하고 있는데요, 이 경우에도 다른 차원 축소 알고리즘에 비해, 환자의 질병을 나타내는 tagging에 있어서 건져올린 것들 중에서는 연관성 있는 질병들을 잘 건져올렸다고 볼 수 있습니다.

제한점
하지만 이 논문의 한계점도 존재합니다.

  1. Feature aggregation이 너무 단순화 되어 있다. 환자의 특성을 반영하기 위해서는 방문 횟수 뿐만 아니라 순서도 중요합니다. 여기에서는 그러한 정보가 반영되어 있지 않습니다.
  2. Lab test 데이터를 좀 더 영역 특이적으로 (domain specific) 만들 수는 없을까?
  3. 생각보다 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

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

내용이해가 조금 어렵네요^^;
결국 정리해보면

환자의 다양한 임상데이터를 비지도학습으로 분석하여
환자의 표현?representation?을
예컨데 A~Z 정도로 분류한뒤
해당 당뇨병 환자는 representation이 K 정도 되니깐 앞으로 당뇨망막병증이 올 확률은 몇퍼센트라고 예측할수 있다..

이런 논문인가요?^^;;;
각질병마다 관련있는 lab이나 증상등이 너무 다양한데 이걸 일반적인 방법론을 적용할수 있는지 아직 잘 이해가..ㅠㅋㅋ

재주가 없는 글을 읽어주셔서 감사합니다. 제가 조금 더 풀어쓸 걸 그랬네요.

우선 환자는 1번 이상 병원에 방문하게 됩니다. 그러면 어떤 진단을 받을 수도 있고, 어떤 검사를 시행할수도 있고, 어떤 처방이 나갈 수도 있습니다. 이를 모두 feature로서 설정합니다. 예를 들면 어떤 환자가 특정 시기에 병원에 방문해서, 경구당부하검사(OGTT)를 통해, 당뇨를 진단받고 metformin을 처방 받았다. 이렇다면 lab에 해당하는 feature는 OGTT, 진단에 해당하는 feature는 당뇨에 관한 코드, 처방에 해당하는 feature는 metformin이 되겠죠. 하지만 lab은 OGTT 이외에 여러 검사들이 있을 것이고, 진단도 당뇨 이외에 여러가지가 있을 것이고, 처방도 여러 약제가 있을 것입니다. 이 때 feature에서 6번째를 OGTT, 7번째를 당뇨, 8번째를 metformin이라고 가정해봅시다. (벡터를 한번 생각하면 좋을 것 같습니다.) 그러면 첫번째 방문에서 환자의 representation 은 [0,0,0,0,0,1,1,1,0,0,0] 등으로 나타낼 수 가 있습니다. 만약 metformin 대신에 인슐린을 처방받았고 이게 9번째라면 환자의 representation은 [0,0,0,0,0,1,1,0,1,0,0] 으로 나타내는 것이 가능합니다. (즉, 한 환자, 한 방문에 해당하는 벡터가 존재합니다.)

그러면 여러번 방문하는 경우에는 어떻게 환자를 나타낼 수 있을까요? 가장 간단한 방법은 각 벡터를 더하는 것입니다. 만약 위 환자가 첫번째 방문에서는 OGTT랑 당뇨 진단, 그리고 metformin을 처방받고, 두번째 방문에서 다시 OGTT랑 insulin을 처방받으면 [0,0,0,0,0,1,1,1,0,0,0] + [0,0,0,0,0,1,0,0,1,0,0] = [ 0,0,0,0,0,2,1,1,1,0,0] 으로 구성할 수 있습니다.

이러한 작업 등을 통해 환자의 정보는 2^(전체 feature)에 해당하는 차원 안에서, representation되는 특성을 가지게 됩니다.

이제 특정 날짜를 정해, 특정 날짜 이전에는 과거의 데이터로서 x, 특정 날짜 이후에는 미래의 데이터로서 y를 잡고, 각 환자마다 input 'x', output 'y'와 같은 식으로 학습을 시킬 수 있습니다. 이를 어떤 식으로 학습시킬지는 기법마다 다르긴 한데요, 대략적으로 이런 환자는 representation이 어떤 벡터 (혹은 벡터들의 집합)로 주어지니, 향후 벡터는 이렇게 되지 않을까 예측하는 문제로 바꾸어볼 수 있습니다.

가장 간단한 문제로 치환하면, 앞으로 당뇨망막병증이 1년안에 올까? (1년 안에 진단받을까?) 정도로 치환해볼 수 있고요, Soft-max와 같은 출력부를 쓰면 확률도 예측이 가능은 할 것입니다. (다만 이를 위해서는 디테일한 문제들이 좀 있는데, 이건 다음번에 한번 적어보도록 할게요)

말씀주신대로 각 질병마다 관련있는 lab과 증상이 너무 다양해서, 원래는 특정 도메인을 해결할 수 있는 머신러닝의 방법론이 많이 발달했지만, 가급적 그러한 인간의 손길(?)을 배제하고 일반적으로 적용시켜보자-라는 철학을 가지고 있는 것이 이러한 분야의 연구들입니다.

저도 읽으면서 이해가 안되는 부분이 있었는데, 댓글로 깔끔하게 설명해주셨네요.ㅎㅎ
감사합니다 :)

그렇지 않아도 글이 좀 안읽히려나 생각을 했었는데, 길게 댓글 달길 잘한 것 같습니다. 감사합니다.

상세하고 친절한 댓글에 깜짝 놀랐습니다. 정말 감사드립니다.
이제 어렴풋이 이해가 되었어요.
학회 다녀봐도 머신러닝이 진단 분야에 사용되는 예만 보았는데, prognosis 분야로도 연구가 되고 있다니 정말 신기합니다.

이렇게 자세하게까지 질문드릴 생각은 없었는데 읽다보니 쓸데없이 학구열이 치솟아 몇가지만 더 여쭤봐도 될지요? :)

첫번째로, 어짜피 환자들의 EMR 빅데이터를 입력해야 도출되는 결과면, 언급하신 지도학습이나 생존분석 등을 통해 귀납적추리로 환자의 prognosis를 예측하는 모델이 훨씬 쉽고 현대의학consensus(경험에 의한 예측)에도 부합하지 않을까 합니다^^;

두번째로는, 저 최종 벡터로 방향성은 예측한다고 하더라도 지금까지의 진행속도가 앞으로의 진행속도를 잘 예측할지는 의문입니다.(cancer aggravation 속도가 제멋대로라 각종 biomarker와도 일치하지 않듯이)

세번째로는, 측정값의 불완전함(lab이나 이미지 검사상의 오차, 오류 등등)을 보정하면서 정밀하게 예측하려면, 환자 개인의 많은 데이터셋이 필요할 것으로 보이고, 피검사나 MRI 검사 등을 훨씬 자주 해야하는 문제가 생기겠네요.. 인체에 검사키트를 이식하는 칩이 개발될 즈음에 완성되려나^^;

연구자들의 호기심으로 이제 막 시작된 분야라 아직 발전방향이 정해지지 않았거나, 제머리로 이해안되는(지금도 과부하 ㅠ) 어려운 설명이 더해져야 한다면
그냥 저 궁금증 바람에 날려보낼께요 ^^;
충분히 감사드리는 마음으로 댓글까지 풀보팅!! ㅋ 다시 한번 친절한 설명 감사드립니다 :)

우선 첫번째 주신 질문에, 제 짧은 지식에 의거하여 답변을 드리자면, 맞습니다. EMR을 바탕으로 무언가 결과를 도출하기에 아직까지는 좀 투박하죠. 전체 질병/진단에 대해 일반화를 하기위해 오히려 영역에 특이적인 자료를 포함시키지 않는 것이 맞습니다. 질병마다 Heterogeneous 한 자료들을 하나로 묶기가 어렵기 때문에, 가장 단순한 형태인 code를 사용하여 돌리고 있는 것입니다. 또한 아무래도 Interpretability 문제가 있을 수 있습니다. 명확한 기준과 룰에 따라 세워진 모델은 해석이 가능한데, 사실 딥러닝 기반으로 세워진 방법들인 어떻게 이러한 weight와 bias를 해석할지에 대한 문제가 남습니다. 특히 기존 임상의사들을 어떻게 설득할 것이냐는 측면에서는 더욱 그렇습니다.

두번째로, 우선 진행속도를 정의하는 것이 필요합니다. 그리고 생각보다 같은 질병군에 대해서는 딥러닝으로 학습시키기에 자료가 많지 않은 경우가 많습니다. (이미지 제외 - 이미지는 애초에 담고 있는 정보량이 많을뿐더러, rotation, flip 등을 그 양을 좀 많이 불릴 수 있습니다.) 따라서 특정 질병에 대한 코호트에 담긴 환자들의 질병 진행속도까지 예측하기는 쉽지 않습니다. 오히려 말씀주신대로 기존 생리학적 기반 혹은 (특정 질병 영역에 쓰일 수 있는) 여러 마커 기반의 모델링이 도움이 될 가능성이 높습니다.

세번째 주신 코멘트에 대해서는, 일부분 동의합니다. (의학 분야에 적용하기 위해서) 아직까지 데이터는 많을수록 좋은 것 같습니다. 다만 환자에게 주어진 여러 정보들을 종합하다보면 여러가지 의미있는 패턴이 나오지 않을까 예측하고 있습니다. 그러기 위해선 역시 데이터가 많이 필요하고, 최근 의료정보
쪽에서 Common Data Model이 강조되는 이유가 여기에 있습니다.

전문적인 분야로 조금은 이해하기 어려웠네요 ^^;;
좋은 글 감사합니다.
보내주신 스달 잘 받았습니다!
아이들에게 도움을 주셔서 진심으로 감사합니다^^

처음에 시험삼아 한 것이었는데, 과분한 댓글 달아주셔서 감사합니다. 사실 아직 active한 글인줄은 잘 몰랐는데, 댓글 달아주셔서 알게되었습니다. 틈틈히 후원드리겠습니다. :)