Titanic 생존 예측 분석
EDA, 모델 9개 비교, 리더보드 격차 진단을 거쳐 결론에 이르렀다. 가장 잘 일반화된 것은 학습한 모델이 아니라 가족 단위 생존 규칙이었다.
- TRAIN / TEST
- 891 / 418
- 생존율
- 38.4%
- 비교한 모델
- 9 + 규칙
- 제출
- 3회
CV가 높다고 리더보드도 높지는 않았다
| 제출 | 방식 | CV | Public LB | 정답 / 418 |
|---|---|---|---|---|
| gender 기준선 | 여성 생존 · 남성 사망 | 0.7867 | 0.76555 | 320 |
| v1 Soft Voting | LR + RF + XGB | 0.8376 | 0.76315 | 319 |
| v2 WCG 규칙 | 가족 집단 규칙 | 0.8395 | 0.79904 | 334 |
| v3 WCG + Voting | 집단 정보 없으면 ML | 0.8485 | 0.77511 | 324 |
Titanic은 test 전원을 public으로 채점한다. 0.0024는 1명이다. 그래서 차이는 정답 수로 함께 읽었다.
성별, 등급, 호칭이 생존을 거의 설명한다
- 여성 74.2%, 남성 18.9%가 생존했다. 1·2등석 여성은 92% 이상, 2·3등석 남성은 14~16%다.
- 같은 남성이어도 Master(남자아이)는 57.5%, 성인(Mr)은 15.7%다.
- 가족 2~4명은 57.9%, 혼자는 30.4%, 5명 이상은 16.1%다. 집단이 작아서 과하게 해석하지 않았다.
- 결측은 Age 20%, Cabin 77%다. Fare(test 1명)와 Embarked(train 2명)는 거의 없다. train과 test의 결측률은 비슷하다.
상위 모델 간 차이는 fold 변동보다 작다
Title, FamilySize, Deck, Ticket 접두어 같은 행 단위 특징을 만들었다. Ticket 집단 크기, 나이 대치, 1인당 요금처럼 데이터 통계가 필요한 특징은 학습 fold로만 계산해서 검증 fold의 정보가 새지 않게 했다. 검증은 5-fold를 seed 3개로 반복했고, 같은 티켓끼리 묶는 Group CV도 같이 봤다.
| 모델 | CV 평균 | 표준편차 | Ticket Group CV |
|---|---|---|---|
| soft_voting | 0.8376 | 0.0212 | 0.8272 |
| lightgbm | 0.8343 | 0.0201 | 0.8182 |
| extra_trees | 0.8312 | 0.0188 | 0.8215 |
| random_forest | 0.8309 | 0.0198 | 0.8238 |
| logistic | 0.8309 | 0.0217 | 0.8204 |
| xgboost | 0.8294 | 0.0234 | 0.8159 |
| decision_tree | 0.7998 | 0.0261 | 0.7925 |
| mlp | 0.7853 | 0.0231 | 0.7980 |
| dummy_majority | 0.6162 | 0.0023 | 0.6162 |
MLP(신경망)는 0.785로 트리·선형 모델보다 낮았다. 891행의 표 데이터에서는 예상된 결과다.
CV 0.8376, 리더보드 0.76315
첫 제출은 성별만 쓰는 기준선보다도 1명 적게 맞혔다. 제출 횟수를 아끼기 위해, 원인을 찾는 실험은 모두 CV로만 했다.
| 특징 구성 | LGBM | LR | RF | Voting |
|---|---|---|---|---|
| A_current | 0.8343 | 0.8309 | 0.8294 | 0.8372 |
| B_no_group | 0.8354 | 0.8305 | 0.8305 | 0.8372 |
| C_transductive_group | 0.8402 | 0.8290 | 0.8328 | 0.8361 |
| D_simple | 0.8421 | 0.8241 | 0.8335 | 0.8365 |
| E_no_overlap | 0.8335 | 0.8256 | 0.8290 | 0.8369 |
- 특징 구성 A~E(현재 / 집단 특징 제거 / train+test 티켓 빈도 / 단순 특징 / 중복 제거)는 모두 0.824~0.842로 노이즈 범위였다.
- 고정 규칙인 성별 기준선도 CV 0.787에서 LB 0.766으로 떨어진다. test가 조금 더 어려운 표본이다.
- Ticket 집단 크기 분포(train 1.79, test 1.71)도 큰 차이가 없었다.
가족이 함께 살고 함께 죽었다
기본은 "여성 생존, 남성 사망"이다. 성, 등급, 티켓(마지막 글자 제외), 요금, 승선항으로 가족 집단을 묶는다. train에서 같은 집단의 여성·아이가 모두 살았으면 그 집단의 남자아이도 살린다. 모두 죽었으면 그 집단의 여성도 사망으로 바꾼다. 학습하는 값이 없다.
| 변경 | test 승객 | 등급 | 티켓 | train의 같은 집단 여성·아이 |
|---|---|---|---|---|
| 남자아이 → 생존 | Ryerson, Master. John Borie | 1등석 | PC 17608 | Miss. Emily Borie (생존), Miss. Susan Parker "Suzette" (생존) |
| 여성 → 사망 | Ilmakangas, Miss. Ida Livija | 3등석 | STON/O2. 3101270 | Miss. Pieta Sofia (사망) |
CV는 0.8395로 최고 ML 모델과 같았지만 리더보드는 0.79904였다. 성별 기준선과 다르게 예측한 16명 중 15명이 맞았다.
CV에서 이긴 결합이 리더보드에서 졌다
WCG가 다루지 못하는 성인 남성과 3등석 여성에 ML을 붙였다. H1은 집단 정보가 없으면 ML, H2는 임계값 보정(중첩 CV), H3는 집단 생존율을 ML 특징으로 넣는 방식이다. "변경분 정확도"는 WCG와 다르게 예측한 사람 중 맞힌 비율이다.
| 방식 | CV 평균 | fold당 WCG 대비 변경 | 변경분 정확도 |
|---|---|---|---|
| H1_LGBM_D | 0.8496 | 15.3 | 0.559 |
| H1_Voting_A | 0.8485 | 9.2 | 0.587 |
| H3_LGBM_D | 0.8470 | 15.1 | 0.544 |
| H3_Voting_A | 0.8443 | 9.3 | 0.547 |
| H1_LR_A | 0.8440 | 10.8 | 0.537 |
| H3_LR_A | 0.8421 | 10.1 | 0.523 |
| ML_LGBM_D | 0.8406 | 17.5 | 0.506 |
| WCG | 0.8395 | 0.0 | – |
| ML_Voting_A | 0.8369 | 12.1 | 0.481 |
| H2_LGBM_D | 0.8361 | 4.7 | 0.437 |
| H2_LR_A | 0.8357 | 2.3 | 0.353 |
| ML_LR_A | 0.8309 | 13.9 | 0.445 |
| H1_Voting 평가 | 변경 수 | 정답 / 오답 | 변경분 정확도 |
|---|---|---|---|
| Stratified CV | 46 | 27 / 19 | 0.587 |
| Ticket Group CV | 85 | 60 / 25 | 0.706 |
| 실제 test (LB에서 역산) | 22 | 6 / 16 | 0.273 |
CV 기대치(0.587)대로라면 22명 중 정답이 6명 이하일 확률은 약 0.3%다. "CV에서 같은 티켓이 섞여 ML이 유리했다"는 가설은 Group CV에서 오히려 이득이 커져서 기각했다. 규칙 밖 집단에서 train과 test의 패턴이 다르다고 판단했지만, 구체적인 원인은 밝히지 못했다.
작은 데이터에서 무엇을 믿을 것인가
- CV는 비슷한 모델들을 가려내지 못한다. 891행에서는 fold 표준편차(약 0.02)가 모델 간 차이보다 크다.
- 도메인 구조가 가장 강한 신호였다. "여성과 아이 먼저", 그리고 가족 단위의 생존이다.
- 학습할 값이 적을수록 잘 일반화됐다. 규칙 0.799, ML 0.763~0.775.
- 제출은 진단 목적에 맞게 최소화했다. 리더보드를 보고 계속 고르면 그것도 과적합이다.
프로젝트 루트에서 실행
.venv/Scripts/python titanic/src/eda.py .venv/Scripts/python titanic/src/train.py .venv/Scripts/python titanic/src/experiments.py .venv/Scripts/python titanic/src/wcg.py --submit-file .venv/Scripts/python titanic/src/hybrid.py --submit-file
판단이 필요한 지점마다 외부 모델에 자문했다. 일반 판단은 Jev, 중요한 판단(검증 설계, 격차 진단, 결합 설계)은 gpt-6-astra, 리서치는 gpt-6-sol을 썼다. 최종 결정과 그 근거는 작업 기록에 남겼다. 노트북 titanic/notebooks/titanic_analysis.ipynb에 같은 내용이 코드와 함께 있다.