상세 컨텐츠

본문 제목

[캐글 필사] ICR - Identifying Age-Related Conditions

캐글 필사

by pjhhs-data 2025. 9. 14. 20:26

본문

1. 문제 & Metric 파악

1) 대회 배경, 설명에 대한 이해

특정 개인이 세 가지 의학적 질환 중 하나 이상을 가지고 있는지(Class 1), 아니면 전혀 가지고 있지 않은지(Class 0) 를 예측하는 것이다(이진 분류). 참가자들은 건강 특성(health characteristics) 측정값을 바탕으로 모델을 만들어야 한다.

해당 질환을 진단하기 위해서는 길고 복잡한 과정이 필요하지만, 예측 모델을 통해 최소한의 정보만 수집해 빠르고 안전하게 판별할 수 있다.

  • 노화와 질병: 나이가 들수록 심장 질환, 치매, 관절염 등 다양한 건강 문제가 증가.
  • 바이오인포매틱스의 역할: 바이오인포매틱스는 노화 지연 및 역전, 나아가 질병 예방 연구에 큰 기여를 하고 있으며, 데이터 과학은 이러한 연구에서 핵심적인 역할을 한다.
  • 기존 한계: 현재는 XGBoost, Random Forest 같은 모델을 활용하지만 성능이 충분하지 않음. 실제 환자 생명을 다루는 문제이므로, 더 신뢰할 수 있는 예측이 필요하다.
  • 대회 주최사 (ICR):
    • InVitro Cell Research, LLC (2015년 설립)
    • 뉴욕 인근에 연구소와 사무실을 두고 있으며, 재생의학과 예방의학에 집중
    • 목표: 빠르게 노화를 극복할 수 있는 맞춤형 의료 연구

 

2) 데이터에 대한 기본적인 이해

  • train.csv
    • Id : 각 환자의 고유 식별자
    • AB - GL : 56개의 익명화된 건강 특성, EJ는 범주형('A', 'B')으로 구성
    • Class : 세 가지 의학적 상태 중 1개 이상이 포함된 경우(클래스 1), 그렇지 않다면(클래스 0)
  •  test.csv
    • Id : 각 환자의 고유 식별자
    • AB - GL : 56개의 익명화된 건강 특성, EJ는 범주형('A', 'B')으로 구성
    • test는 추론(모델 분석 결과)을 위한 데이터이기 때문에 Class가 존재하지 않음
  •  greeks.csv
    • train.csv에 추가하여 사용할 수 있는 메타데이터
  •  Alpha
    • A : 연령 관련 조건이 존재하지 않음을 뜻함, train.csv에서 해당 식별자의 클래스는 0
    • B, D, G : 세 가지 연령 관련 조건이 존재한다는 뜻, train.csv에서 해당 식별자의 클래스는 1
  • Beta, Gamma, Delta 세 가지 실험 특성
  • Epsilon은 데이터의 수집된 날짜

 

3) 평가 Metric에 대한 이해

📘 Balanced Log Loss란?

Log Loss(로그 손실, 또는 Cross Entropy Loss) 는 분류 문제에서 예측한 확률과 실제 정답 간의 차이를 측정하는 지표.

  • 확률을 정확하게 예측할수록 값이 작아지고,
  • 확률이 정답과 멀수록 값이 커진다.

하지만 클래스 불균형(class imbalance) 이 심할 경우, 일반 Log Loss는 데이터가 많은 클래스(예: 클래스 0)에 치우쳐 계산돼서 소수 클래스(예: 클래스 1)의 성능이 과소평가되는 문제가 있다.

이를 보완한 것이 Balanced Log Loss 이다.


⚖️ Balanced Log Loss의 핵심 아이디어

  • 각 클래스의 샘플 수를 보정해서 모든 클래스가 동일한 중요도(가중치) 를 갖도록 설계된 Log Loss.
  • 클래스가 불균형하더라도 소수 클래스의 성능을 무시하지 않고 균형 있게 평가.

📐 수식

Balanced Log Loss는 보통 이렇게 정의된다:

여기서,

  • CC: 클래스 개수 (예: 2 → {0,1})
  • NcN_c: 클래스 cc에 속한 샘플 수
  • yciy_{ci}: 샘플 ii가 클래스 cc라면 1, 아니면 0
  • pcip_{ci}: 샘플 ii가 클래스 cc일 확률 (모델이 예측한 값)

즉, 각 클래스별로 Log Loss를 구한 후, 클래스별 샘플 수를 보정하고, 최종적으로 클래스별 손실 평균을 내는 방식이다.


📊 예시로 이해하기

  • 데이터 분포
    • 클래스 0: 900개
    • 클래스 1: 100개
  • 일반 Log Loss
    • 클래스 0 예측 성능이 좋아서 손실이 작다면, 전체 점수도 거의 "클래스 0 위주"로 계산됨 → 클래스 1 성능이 안 좋아도 잘 드러나지 않음.
  • Balanced Log Loss
    • 클래스 0 (900개)와 클래스 1 (100개)이 동등하게 50:50 반영됨
    • 따라서 클래스 1에서 예측이 나쁘면 전체 점수도 크게 나빠짐.

✅ 장점

  • 클래스 불균형 데이터에서도 공정한 성능 평가 가능
  • 모델이 소수 클래스까지 잘 예측해야 높은 점수를 얻음
  • 의료/바이오, 금융 사기 탐지 등 클래스 불균형이 치명적인 분야에서 자주 사용

📌 정리

  • Balanced Log Loss = Log Loss + 클래스별 균형 가중치
  • 클래스 개수가 불균형해도 모든 클래스가 동일한 중요도를 가짐
  • 의료 데이터처럼 소수 클래스가 중요한 문제에서 특히 유용

 

2. EDA

 

dataset의 파이차트

 

데이터 셋의 파이차트를 보면 양성(1)의 샘플 비율이 (0)의 샘플에 비해 매우 작기 때문에 데이터셋의 불균형이 심하다는 것을 알 수 있다.

 

수치형 변수의 바 차트

 

데이터 전처리를 위해 모델 입력 변수만 따로 리스트로 정의 하고 단순 식별자 역할인 ID컬럼은 제거 하였다.

 

✅ 요약

  • 데이터 불균형 문제 확인
  • 모델 학습에 활용할 수치형 변수 파악
  • 기본 시각화로 변수 값 탐색
  • 불필요한 열(Id) 제거 후 Feature set 정리

 

3. Notebook 필사

 

이번에도 가장 많은 수의 vote를 받은 Notebook을 선정했다

 

선정한 Notebook의 링크

https://www.kaggle.com/code/gusthema/identifying-age-related-conditions-w-tfdf

 

Identifying Age-Related Conditions w/ TFDF

Explore and run machine learning code with Kaggle Notebooks | Using data from ICR - Identifying Age-Related Conditions

www.kaggle.com

 

원작자 해석 예측

 

📊 K-Fold 교차 검증부터의 전체 과정 요약

1️⃣ K-Fold 교차 검증 (KFold Cross Validation)

  • 일반적인 Train/Test Split만으로는 데이터가 부족하고 불안정 → 5-Fold 교차검증 사용.
  • 데이터셋을 5개로 나누어,
    • 매번 4개는 학습, 1개는 검증에 사용.
    • 총 5회 반복하여 모든 데이터가 검증 세트로 한 번씩 사용됨.
  • 이렇게 얻은 예측값을 Out-of-Fold(OOF) Predictions라고 함 → 모델 성능 추정에 활용.
  • 각 fold의 검증 예측값을 oof라는 pandas DataFrame에 저장.

2️⃣ 모델 선택 (Model Selection)

  • 트리 기반 모델들 중에서 선택 가능:
    • RandomForestModel
    • GradientBoostedTreesModel
    • CART
    • Distributed GBT
  • 첫 단계에서는 Random Forest 사용.
    • 여러 개의 의사결정 나무(Decision Tree)를 배깅(Bagging, 복원추출) 방식으로 학습.
    • 과적합에 강하고 사용이 간단함.

3️⃣ 하이퍼파라미터 설정 (Hyperparameter Tuning)

  • 데이터셋 크기가 작아 → 과적합 위험 ↑
  • 주요 파라미터:
    • max_depth (트리 최대 깊이): 기본 16 → 줄이면 과적합 방지.
    • num_trees (트리 개수): 기본 300 → 늘리면 안정성 ↑.
  • TensorFlow Decision Forests에서 템플릿/직접 파라미터 지정으로 조정 가능.

4️⃣ 데이터 불균형 처리 (Handling Class Imbalance)

  • Class 1(양성, 질환 있음) = 전체의 17.5% → 심각한 불균형.
  • 불균형 데이터 문제:
    • 모델이 대다수 클래스(Class 0) 에 치우쳐 학습 → 소수 클래스(Class 1) 예측 성능 저하.
  • 해결 방법:
    1. Undersampling: 다수 클래스 샘플을 일부만 선택해 학습. (랜덤 부분집합 여러 번 시도)
    2. Class Weighting (클래스 가중치): 소수 클래스에 더 큰 가중치 부여 → 모델이 더 주목하도록 만듦.
  • 이 노트북에서는 Class Weighting 적용.
    • Keras의 model.fit(..., class_weight={0:1, 1:5}) 형태로 전달.

5️⃣ 모델 학습 (Train Random Forest)

  • 각 Fold마다 모델 학습 + 성능 기록.
  • 성능 지표(Metrics):
    • Accuracy (정확도)
    • Binary Crossentropy (이진 교차 엔트로피, 확률 기반 평가)
  • 학습된 모델과 메트릭스를 저장.

6️⃣ 모델 시각화 (Model Visualization)

  • 트리 기반 모델의 장점 → 시각화 가능.
  • 랜덤포레스트 = 기본 300개의 트리 → 그중 임의의 트리 선택 가능.
  • models 딕셔너리에서 특정 모델을 고르고, 하나의 트리를 선택해 구조를 시각화.

✅ 전체 흐름 요약

  1. K-Fold 교차검증 → 성능 안정적 추정 (OOF Predictions)
  2. Random Forest 모델 선택 → 기본 분류 작업
  3. 하이퍼파라미터 튜닝 → max_depth 줄이고, num_trees 늘려 과적합 방지
  4. 데이터 불균형 처리 → Class Weighting 사용 (언더샘플링 보조)
  5. 모델 학습 및 평가 → Accuracy, Binary Crossentropy
  6. 모델 시각화 → 트리 구조 확인 가능

 

시각화한 트리 구조 모습

 

4. Lesson Learned

이번 프로젝트에서는 의료 데이터셋을 활용해 세 가지 질환 중 하나 이상이 있는지(Class 1) vs 질환 없음(Class 0) 을 예측하는 분류 모델을 만들었다. 데이터셋의 크기가 크지 않고, 클래스 불균형이 심하다는 점이 큰 도전 과제였다. 이 과정을 통해 배운 점들을 정리해본다.

 

✅ 최종 배운 점 (Lesson Learned)

  1. 작은 데이터셋 → K-Fold 교차 검증은 필수
  2. Baseline 모델은 Random Forest로 시작하는 것이 안정적
  3. 과적합 방지 → max_depth, num_trees 같은 핵심 파라미터 튜닝 중요
  4. 불균형 데이터 처리 → Class Weighting이 효과적
  5. 평가 지표는 Accuracy 외에 Crossentropy, F1 등 다양하게 고려해야 함
  6. 모델 해석력이 중요한 분야에서는 트리 시각화가 큰 장점

관련글 더보기