안녕하세요!
이번 글에서는 Kaggle Playground Series - Season 6, Episode 6 대회에서 진행한 첫 번째 연구 기록을 정리하겠습니다.
데이콘도 좋지만 주변 지인들이 캐글을 꼭 나가보라고 권유해서 도전을 해보겠습니다.
근데...오늘 성과가 좋은거 같아서...놀랐습니다...무려 8등!
10일 밖에 안 됐는데 참가자가 무려 2831명입니다. 데이콘과는 규모가 다르더군요...(데이콘 무시 아님.)

대회 목표는 천체 데이터를 보고 GALAXY, QSO, STAR 중 하나의 class를 예측하는 것입니다. 평가지표는 balanced accuracy이다. 즉 전체 정확도만 높이는 것보다 세 class를 고르게 맞히는 것이 중요합니다.
이번 기록의 핵심은 공개된 고득점 제출물에서 멈추지 않고, 그 제출물을 기준 앵커로 삼아 추가로 점수를 올릴 수 있는 row-level patch 후보를 찾은 과정을 작성해봤습니다.
1. 시작 지점
처음에는 대회 설명 문서와 공유된 고득점 참고 자료를 확인했다.
공유된 참고 자료에는 0.97137 수준의 public leaderboard 제출물이 있었다. 이 제출물은 단일 모델 결과라기보다 여러 공개 제출물을 섞고, 일부 row를 직접 patch한 형태에 가까웠다.
로컬 data/ 폴더에는 다음 파일을 넣었다.
data/train.csv
data/test.csv
data/sample_submission.csv
data/submission.csv
여기서 data/submission.csv는 공유된 고득점 제출 결과물로 보인다. 이 파일은 sample_submission.csv와 id 순서가 일치했고, class label도 정상적으로 들어 있었다.
초기 확인 결과는 다음과 같다.
train shape: (577347, 12)
test shape: (247435, 11)
submission shape: (247435, 2)
submission id order: sample_submission.csv와 일치
data/submission.csv의 public score는 제출 결과 기준 0.97137이었다. 이 값을 오늘의 기준 앵커로 삼았다.
2. 구현한 코드 구조
오늘 만든 주요 코드는 다음과 같다.
src/stellar_features.py
scripts/analyze_anchor_submission.py
scripts/train_lgbm_cv.py
scripts/train_catboost_cv.py
scripts/analyze_patch_candidates.py
scripts/ensemble_patch_candidates.py
scripts/build_probe_queue.py
src/stellar_features.py에서는 feature engineering을 담당한다.
사용한 주요 feature는 다음과 같다.
원본 수치 feature:
alpha, delta, u, g, r, i, z, redshift
categorical feature:
spectral_type, galaxy_population
색지수 feature:
u-g, g-r, r-i, i-z, u-r, u-i, u-z, g-i, g-z, r-z
밝기 통계 feature:
mag_mean, mag_std, mag_min, mag_max, mag_range
redshift 파생 feature:
redshift_abs, redshift_log1p, redshift_x_u-r, redshift_x_g-i
좌표 변환 feature:
alpha_sin, alpha_cos, delta_sin, delta_cos
천문 데이터에서는 raw magnitude보다 band 간 차이, 즉 color index가 중요한 신호가 될 수 있다. 그래서 u-g, g-r, u-r, g-i 같은 feature를 명시적으로 만들었다.
3. 모델 학습 결과
오늘은 LightGBM과 CatBoost를 학습했다.
두 모델 모두 5-fold Stratified CV를 사용했다. metric은 대회 metric과 같은 balanced accuracy로 확인했다.
LightGBM 결과는 다음과 같다.
OOF balanced accuracy: 0.964320
fold scores:
0.964703
0.964167
0.964266
0.964287
0.964178
CatBoost 결과는 다음과 같다.
OOF balanced accuracy: 0.964947
fold scores:
0.964424
0.965538
0.966156
0.963908
0.964707
단독 모델의 OOF 점수는 public leaderboard의 0.97137 앵커보다 낮다. 따라서 이 모델들을 단독 제출용으로 쓰는 것은 적절하지 않다.
하지만 두 모델의 확률값은 매우 유용하다. 앵커 제출물과 다른 예측을 하면서도 두 모델이 같은 방향을 가리키는 row를 찾으면, 앵커를 조금 더 개선할 수 있는 patch 후보가 된다.
4. 전략: row-level patch
이 대회의 상위권 점수는 큰 모델 하나로 갈리는 것이 아니라, 이미 강한 앵커 제출물 위에서 몇 개 row를 더 맞히는 것에 가깝다고 판단했다.
그래서 전략을 다음과 같이 바꿨다.
- 공유 고득점 submission.csv를 anchor로 사용한다.
- LightGBM과 CatBoost의 test 확률을 만든다.
- 두 모델이 anchor와 다르게 예측하는 row를 찾는다.
- 두 모델이 서로 같은 새 label을 예측하는 row만 남긴다.
- 두 모델의 confidence가 높은 row를 우선순위로 정렬한다.
- single probe와 group probe 제출 파일을 만든다.
- Public LB 반응을 보고 다음 후보군을 좁힌다.
즉, 모델 자체가 최종 답이 아니라 모델의 확률을 이용해 앵커의 약점을 찾는 방식이다.
5. 찾아낸 patch 후보
LightGBM과 CatBoost가 모두 anchor와 다른 방향으로 예측했고, 두 모델이 서로 동의했으며, 두 모델 중 낮은 confidence도 0.95 이상인 후보는 9개였다.
rank id change min_conf mean_conf
1 714971 STAR->GALAXY 0.972432 0.983942
2 750174 STAR->GALAXY 0.960746 0.961309
3 669397 GALAXY->STAR 0.960582 0.976129
4 579793 STAR->GALAXY 0.960507 0.967390
5 788472 STAR->GALAXY 0.958819 0.962923
6 635279 GALAXY->STAR 0.957326 0.972952
7 687986 STAR->GALAXY 0.952157 0.957634
8 713024 STAR->GALAXY 0.951397 0.953448
9 771852 STAR->GALAXY 0.950226 0.956855
이 후보들을 바탕으로 artifacts/probe_queue/에 제출용 CSV를 만들었다.
주요 제출 후보군들!
single_rank_01_id_714971_STAR_to_GALAXY.csv
group_minconf_095_galaxy_to_star.csv
group_minconf_095_star_to_galaxy_except_rank_01.csv
group_minconf_095_all.csv
scripts/build_probe_queue.py가 이 제출 큐를 생성한다.
6. 실제 제출 결과
| 제출 파일 | Public Score | 해석 |
|---|---|---|
submission.csv |
0.97137 | 공유 앵커 제출물이다. |
single_rank_01_id_714971_STAR_to_GALAXY.csv |
0.97137 | rank 1 단독 변경은 점수를 올리지 못했다. |
group_minconf_095_galaxy_to_star.csv |
0.97137 | GALAXY->STAR 방향은 개선 효과가 없었다. |
group_minconf_095_star_to_galaxy_except_rank_01.csv |
0.97139 | rank 1을 제외한 STAR->GALAXY 묶음이 점수를 올렸다. |
group_minconf_095_all.csv |
0.97139 | 전체 9개 후보 묶음도 같은 점수를 기록했다. |
기준 앵커 0.97137에서 0.97139로 0.00002 상승했다.
상승폭은 작다. 하지만 이 대회 public leaderboard는 매우 촘촘하다. 이 작은 상승으로 public leaderboard 순위가 39등 부근에서 8등까지 올라갔다.
오늘 가장 중요한 관찰은 다음이다.
- STAR->GALAXY 방향의 일부 patch가 효과가 있었다.
- GALAXY->STAR 방향은 이번 제출에서는 효과가 없었다.
- rank 1 단독 변경은 효과가 없었다.
- rank 1을 제외한 STAR->GALAXY 묶음은 효과가 있었다.
따라서 다음 탐색은 STAR로 되어 있는 anchor row 중 실제로 GALAXY일 가능성이 높은 row를 더 찾는 방향이 된다.
7. 마무리
오늘 얻은 정보는 다음과 같다.
- 공유 앵커 점수 0.97137에서 멈추지 않았다.
- LightGBM과 CatBoost를 이용해 앵커와 충돌하는 row를 찾았다.
- 두 모델이 동의하는 고신뢰 후보를 제출 큐로 만들었다.
- 실제 제출에서 0.97139까지 점수를 올렸다.
- Public LB 기준 8등까지 올라갔다.
이번 개선은 큰 모델 개선이 아니라 row-level patch 개선이다. 이 대회에서는 이런 작은 개선이 순위를 크게 바꾼다.
하지만 아직 안심하면 안 된다. 대회 마감은 2026년 6월 30일이고, 현재 날짜 기준 약 20일이 남아 있다. Public LB에서 8등이라고 해도 Private LB에서 그대로 유지된다는 보장은 없다.
따라서 앞으로의 목표는 단순히 public score를 더 올리는 것이 아니라, private leaderboard에서도 무너지지 않을 patch를 찾는 것이다. 대회들이 다 비슷한 느낌이다. 결국은 일반화 성능을 어떻게 새롭게 연구해서 찾아낼 것인가 고민해야 되는 것 같다.
'6. 경진 대회 (kaggle, dacon 등) > 6-1 연구 및 개선 기록' 카테고리의 다른 글
| [개인 경진 대회] Kaggle Playground Series S6E6 연구 (5): RealMLP 피처 뱅크 실험 기록 (0) | 2026.06.19 |
|---|---|
| [개인 경진 대회] Kaggle Playground Series S6E6 연구 (4) 그래프 분석편 (0) | 2026.06.17 |
| [개인 경진 대회] Kaggle Playground Series S6E6 연구 기록 3일차 (0) | 2026.06.16 |
| [개인 경진대회] DACON - 성균관대 멀티모달 AI 챌린지 (6): 채점 구조 역공학과 commit recovery (0) | 2026.06.15 |
| [개인 경진 대회] Kaggle Playground Series S6E6 연구 기록 2일차 (0) | 2026.06.13 |
