심전도(ECG)에 나타나는 이상 패턴을 자동으로 탐지할 수 있을까?

글쓴이 Inforience 날짜

클릭 >> Hello, world !! (from ShadowEgo)

심장박동 패턴에 대한 분석의 필요성

사람의 심장박동이 나타내는 패턴을 이해하고, 이상 패턴을 정확히 탐지(분류)할 수 있는 지능적인 모듈을 구현할 수 있을까? 이러한 기능이 구현되어 실시간으로 심장박동 패턴을 모니터링하는 장치에 탑재된다면, 심장질환을 가진 사람들에게는 큰 도움이 될 수 있다. 예를 들어, 부정맥, 협심증이나 심근경색 등의 질환을 가진 환자들이나, 고지혈증, 고혈압, 당뇨 등과 같이 심혈관 건강과 밀접한 관련을 가진 질환을 가진 사람들의 심장 건강 상태를 자동적으로 체크할 수 있게 된다. 더 나아가, 갑자기 찾아오는 심장마비나 심정지 상태를 미리 예측할 수 있게 된다면 많은 사람들의 소중한 생명을 구할 수도 있다. 그런데, 이러한 기능을 구현하려면, 심장박동 패턴의 특징을 자동적으로 파악, 분류하는 기능이 우선적으로 필요하다. 더 구체적으로 말하자면, 입력된 심장박동 데이터가 정상 패턴을 보이는지, 아니면 이상 징후를 보이는지의 여부를 스스로 판단하는 모듈을 구현해야 한다.

이번 포스팅에서는, 이미 기록된 ECG(electrocardiogram: 심전도) 데이터에서 부정맥(Arrhythmia)의 존재 여부를 찾아내고 구분하는 기초적인 모듈을 구현해 본 결과를 소개한다. ECG 데이터를 활용한 첫 실험결과를 담은 포스팅이니만큼, 기본적인 구조의 머신러닝 모델을 쓴 결과를 소개하기로 한다.

활용 데이터 선정

실험을 진행하려면, 많은 양의 ECG 데이터가 필요하다. 또한 각 데이터에 부정맥 패턴이 들어있는지 알려져 있어야 한다. 기초적인 수준의 실험을 하면서 대용량의 ECG 데이터를 직접 모을 수는 없는 노릇이니, 우선 많은 연구자 및 개발자들이 활용하는 공개된 데이터[1]를 찾아서 활용하도록 하였다.

데이터 준비

데이터를 준비하는 중에, 유사한 주제로 발표된 논문[2]을 발견하였고, 해당 논문의 저자가 정제한 데이터셋[3]이 있음을 알게 되어 이번 실험에 활용하기로 하였다. 이 데이터셋은 실험에 활용하기에 적합하도록 모든 ECG 데이터를 beat 별로 잘라내고 zero-padding 과정을 수행하여 모든 beat 의 길이를 동일하게 맞춰놓았다.

스크린샷 2019-04-27 16.53.13

표 1.  ECG 데이터의 클래스 구분 (from [2])

ECG 데이터는 5개의 클래스 – 정상(N) 클래스와 4 종류의 부정맥 클래스 (S, V, F, Q) – 로 구분되는데, 각 클래스에 대한 설명은 표 1에 나타나 있다.

스크린샷 2019-04-28 13.43.07

그림 1. 각 클래스에 해당하는 ECG 패턴 그래프 및 전체 클래스의 통합 그래프

ECG 데이터의 패턴은 각 클래스 별로 고유의 특징을 나타낸다. 그림 1은 각 클래스의 ECG 패턴을 보여준다.

스크린샷 2019-04-28 14.48.48

표 2. 클래스 별 ECG 데이터의 용량 (개수)

원래의 데이터에는 정상(N) 클래스에 해당하는 데이터의 용량이 압도적으로 많고 부정맥 클래스에 해당하는 데이터의 용량이 작다. 따라서, 이번 실험을 위해서는 전체 데이터에서 학습용 데이터를 각 클래스 별로 2000개씩, 테스트용 데이터를 각 클래스 별로 800개씩 랜덤으로 선택하여 활용하였다. 이번 실험에 활용한 데이터의 용량은 표 2에 나타나 있다.

참고로, 논문 [2]의 저자는 2개의 1-dimensional Convolutional layer 를 포함한 residual block이 5번 반복되도록 구성하고 fully-connected layer를 추가한 형태로 CNN을 구성하여 활용하였으며, 93.4%의 정확도를 보였다고 보고하였다.

학습 모델 (1) – LSTM(Long Short-Term Memory) 을 활용한 classification

스크린샷 2019-04-28 14.08.51.png

그림 2. 본 실험에서 활용한 LSTM 모델의 구조

ECG 데이터는 시간에 따른 변화를 특징으로 포함하는 시계열 데이터이다. 시계열 데이터를 분석하는 과정에서 가장 먼저 떠올려 볼 수 있는 모델은 Recurrent Neural Networks (RNN) 계열이므로, 본 실험에서도 LSTM을 활용해 보았다. 하나의 ECG 데이터 – 187 time steps 로 구성 – 가 입력되면 3개의 LSTM layer를 거쳐 feature를 추출한 후에 Fully Connected Layer에 입력시키는 구조이다. (그림 2 참조)

lstm_result(3layer) (1).png

그림 3. LSTM 모델의 테스트 결과

그림 3은 LSTM 기반 모델을 200 epoch 만큼 학습시킨 뒤에 테스트 데이터를 통해 정확도를 측정한 결과를 보여준다.

LSTM 기반 모델의 정확도는 94.6% 를 나타내었는데, 기본적인 모델을 활용한 초기 실험의 결과 치고는 나쁘지 않아 보인다. 다만, 이 정도의 정확도를 가진 모델을 실제로 활용할 수 있을 지의 여부는 아직 알 수 없다.

학습 모델 (2) – 1-Dimensional CNN(Convolutional Neural Network) 을 활용한 classification

스크린샷 2019-04-28 14.20.42.png

그림 4. 본 실험에서 활용한 1-Dimensional CNN 모델의 구조

시계열 데이터의 특성을 분석하기 위해서는 1-Dimensional CNN도 활용할 수 있다. 본 실험에서 활용한 모델은 하나의 ECG 데이터 – 187 time steps 로 구성 – 가 입력되면 3개의 1-Dimensional Convolution layer들을 거쳐 feature를 추출한 후에 Fully Connected Layer에 입력시키는 구조이다. (그림 4 참조)

스크린샷 2019-04-27 17.22.02.png

그림 5. 참고 논문[2]의 실험 결과

참고 논문[2]에서도 1-Dimensional Layer 로 구성된 CNN 모델을 사용하여 93.4%의 정확도를 나타냈다고 보고하고 있다. (그림 5) 다만, 기본적인 구조의 CNN 모델을 채택한 본 실험과는 달리, 해당 논문에서는 residual 모델을 활용하였다. 따라서 이번 실험에서는 참고 논문[2]의 결과와 직접적으로 비교해 보기 위해 LSTM 모델을 활용할 때와는 다르게 전체 데이터를 학습에 활용하였다. (표 2의 전체 데이터를 학습에 활용)

conv1d_result (1).png

그림 6. 1-Dimensional CNN 모델의 테스트 결과

그림 6은 1-Dimensional CNN 모델을 100 epoch 만큼 학습시킨 뒤에 테스트 데이터를 통해 정확도를 측정한 결과를 보여준다. 1-Dimensional CNN 모델의 정확도는 94.4%를 나타내었는데, 직전 실험에서 확인한 LSTM 기반 모델의 정확도(94.6%)와 비슷하며, 참고 논문 [2]에서 활용한 Residual CNN의 정확도(93.4%)와도 크게 다르지 않다. 이 역시 초기 실험 결과 치고는 나쁘지 않아 보인다.

잠정적인 결론

지금까지, ECG 데이터들을 자동적으로 분류하는 모듈을 LSTM 및 1-Dimensional CNN을 기반으로 구성한 모델을 활용하여 구현하고 테스트해 보았다. 비교적 간단한 구조의 모델들을 적용했음에도 불구하고, 테스트 결과는 추가적으로 진행할 연구 결과에 대해 희망을 품게 하였다.

References

[1] https://www.physionet.org/physiobank/database/mitdb/

[2] Mohammad Kachuee, Shayan Fazeli, Majid Sarrafzadeh, “ECG Heartbeat Classification: A Deep Transferable Representation“, 2018, https://arxiv.org/abs/1805.00794

[3] https://www.kaggle.com/shayanfazeli/heartbeat