프로젝트 요약

  • 개요: 난임 환자 시술 데이터를 기반으로 임신 성공 확률을 예측하는 의료 도메인 머신러닝 프로젝트
  • 기간: 2025.04-2025.07
  • 데이터: 난임 환자 시술 이력, 환자 특성, 시술 관련 변수, 임신 성공 여부
  • 기술 스택: Python, pandas, scikit-learn, CatBoost, LightGBM, feature engineering, class weight, cross-validation
  • 성과(성능): 전국 7위, CatBoost 예측 후 LightGBM residual learning을 결합한 확률 예측 파이프라인 구성

문제 정의

난임 치료는 환자 상태, 시술 방식, 과거 시술 이력, 배아 및 난자 관련 정보 등 다양한 요인이 함께 작용하는 문제입니다. 단순히 하나의 변수로 임신 성공 여부를 설명하기 어렵고, 의료진은 여러 정보를 종합해 시술 전략을 판단해야 합니다.

이 프로젝트는 난임 환자 시술 데이터를 기반으로 임신 성공 확률을 예측해 의료진의 의사결정을 보조하는 것을 목표로 했습니다. 모델의 역할은 환자를 기계적으로 분류하는 것이 아니라, 복잡한 시술 데이터 속에서 성공 가능성과 관련된 패턴을 찾아내고 이를 확률 형태로 제공하는 것입니다.

온라인 해커톤은 난임 환자 대상 임신 성공 “여부”를 예측하는 이진분류 태스크였고, 평가지표는 ROC-AUC였습니다. 반면 오프라인 단계는 임신 성공 “확률”을 예측하는 문제에 더 가까웠습니다. 평가지표도 weighted Brier score와 Binary F1 score의 1:1 가중합이었기 때문에, 단순히 양성과 음성을 잘 가르는 것만으로는 부족했습니다. 예측 확률 자체가 잘 보정되어야 했고, 동시에 실제 클래스 분류 성능도 유지해야 했습니다.

데이터와 EDA

난임 시술 데이터는 일반적인 tabular dataset처럼 보이지만, 실제로는 의료 도메인 특성상 결측, 범주형 변수, 시술 단계별 변수, 과거 이력 변수가 복잡하게 얽혀 있습니다. 또한 특정 변수는 값 자체보다 결측 여부가 의미를 가질 수 있어, 단순 결측 대체만으로 처리하기 어렵습니다.

EDA에서는 다음 질문을 중심으로 데이터를 확인했습니다.

  • 임신 성공 여부의 클래스 비율이 얼마나 불균형한가?
  • 환자 나이, 시술 유형, 과거 시술 횟수 등이 성공 확률과 어떤 관계를 갖는가?
  • 결측이 많은 변수는 제거할지, 별도 indicator로 사용할지 판단할 수 있는가?
  • 범주형 변수의 cardinality가 높아 모델에 노이즈를 주지는 않는가?
  • 평가 지표 관점에서 확률 calibration과 threshold 조정이 필요한가?

의료 데이터에서는 도메인적으로 말이 되지 않는 조합이나 누수 가능성이 있는 변수를 조심해야 합니다. 따라서 feature engineering을 할 때도 예측 시점에 실제로 알 수 있는 정보인지, 결과 이후에만 알 수 있는 정보가 섞이지 않았는지를 함께 확인했습니다.

도메인 기반 피처 엔지니어링은 이 프로젝트에서 가장 많은 시간을 쓴 부분이었습니다. 시술 이력, 시술 유형, 환자 특성, 반복 시술 관련 변수들을 단순히 원본 그대로 넣기보다, 의료적으로 의미가 있을 만한 조합과 비율, 누적 이력, 결측 indicator를 다양하게 만들고 검증했습니다. 특히 난임 데이터는 클래스 불균형이 심했기 때문에, 양성 클래스를 모델이 쉽게 무시하지 않도록 class weight를 적극적으로 적용했습니다.

접근 방법

모델링은 데이터 정리 → feature engineering → 검증 설계 → 모델 학습 → 확률 후처리 순서로 진행했습니다.

  1. 결측값, 이상값, 범주형 변수를 정리해 모델 입력 테이블을 구성했습니다.
  2. 환자 특성, 시술 이력, 시술 유형, 반복 시술 관련 변수를 중심으로 파생 변수를 만들었습니다.
  3. 평가 지표에 맞춰 cross-validation을 구성하고, 단일 hold-out 결과에 과하게 맞추지 않도록 검증했습니다.
  4. gradient boosting 계열 모델을 중심으로 tabular data에 강한 모델을 비교했습니다.
  5. 최종 예측 확률은 metric에 맞게 calibration과 threshold 관점에서 점검했습니다.

초기에는 오프라인 문제가 확률 예측에 가까웠기 때문에 Boosting 계열 Regressor를 직접 사용하는 접근도 실험했습니다. 하지만 실제 검증에서는 Regressor가 출력하는 연속값보다 Classifier의 predict_proba에서 나오는 예측 확률을 사용하는 쪽이 더 안정적이고 정량적으로도 좋았습니다. weighted Brier score 관점에서는 확률값의 보정이 중요했지만, Binary F1 score까지 함께 고려하면 분류 모델이 학습한 decision boundary를 버리기 어려웠습니다.

최종 구조는 CatBoost로 1차 예측을 수행하고, CatBoost가 설명하지 못한 잔차를 LightGBM으로 다시 학습하는 residual learning 형태로 설계했습니다. CatBoost는 범주형 변수가 많은 tabular medical data에서 안정적인 1차 예측기로 사용했고, LightGBM은 남은 오차 패턴을 보완하는 역할로 두었습니다. 여기에 class weight와 도메인 피처를 결합해 불균형 데이터에서도 양성 클래스를 놓치지 않도록 조정했습니다.

이 프로젝트에서 중요한 부분은 모델 하나를 고르는 것보다, 의료 데이터의 해석 가능성과 대회 metric을 동시에 고려하는 것이었습니다. 높은 점수만 노리면 특정 fold나 특정 threshold에 과적합될 수 있기 때문에, 검증 구조와 후처리까지 하나의 파이프라인으로 관리하는 것이 필요했습니다.

성과(성능)

  • 최종 전국 7위를 달성했습니다.
  • 난임 시술 데이터의 결측/범주형 변수 처리 흐름 구성
  • 의료 도메인 변수의 누수 가능성 점검
  • class weight를 활용해 극심한 클래스 불균형에 대응
  • Classifier 기반 predict_proba가 Regressor 출력보다 평가 지표에 더 적합하다는 점을 실험적으로 확인
  • CatBoost 1차 예측과 LightGBM residual learning을 결합한 임신 성공 확률 예측 파이프라인 구축
  • weighted Brier score와 Binary F1 score를 함께 고려한 검증 및 후처리 전략 설계
  • 의료진 의사결정 보조라는 활용 목적에 맞춰 확률 예측 형태로 결과 정리

느낀점

이 프로젝트를 하면서 가장 크게 느낀 점은, 의료 데이터에서는 모델 성능만큼이나 이 변수를 예측 시점에 실제로 사용할 수 있는가를 따지는 과정이 중요하다는 점이었습니다. 겉으로는 성능을 올려주는 변수처럼 보여도, 시술 결과 이후에 알 수 있는 정보가 섞이면 실제 적용에서는 사용할 수 없습니다.

또한 난임 치료 데이터는 환자와 시술 과정이 모두 포함되어 있어 변수 간 관계가 단순하지 않았습니다. 같은 나이대라도 시술 이력이나 시술 방식에 따라 의미가 달라질 수 있고, 결측 자체가 하나의 신호처럼 작동하는 경우도 있었습니다. 이 경험을 통해 tabular data에서 feature engineering과 검증 설계가 모델 선택만큼 중요하다는 점을 다시 느꼈습니다.

개인적으로 흥미로웠던 부분은 “확률 예측이면 Regressor가 더 맞지 않을까”라는 직관이 실제 평가에서는 그대로 통하지 않았다는 점입니다. 오히려 이진분류 모델의 predict_proba가 확률 보정과 클래스 구분을 함께 가져가기에 더 적합했고, 이 차이를 실험으로 확인하면서 metric을 정확히 읽고 모델링 방향을 잡는 과정의 중요성을 체감했습니다.

마지막으로 의료 AI는 예측값을 어떻게 해석하고 전달할 것인지까지 고민해야 한다고 느꼈습니다. 임신 성공 확률은 단순한 점수가 아니라 의사결정의 참고 정보이기 때문에, 모델이 어떤 근거로 높은 확률을 냈는지와 어떤 상황에서 불확실한지를 함께 살펴보는 방향이 필요하다고 생각했습니다.

업데이트: