클립보드에 복사되었습니다
Post

한국어 학습자를 위한 노래 추천 시스템

한국어 학습자를 위한 노래 추천 시스템

Chagas Disease Detection from 12-Lead ECG

한 줄 설명

PhysioNet/CinC Challenge 2025에서, 12-lead ECG 기반 Chagas disease 이진 분류를 위해 임상 기반 handcrafted feature와 deep sequence representation을 결합한 hybrid model을 설계했다. 모델 설계에만 그치지 않고, 전처리, 학습, 추론, 제출까지 이어지는 전체 파이프라인을 함께 다룬 프로젝트였다.


Problem

문제는 12-lead ECG로 Chagas disease를 자동 탐지하는 binary classification task였다. 실제로 어려웠던 지점은 크게 세 가지였다.

1. 데이터 소스가 이질적이었다

학습에는 성격이 다른 세 데이터셋이 함께 들어갔다.

  • SaMi-Trop: 혈청학적으로 확인된 positive cohort
  • PTB-XL: 비풍토 지역 기반 negative source
  • CODE-15%: 자가 보고 진단 기반 weak label source

핵심은 단순히 데이터 수를 늘리는 문제가 아니라는 점이었다. 레이블 신뢰도와 데이터 분포가 서로 달랐고, 특히 CODE-15%의 비중이 큰 만큼 weak label이 전체 학습을 지배할 가능성이 있었다. 그대로 합쳐 학습하면 noisy label이 전체 훈련을 흔들 수 있었다.

2. domain shift가 존재했다

추론은 학습 분포와 다른 비공개 데이터셋에서 이뤄졌다. 또한 제공된 데이터만으로 validation 및 test 환경을 별도로 구성해야 했기 때문에, 단순히 train 성능을 맞추는 것으로는 부족했다. 내부 평가 환경을 직접 설계하면서도, hidden test distribution을 어느 정도 버틸 수 있는 구성이 필요했다.

3. 시간과 자원이 제한되어 있었다

제출은 제한된 GPU 자원과 72시간 wall-time 안에서 끝나야 했다. 실제로 일부 loss variant는 학습 시간이 길어서 충분한 epoch를 주기 어려웠다. 이 프로젝트에서는 성능만이 아니라 학습 비용과 제출 가능성도 같이 봐야 했다.


Data / Setting

데이터 구성

  • SaMi-Trop 브라질 코호트. 혈청학적으로 확인된 positive label. positive source로서 신뢰도가 높았다.

  • PTB-XL 유럽 비풍토 지역 데이터. negative label 신뢰도가 높았다. negative source로 활용하기 적절했다.

  • CODE-15% 브라질 CODE repository 서브셋. 자가 보고 진단 기반. 규모는 크지만 weak label이라는 점을 함께 고려해야 했다.

입력 및 전처리

  • 입력: 12-lead ECG
  • sampling rate: 500 Hz로 통일
  • baseline wander 제거: OC/CO morphological filter 적용

평가 설정

  • 내부 평가: SaMi-Trop + PTB-XL 기준으로 구성 positive ratio는 약 2.5% 수준으로 조정
  • 외부 평가: PhysioNet 공식 hidden test set

Approach

1. Handcrafted feature 설계

이 프로젝트에서는 model architecture를 크게 바꾸는 것보다, ECG 도메인 지식을 반영한 handcrafted feature를 직접 설계하는 것이 더 중요하다고 판단했다. 실제로 ECG 관련 문헌을 보면, 잘 설계된 feature가 모델 성능에 직접적으로 기여하는 경우가 적지 않았다.

Chagas cardiomyopathy의 대표적인 ECG 소견 중에서는 RBBBLAFB 같은 conduction abnormality가 중요하다고 봤다. 이를 바탕으로, Lead II R-peak 기반 QRS delineation을 이용해 다음 4개 feature를 설계했다.

  • Median QRS duration (ms)
  • Mean QRS electrical axis lead I, aVF 적분값을 이용해 arctan2 계산
  • RSR’ ratio in V1 QRS 내 양성 피크가 2개 이상 나타나는 비율. RBBB 관련 지표
  • Wide-S ratio in I or V6 진폭 ≤ -0.10 mV, 폭 ≥ 40 ms인 S wave 비율

각 feature에는 hardcoded z-score normalization을 적용했다. 구현에서는 neurokit2.ecg_peaks와 직접 작성한 fast_qrs_delineate를 조합해 속도를 맞췄다.

발표 자료 단계에서는 VCG(Vectorcardiogram) 기반 5차원 feature도 탐색했지만, 최종 모델에서는 RBBB/LAFB 중심의 4개 feature를 채택했다.


2. Backbone 선택

모델 backbone은 1D ResNet + BiGRU 조합으로 구성했다.

  • 1D ResNet 4 residual stages: 64 → 128 → 256 → 512
  • BiGRU hidden size 128, bidirectional

선택 이유는 비교적 명확했다.

  • 1D ResNet은 QRS 같은 국소 형태 특징을 추출하는 데 안정적이었다.
  • BiGRU는 심장 리듬처럼 시간축 의존성이 있는 시계열을 다루기에 적절했다.
  • 반면 Transformer 계열은 당시 데이터 규모와 GPU 제약을 고려했을 때 학습 안정성 면에서 부담이 있다고 판단했다.

즉, 이 프로젝트에서는 “더 큰 모델”보다 “현재 데이터 규모와 자원 제약에 맞는 구조”가 더 중요했다.


3. Auxiliary-Conditioned Cross-Attention

handcrafted feature와 demographic feature(age, sex)를 단순 concatenation으로 붙이는 대신, single-query cross-attention 형태로 결합했다.

구성은 다음과 같았다.

  • handcrafted feature + demographic → linear projection → 256-dim single token 생성
  • 이 token을 Q
  • BiGRU output을 K/V

이 구조의 목적은 임상적 단서가 sequence embedding 전체를 한꺼번에 덮는 것이 아니라, 필요한 시점을 선택적으로 참조하도록 만드는 데 있었다.

실제로 단순 concatenation보다 validation 기준 성능이 더 좋았다.

  • concatenation: 0.305
  • cross-attention: 0.317

4. Source-Aware Weighted Loss

표준 BCE는 소스별 label reliability 차이를 반영하지 못한다. 여기서는 이 문제를 줄이기 위해, 두 개의 BCE term을 convex combination으로 섞는 형태의 loss를 구성했다.

구성

  • global term pos_weight = 5.0 전체 class imbalance 보정

  • source-aware term source별 sample weight 적용

    • SaMi-Trop × 2.5
    • PTB-XL × 7.5
    • CODE-15% × 0.8
  • blending coefficient: λ = 0.6

핵심은 weak label source인 CODE-15%를 버리지 않으면서도, 그 영향력을 조절하는 것이었다. 이 설정에서 best challenge score는 0.347이었다.


5. 전처리 파이프라인 속도 개선

전처리 쪽도 직접 많이 손봤다. 기존 데이터 파이프라인의 병목을 확인해보니, 원래 구조는 전처리를 거의 끝낸 뒤에야 discard 여부를 판단하고 있었다.

하지만 실제로는 일부 신호는 훨씬 앞 단계에서 이미 버릴 수 있었다. 그래서 판단 위치를 앞당기고, 일부 연산에는 hardcoding과 approximation을 적용했다. 그 결과 전처리 속도를 크게 줄일 수 있었다.

이 부분은 모델링 자체보다도, 실제 연구 파이프라인을 끝까지 돌아가게 만드는 데 더 직접적인 기여였다.


탐색했지만 최종 채택하지 않은 실험

1. RAG 기반 signal retrieval

ESI(ECG Semantic Integrator) 쪽 아이디어를 보고, 추론 시 FAISS 기반 top-k retrieval을 붙여 보조 정보를 주는 방식을 시도했다. 하지만 이 실험에서는 성능이 오히려 하락했다.

직접 해보면서 느낀 점은 비교적 분명했다.

  • retrieval 품질이 충분히 좋지 않으면
  • retrieval 정보는 도움보다 noise로 들어올 가능성이 크다

즉, RAG를 붙인다고 항상 이득이 생기는 구조는 아니었다.


2. Graph model

12-lead 간 공간 관계를 더 직접적으로 반영해보려고, 일부 실험에서는 ResNet1D를 graph + 1D CNN, 혹은 ST-transformer 계열 구조로 바꿔봤다.

문제는 과적합이었다. 적은 학습 회수에서도 validation score가 비정상적으로 높게 올라가며 일반화가 잘 되지 않는 양상이 있었고, 제출까지 남은 시간이 많지 않아 끝까지 충분히 파고들지는 못했다.

다만 이 실험은 이후 EEG 연구를 진행하면서 다시 생각하게 됐다. 관련 연구들을 더 확인하면서, 데이터 채널 간 covariance나 위상 정보를 유지하거나 활용하는 방식이 성능 향상에 크게 기여할 수 있다는 점을 더 분명히 보게 됐다. 채널 간 관계를 더 잘 보존하는 구조는 biosignal 전반에서 계속 중요한 문제라고 생각한다.

회고적으로 보면, 비슷한 문제를 다시 다루게 된다면 graph 구조를 다시 활용하되, 짧은 epoch만 주고 빠르게 학습시키는 방향도 같이 검토할 것 같다. 이전 경험상 일부 setting에서는 긴 학습보다 짧은 학습이 더 안정적으로 작동한 경우가 있었다.


3. TTA / adaptation 계열

domain shift 대응을 위해 다음도 시도했다.

  • normalization 기반 TTA
  • dynamic adapter
  • LoRA 기반 PEFT

하지만 이 프로젝트에서는 유의미한 성능 향상으로 이어지지 않았다.


4. Adaptive pooling

domain shift 대응 관점에서 AdaptiveAvgPool도 일부 실험했다.


My Role

이 프로젝트에서 맡은 역할은 아래와 같다.

모델링

  • 임상 문헌을 바탕으로 RBBB/LAFB 관련 handcrafted feature 설계
  • 교수님과 함께 해당 feature를 직접 구현
  • 구현 과정에서 시간 절약을 위한 일부 hardcoding 적용

데이터 및 전처리

  • 데이터 처리
  • 전처리 파이프라인 병목 분석
  • discard 판단 시점 재배치
  • hardcoding / approximation 적용을 통한 속도 개선

추가 실험

  • RAG 기반 retrieval
  • graph model
  • TTA
  • LoRA 등 여러 방향을 직접 탐색

연구 산출

  • 논문 작성 Computing in Cardiology 2025 제출 Extended paper는 CinC 2025 기준 리뷰 진행
  • 학회 발표 자료분석학회, 2025.11.11

Result / Takeaway

주요 결과

  • Training: 0.512
  • Validation (hidden): 0.347
  • Test (hidden): 0.218
  • Ranking: 17th / 41 eligible teams

Ablation

  • ResNet-BiGRU baseline: 0.305
  • handcrafted feature + cross-attention: 0.317
  • source-aware wBCE (best): 0.347

내부 평가에서는 CODE-15%를 제외한 기준에서 best variant가 0.88 수준이었다.

정리

이 프로젝트를 통해 확인한 점은, 더 큰 모델이나 더 최신의 모델이 항상 문제의 해답은 아니라는 것이었다. 오히려 중요했던 것은 다음에 가까웠다.

  1. feature 품질
  2. loss 설계
  3. 모델 구조 자체보다 세부 설계와 결합 방식
  4. 현재 setting에 직접 맞닿아 있는 문제 해결 예를 들면 weak label 처리, 계산 비용, 학습 시간 제약 같은 부분

source-aware loss를 사용하면서 weak label 데이터를 완전히 버리지 않고 활용할 수 있었고, handcrafted feature도 단순 concatenation보다 cross-attention으로 결합했을 때 더 잘 작동했다.

또 하나 분명했던 점은, wBCE variant가 성능은 좋았지만 학습 시간이 길어 epoch 수 제약을 받았다는 것이다. 이건 이 프로젝트에서 직접 겪은 cost-performance trade-off 사례였다.


반성할 점

이 프로젝트를 돌아보면, 모델링 자체뿐 아니라 실험을 어떻게 기록하고 비교할 것인가에 대한 아쉬움도 분명히 남았다.

첫째, 일부 실험은 성능이 좋지 않다는 이유로 정량 결과를 충분히 남기지 않았다. 당시에는 제출 가능한 성능을 빠르게 확보하는 데 집중했지만, 지금 보면 이건 좋지 않은 습관이었다고 생각한다. 성능이 낮은 실험도 이후 방향을 정리하거나 실패 원인을 해석하는 데 중요한 근거가 되기 때문이다.

둘째, 실험 간 비교 조건을 초반부터 더 엄격하게 맞췄어야 했다. 특히 RAG, graph model, TTA 같은 추가 실험들은 아이디어 자체는 의미가 있었지만, 동일한 환경에서 비교 가능한 형태로 기록을 남겼다면 어떤 선택이 실제로 유효했고 어떤 선택이 그렇지 않았는지를 더 명확하게 판단할 수 있었을 것이다.

셋째, 파이프라인 최적화에서도 개선 폭을 더 정량적으로 남겼어야 했다. 실제로 속도 향상은 분명히 있었지만, 당시에는 제출과 구현을 우선하면서 benchmark 수치를 체계적으로 정리하지 못했다. 지금 다시 정리한다면 전처리 시간, 학습 시간, epoch당 소요 시간처럼 재현 가능한 기준으로 남기는 것이 맞다고 본다.

이 경험 이후에는, 실험 초기 설계 단계부터 다음을 같이 두는 쪽으로 작업 방식을 바꿨다.

모든 실험의 실행 조건 통일 성능이 낮은 실험도 포함한 기록 유지 전처리/학습/추론 시간의 정량 기록 이후 비교와 재현이 가능한 형태의 로그 관리

즉, 이 프로젝트는 단순히 ECG classification 문제를 푼 경험이 아니라, 좋은 아이디어나 모델만으로는 충분하지 않고, 실험 기록과 비교 체계 자체도 연구의 일부라는 점을 분명히 배우게 된 사례였다.

This post is licensed under CC BY 4.0 by the author.