Kaggle Competitions

Kyul Lee·2026년 2월 25일

포트폴리오

목록 보기
2/6

요즘 어떤 걸 공부할 지 매우 고민이다.

이전에는 의료 CV를 공부하면 되겠다는 길이 있었는데
지금은 의료 CV만 공부해서 내가 과연 취업을 할 수 있을까?
라는 의문점이 들었고 그에따라 어떤 기술 스택을 쌓아야 미래에 계속해서 이 AI라는 거대한 흐름에 휩쓸리지 않고 나만의 길을 걸을 수 있을지 말이다.

그래서 스터디원들과 생각해본 바 C++을 공부하면 지금보다 더 기업이나 회사에서 원하는 인재가 될 확률이 높다는 결론에 이르러 C++을 공부하기로 했다. 근데 나는 C++을 공부하는 게 내키지 않아서
혼자서 AI 재활 운동 코치라는 걸 혼자 만들려고 생각했다. 만들면서 여러 CV 모델링 프로그램도 다루고 모르는 거 깊이 파보기도 하려고 그다음에 C++로 다시 그 모델을 만들어보는 루트를 가려고 하다가 다시 스터디 사람들이랑 대화해보니 C++을 그렇게 깊이 공부하는 게 아니고 어느정도만 한다고 해서 C++을 공부하려고 유튜브 '판다코딩'님의 C++ 강의를 보던중 다른 CV 스터디원중에 Kaggle 대회에 나가는 사람들이 있다는 호기심 자극 얘기를 듣고 오늘부터 갑자기 Kaggle에서 하는 Heart Disease Predict 대회에 참가하게 되었다.

https://www.kaggle.com/competitions/playground-series-s6e2/overview

정말 의식의 흐름대로 사는구나 너..

내 기준 가장 질 좋은 코드를 써주는 클로드로 프로젝트 만들 예정!

train.csv가 30mb가 넘는 꽤 큰 파일이더라구요 데이터가 630000개? 클로드에 업로드가 안 되길래 줄여서 597171개로 수정해서 업로드 했다.

기본 프로젝트 폴더 구조는 이러하다.

CV_Risk_Score = (
Age 0.3 + # 나이 가중치
BP
0.2 + # 혈압
Cholesterol 0.2 + # 콜레스테롤
FBS_over_120
10 + # 당뇨
Exercise_angina 15 + # 협심증 (높은 위험!)
ST_depression
10 # 심근 허혈
)

2. 최첨단 앙상블 (Stacking)

XGBoost + LightGBM + CatBoost

Logistic Regression

Final Prediction

csv 형식이 잘 못 되어있어서 금방 수정하고 바로 제출해보았다.

결과는?

처음치고 0.88298? 나쁘지않군
2135등 Kyul Lee 0.88298 등수는 나쁜 거 같다. 총 참가자가 2383명정도니까 ㅎㅎ..

이번엔 클로드한테 1등은 0.95403이고 최고의 머신러닝 코드로 심장질환 특징을 고려해서 코드를 만들어 달라고 해보았다.

그러더니
✅ Framingham Risk Score (심혈관 위험 점수)
✅ ECG 이상 패턴 (ST depression, slope)
✅ 운동 능력 평가 (MaxHR ratio)
✅ 대사 증후군 지표
✅ 관상동맥 질환 위험도
✅ 고위험 조합 (Triple risk, Ischemic pattern)
✅ 생리학적 비율 (Rate-Pressure Product)
✅ 성별 특화 위험
✅ 비선형 변환 (log, sqrt, inverse)
✅ 통계적 특성 (z-score, percentile)
✅ 클러스터링 (risk clustering)
✅ Polynomial features (2차 상호작용)
✅ PCA features (차원 축소)


**물리치료사 임상 지식 100% 활용!**

### 2. 🤖 Ultra Ensemble (8개 모델)

Base Models (각각 10-Fold):
├─ XGBoost v1 (aggressive)
├─ XGBoost v2 (conservative)
├─ LightGBM v1 (aggressive)
├─ LightGBM v2 (conservative)
├─ CatBoost v1 (aggressive)
├─ CatBoost v2 (conservative)
├─ Random Forest
└─ Extra Trees
      ↓
Meta Learner:
└─ Logistic Regression
      ↓
 Final Prediction
 
  10-Fold CV Stacking

각 모델을 10번 학습 (총 80개 모델!)
Out-of-fold 예측으로 과적합 방지
안정적이고 일반화된 성능

이렇게 코드를 만들어줌

근데 애 ultra, ultimate 참 좋아하네 저번부터 ㅋㅋㅋ
코드 잘 짜주긴 하지만 종종 들여쓰기 오류나 import에서 이름 같은 오류가 있기도하고 verbose 오류도 나서 빠르게 수정 후 학습시켜보았다.

이번껀 꽤나 시간이 걸리네요 1시간은 걸리는듯?

기다리면서 벨로그 작성중..ㅎ
머신러닝에 대한 지식이 엄청나지 않아도 챗지피티나 클로드같은 AI가 있다면 난 이미 그 분야의 지식을 자세하게 알지 못해도 어느정도의 퍼포먼스는 나오는 거 같다. 물론 아는 만큼 보인다고, 더 깊이 아는 사람들의 프롬프트와 비교하면 아쉬운 점도 있겠지만 그럼에도 내 능력을 말도 안되게 높여주긴 한다.

다시 돌아와서 학습이 완료하고 예측한 csv를 제출해보았다.

생각보다 훨씬 점수가 많이 올라서 놀랐다. 역시 Optuna인건가? 파라미터를 자동으로 최적화 시킨 게 컷다고 본다.

이후에 Pseudo Labeling을 써봤는데 그건 오히려 역효과로 점수가 감소했고
다시 Oputana로 돌아와서 Optuna를 더 돌려보기로 했다. (30 → 50 trials)

학습을 꽤나 오래 시켰다 하룻밤정도 학습 시켰고 아침에 보니까 학습이 다 되어있었다.
맥북아 고생이 많구나..
결과는 ?

0.00007이 올랐네?
나쁘지 않다. 어쨋든 오르고 있다는 게 중요한 거니까 조금씩만이라도 오른다면 의미있는 거지

그이후에 챗지피티한테 기존의 클로드 코드를 피드백 받아서 다시 코드를 제출했는데도 쉽게 올라가지 않았다. 뭔가 문제가 있어보인다.

  1. Metric 불일치 의심 ⚠️⚠️⚠️
    python우리 코드:
  • accuracy_score(y, pred) # Accuracy
  • cv=RepeatedStratifiedKFold, scoring='accuracy'

Kaggle 대회:

  • Binary Cross Entropy (LogLoss)

→ 완전히 다른 지표!
이게 OOF와 LB 차이의 원인일 가능성 90%!

  1. Stacking vs Blending
    python현재: Stacking (LogisticRegression/LightGBM meta)
    문제: Base 모델들이 너무 비슷하면 효과 없음

상관계수 확인 필요!
→ 0.98+ 이면 단순 평균이 더 나을 수도


#### 3. **Variance Reduction**

95.36% 구간에서는:

  • 새로운 방법 ❌
  • 안정성 확보 ✅

→ Seed ensemble
→ Weight blending

위의 문제점을 지적하였고 실제로 그런지 확인하기 위한 코드를 만들어 확인해보았다.

=================================================================
🎯 DIAGNOSIS SUMMARY


1. OOF-LB Gap Analysis:
   OOF Accuracy: 0.8905
   OOF LogLoss:  0.263510
   LB Score:     0.95363
   ⚠️ OOF LogLoss is high (> 0.15)

2. Model Diversity:
   ⚠️ Low diversity (corr=0.9993)
   → Recommendation: Try weighted average

3. Next Steps:
   • Phase B: Weight Blending
   • Try: 0.4*XGB + 0.4*LGB + 0.2*CAT
   • Optimize for LogLoss directly
   • Set eval_metric='logloss' in all models
   • Phase C: Seed Ensemble (always beneficial)

확인 결과

  1. 모델 다양성 거의 없음! ⚠️⚠️⚠️
    평균 상관계수: 0.9993 (99.93%!)

XGBoost, LightGBM, CatBoost가
거의 똑같은 예측을 하고 있음!

→ Stacking이 의미 없음!
→ Meta Learner가 할 일이 없음!
2. LogLoss가 높음 ⚠️
OOF LogLoss: 0.2635
기준: 0.15 이하가 좋음

→ 모델이 LogLoss 최적화 안 됨
→ Accuracy만 최적화됨

음 일단 Kaggle의 Playground Series S6E2의 평가 Metric은 LogLoss (Binary Cross Entropy) 기준이라는 점이다.

OOF LogLoss: 0.263510
LB Score: 0.95363

위 코드를 보면 LB와 LogLoss가 0.5 이상이나 차이나는걸 보면 뭔가 잘못된 걸 알 수 있다.

이후에 weight blending으로 6가지 제출물을 만들어서 제출도 해보고 Seed Ensemble도 해봤지만
0.95363에서 더이상 올라가지는 못하던데 클로드도 여기에서 더이상 올릴 방법을 모르더라구요.

Logloss도 최적화 하고 Target Encoding Leakage 수정도 별다른 효과는 없었다.

대회마감까지 4일남은 현시점에서 아직 포기하기엔 이르다.

끝까지 할 수 있는 걸 해보고싶어서 챗지피티한테도 물어봐서 다른 방법은 없는지 강구해보았다.

지피티는 클로드의

  1. StandardScaler 제거 (트리 모델은 불필요)
  2. CatBoost를 제대로 쓰지 않음 (가장 큰 구멍!)
  3. Calibration (거의 확실한 효과)
  4. OOF LogLoss vs LB 괴리 (0.2712 vs 0.04637)

위와 같은 부분들이 부족하다고 지적하였고

그걸 보완한 코드를 다시 클로드가 만들어 학습시켜보았다.

결과는 Score: 0.95309로 별다른 변화는 없었다. 다시 한번 미세한 조정만 해서 기존 최고 모델 유지하면서 Calibration만 추가(안전)하고 Learning rate 조정해보았다.

Score: 0.95357 아까보다 낫긴한데 그래도 기존의 최고점보다는 낮은 점수

정말 더 방법이 없는 걸까? 일단 이 글은 여기에서 마치고 다음에 이어 써보겠다.

요즘 취업 관련해서 복잡한 상황이라서 여러 방향을 모색중이다.

0개의 댓글