Spaceship Titanic 이동 예측
Kaggle · Spaceship Titanic

Spaceship Titanic 이동 예측

승객 8,693명의 기록으로 다른 차원으로 이동했는지 맞혔다. test와 같은 조건이 되도록 그룹 단위로 검증했고, 채택 기준을 결과 전에 고정했다. 그 결과 CV가 리더보드를 0.6%p 안에서 예측했다.

0.81084 최고 Public 점수(E2 앙상블). 기준선 CatBoost 0.81061과는 test 4,277행 중 약 1건 차이로, 사실상 같은 성능이다.
TRAIN / TEST
8,693 / 4,277
이동 비율
50.4%
겹치는 그룹
0%
제출
2 / 5회
제출 이력

그룹 CV가 리더보드를 잘 예측했다

0.8050.8100.8150.8200.81300.81061s1 CatBoost 기준선0.81680.81084s2 E2 앙상블
그룹 CV (5-fold × seed 2)Public LB
제출방식그룹 CVPublic LBCV − LB
s1 CatBoost 기준선원핫 인코딩 CatBoost 단일 모델0.81300.81061+0.24%p
s2 E2 앙상블원핫 CatBoost + 범주형 직접 처리 CatBoost 평균0.81680.81084+0.60%p

y축을 0.805~0.820으로 확대했다. Titanic에서는 CV와 LB의 차이가 7.45%p였지만, 여기서는 0.24~0.60%p다. s2는 채택 기준에 못 미쳤지만 사용자 요청으로 확인용으로 제출했다.

1 · 데이터와 EDA

그룹은 train과 test에 걸치지 않는다

PassengerId gggg_pp의 앞 네 자리는 함께 여행하는 그룹이다. test의 3,063개 그룹 중 train에도 있는 그룹은 하나도 없다. 그래서 검증도 그룹 단위로 나눠야 test와 같은 상황이 된다. 결측은 컬럼마다 약 2%로 고르게 퍼져 있다.

CryoSleep = True → 지출 0수면 중 승객 3,037명 중 지출이 있는 사람예외 0건
Age ≤ 12 → 지출 012세 이하 806명 중 지출이 있는 사람예외 0건
그룹 → 같은 HomePlanet, Side2명 이상 그룹에서 값이 모두 같은 비율100%
Deck A/B/C/T → Europa, G → EarthCabin deck/num/side의 Deck과 출신 행성 교차표예외 0건
지출 0 → CryoSleep = True지출이 없는 승객 중 수면 중인 비율. 단정할 수 없어 쓰지 않았다85.4%
CryoSleep, HomePlanet, Deck별 이동률과 나이, 지출 분포, Cabin 번호와 Side별 이동률
train 기준 이동률과 분포. CryoSleep 81.8% vs 32.9%, 지출 없음 78.6% vs 29.9%
2 · 검증 설계와 모델 비교

그룹 단위 5-fold를 두 번 나눠 본다

타깃을 쓰지 않는 결정적 규칙만으로 결측을 채웠다. 그룹 크기, Cabin 분해(Deck, 번호, Side, 300 단위 구간), 지출 로그와 합계, 무지출 여부, 나이 구간, 성씨 인원 수를 특징으로 만들었다. 남은 결측과 스케일링은 학습 fold 안에서 처리했다. 주검증은 StratifiedGroupKFold(5)를 seed 42와 7로 두 번 돌린 fold 10개다.

모델그룹 CV표준편차seed 42seed 7일반 CV
catboost0.81300.01170.81190.81410.8131
avg_lgbm_xgb_cat0.81300.01140.81200.81390.8109
xgboost0.81260.01030.81260.81260.8105
lightgbm0.80960.01000.81030.80890.8097
random_forest0.80470.00950.80490.80460.8029
logistic0.77590.01110.77680.77500.7761
dummy0.50360.00030.50360.50360.5036
모델별 그룹 CV와 일반 CV 정확도 막대그래프
파랑: 그룹 CV(주검증), 노랑: 일반 CV. 둘의 차이는 0.002 이내

상위 4개 모델의 차이(0.0034 이내)는 fold 표준편차(약 0.011)보다 작다. 그래서 가장 단순한 CatBoost 단일 모델을 기준선으로 정했다. 이후 개선안은 기준선 대비 +0.5%p 이상이고 두 seed 모두에서 좋아질 때만 채택한다고 미리 정했다.

3 · 개선 실험 세 단계

어떤 개선안도 채택선을 넘지 못했다

모든 비교는 기준선과 같은 fold에서 짝지어 했다. 막대는 두 seed의 평균, 점은 seed별 값이다. 튜닝 막대는 고르는 데 쓰지 않은 seed 7 결과만 보여준다.

-0.4-0.2+0.0+0.2+0.4+0.6+0.8채택선 +0.5%p1단계V1 그룹 특징seed 42: -0.08%pseed 7: -0.48%p-0.281단계V2 범주형 직접 처리seed 42: +0.18%pseed 7: +0.16%p+0.171단계V3 = V1 + V2seed 42: +0.17%pseed 7: +0.33%p+0.252단계V3 튜닝 (seed 7 독립 검증)seed 42: +0.69%pseed 7: -0.01%p-0.013단계E1 V3 + LGBM + XGBseed 42: +0.29%pseed 7: +0.22%p+0.253단계E2 기준선 + V3seed 42: +0.44%pseed 7: +0.32%p+0.383단계E3 넷 모두seed 42: +0.28%pseed 7: +0.22%p+0.25
평균 개선폭 (%p)악화튜닝: 막대는 seed 7 독립 검증만, 오른쪽 점은 선택에 쓴 seed 42seed별 값채택선

E2를 확인용으로 제출하자 기준선과 예측이 다른 test 133건의 득실이 거의 상쇄됐다(LB +0.02%p). CV에서 기준을 넘지 못한 차이는 리더보드에서도 보이지 않았다.

4 · 교훈

검증을 test에 맞추면 CV를 믿을 수 있다

  1. 분할은 test의 조건을 따른다. 그룹이 겹치지 않는 test에 맞춰 그룹 단위로 나눴고, CV와 LB의 차이는 0.6%p 안이었다.
  2. 기준은 결과를 보기 전에 정한다. 미리 정한 +0.5%p를 넘지 못한 개선안은 리더보드에서도 차이가 없었다.
  3. 고르는 데 쓴 분할로 평가하지 않는다. 튜닝의 +0.52%p는 다른 분할에서 −0.34%p로 뒤집혔다.
  4. 대치는 예외 없는 규칙만 쓴다. "지출 0이면 수면 중"처럼 그럴듯하지만 15%가 틀리는 규칙은 넣지 않았다.
부록 · 재현

프로젝트 루트에서 실행

.venv/Scripts/python spaceship/src/eda.py
.venv/Scripts/python spaceship/src/train.py
.venv/Scripts/python spaceship/src/improve.py
.venv/Scripts/python spaceship/src/tune.py "V3_group+native" 10
.venv/Scripts/python spaceship/src/ensemble.py
.venv/Scripts/python spaceship/src/ensemble.py --submit-file "E2_V0+V3"

판단이 필요한 지점마다 외부 모델에 자문했다. 일반 판단은 Jev, 중요한 판단(검증 설계, 채택 기준, 앙상블 선택 규칙)은 gpt-6-astra, 리서치는 gpt-6-sol을 썼다. 최종 결정과 근거는 작업 기록에 남겼다. 노트북 spaceship/notebooks/spaceship_analysis.ipynb에 같은 내용이 코드와 함께 있다.