Spaceship Titanic 이동 예측
승객 8,693명의 기록으로 다른 차원으로 이동했는지 맞혔다. test와 같은 조건이 되도록 그룹 단위로 검증했고, 채택 기준을 결과 전에 고정했다. 그 결과 CV가 리더보드를 0.6%p 안에서 예측했다.
- TRAIN / TEST
- 8,693 / 4,277
- 이동 비율
- 50.4%
- 겹치는 그룹
- 0%
- 제출
- 2 / 5회
그룹 CV가 리더보드를 잘 예측했다
| 제출 | 방식 | 그룹 CV | Public LB | CV − LB |
|---|---|---|---|---|
| s1 CatBoost 기준선 | 원핫 인코딩 CatBoost 단일 모델 | 0.8130 | 0.81061 | +0.24%p |
| s2 E2 앙상블 | 원핫 CatBoost + 범주형 직접 처리 CatBoost 평균 | 0.8168 | 0.81084 | +0.60%p |
y축을 0.805~0.820으로 확대했다. Titanic에서는 CV와 LB의 차이가 7.45%p였지만, 여기서는 0.24~0.60%p다. s2는 채택 기준에 못 미쳤지만 사용자 요청으로 확인용으로 제출했다.
그룹은 train과 test에 걸치지 않는다
PassengerId gggg_pp의 앞 네 자리는 함께 여행하는 그룹이다. test의 3,063개 그룹 중 train에도 있는 그룹은 하나도 없다. 그래서 검증도 그룹 단위로 나눠야 test와 같은 상황이 된다. 결측은 컬럼마다 약 2%로 고르게 퍼져 있다.
deck/num/side의 Deck과 출신 행성 교차표예외 0건그룹 단위 5-fold를 두 번 나눠 본다
타깃을 쓰지 않는 결정적 규칙만으로 결측을 채웠다. 그룹 크기, Cabin 분해(Deck, 번호, Side, 300 단위 구간), 지출 로그와 합계, 무지출 여부, 나이 구간, 성씨 인원 수를 특징으로 만들었다. 남은 결측과 스케일링은 학습 fold 안에서 처리했다. 주검증은 StratifiedGroupKFold(5)를 seed 42와 7로 두 번 돌린 fold 10개다.
| 모델 | 그룹 CV | 표준편차 | seed 42 | seed 7 | 일반 CV |
|---|---|---|---|---|---|
| catboost | 0.8130 | 0.0117 | 0.8119 | 0.8141 | 0.8131 |
| avg_lgbm_xgb_cat | 0.8130 | 0.0114 | 0.8120 | 0.8139 | 0.8109 |
| xgboost | 0.8126 | 0.0103 | 0.8126 | 0.8126 | 0.8105 |
| lightgbm | 0.8096 | 0.0100 | 0.8103 | 0.8089 | 0.8097 |
| random_forest | 0.8047 | 0.0095 | 0.8049 | 0.8046 | 0.8029 |
| logistic | 0.7759 | 0.0111 | 0.7768 | 0.7750 | 0.7761 |
| dummy | 0.5036 | 0.0003 | 0.5036 | 0.5036 | 0.5036 |
상위 4개 모델의 차이(0.0034 이내)는 fold 표준편차(약 0.011)보다 작다. 그래서 가장 단순한 CatBoost 단일 모델을 기준선으로 정했다. 이후 개선안은 기준선 대비 +0.5%p 이상이고 두 seed 모두에서 좋아질 때만 채택한다고 미리 정했다.
어떤 개선안도 채택선을 넘지 못했다
모든 비교는 기준선과 같은 fold에서 짝지어 했다. 막대는 두 seed의 평균, 점은 seed별 값이다. 튜닝 막대는 고르는 데 쓰지 않은 seed 7 결과만 보여준다.
- 1단계 · 특징과 범주 처리: 그룹 단위 특징(V1)만 넣으면 오히려 나빠졌다. 기존의 그룹 크기, 성씨 인원 수와 정보가 겹친 것으로 보인다. CatBoost가 범주를 직접 처리하게 한 V2, V3가 조금 나았다.
- 2단계 · 튜닝: seed 42 fold로 파라미터를 고르자 +0.52%p가 나왔다. 하지만 고르는 데 쓰지 않은 seed 7 fold에서는 기본 설정보다 0.34%p 낮았다. 같은 데이터로 고르고 평가해서 생긴 선택 편향이었다.
- 3단계 · 앙상블: 후보 3개를 결과 전에 고정하고 가중치를 튜닝하지 않았다. 가장 좋은 E2는 fold 10개 중 8개에서 좋아졌지만 +0.38%p였다. LightGBM과 XGBoost를 섞으면 오히려 내려갔다. 다양성은 모델 종류보다 범주를 다루는 방식에서 나왔다.
E2를 확인용으로 제출하자 기준선과 예측이 다른 test 133건의 득실이 거의 상쇄됐다(LB +0.02%p). CV에서 기준을 넘지 못한 차이는 리더보드에서도 보이지 않았다.
검증을 test에 맞추면 CV를 믿을 수 있다
- 분할은 test의 조건을 따른다. 그룹이 겹치지 않는 test에 맞춰 그룹 단위로 나눴고, CV와 LB의 차이는 0.6%p 안이었다.
- 기준은 결과를 보기 전에 정한다. 미리 정한 +0.5%p를 넘지 못한 개선안은 리더보드에서도 차이가 없었다.
- 고르는 데 쓴 분할로 평가하지 않는다. 튜닝의 +0.52%p는 다른 분할에서 −0.34%p로 뒤집혔다.
- 대치는 예외 없는 규칙만 쓴다. "지출 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에 같은 내용이 코드와 함께 있다.