[개인 경진 대회] Kaggle Playground Series S6E6 연구 기록 2일차

2026. 6. 13. 16:51·6. 경진 대회 (kaggle, dacon 등)/6-1 연구 및 개선 기록

안녕하세요. 이번 글에서는 Kaggle Playground Series S6E6 대회에서 진행한 두 번째 연구 기록을 정리하겠습니다!

 

1일차에는 공유된 0.97137 public leaderboard 제출물을 기준 앵커로 삼고, LightGBM과 CatBoost의 예측 확률을 이용해서 row-level patch 후보를 찾았다. 그 결과 STAR->GALAXY 방향의 일부 후보가 실제 public score를 올렸고, 0.97139까지 도달했다.

이번 기록의 핵심은 두 가지이다.

  1. 순수 모델 generalization 성능을 올리기 위한 실험
  2. public leaderboard 점수를 더 올리기 위한 row-level patch 연구

처음에는 이 두 목표가 섞여 있었다. 하지만 연구를 진행하면서 둘은 분명히 다른 문제라는 것을 확인했다. 순수 모델은 private leaderboard와 일반화 성능을 위해 필요하고, public patch는 현재 leaderboard에서 한두 row를 더 맞히기 위한 별도 전략이다.

그래서 이번에는 두 트랙을 분리해서 진행했다.

 

내가 이렇게 나눈 이유는 중요하다. 경진 대회는 퍼블릭 점수를 먼저 선 공개하게 되어있다. 대회주최 측에서 프라이빗 점수는 숨긴다. 이유는 명확한데 퍼블릭 점수를 올리는 건 AI한테 수치 계산만 시키면 어떻게든 올라가게 되어있다. 퍼블릭 점수를 조금은 신뢰하되 맹신하면 안 된다. 처음 데이콘 대회를 나갔을 때도 퍼블릭 점수의 순위는 상위권 10%(26위) 정도였지만 3~4%(16위)로 올랐을 때 깨달았다.

그리고 모든 대회에서도 계속 언급하는게 연구를 통한 개선이나 일반화 성능 향상을 원하는 것이다. 퍼블릭 점수만을 올리는 건 공부도 안 될 뿐더러 도움도 안 될 것이다.

 

그래서 캐글 대회를 이번에 보니 캐글은 최종 제출물을 2개로 확정 지을 수 있다. 그래서 목표를 위처럼 세운 것이다. 내가 세운 일반화 테스트 1등과 혹시 모를 퍼블릭 1순위를 같이 연구하고 제출하는 것이다.


1. 먼저 한 정리

이전 실험 중 broad feature를 많이 추가한 LightGBM wide 실험이 있었다. 하지만 1-fold screening에서 성능이 기존 baseline보다 좋아지지 않았다. 그래서 실패한 실험 코드는 정리했다.

lgbm_wide 관련 코드를 정리했다.

2. 순수 모델 현재 기준 (일반화 성능)

순수 모델은 public submission CSV를 사용하지 않고, train/test data와 모델 학습 결과만 사용하는 트랙이다.

현재 순수 모델 기준은 다음과 같다.

LightGBM OOF balanced accuracy: 0.964320
CatBoost OOF balanced accuracy: 0.964947
unweighted ensemble OOF:        0.965489
optimized pure ensemble OOF:    0.966345

최종 pure ensemble은 LightGBM과 CatBoost의 OOF probability를 섞고, OOF balanced accuracy 기준으로 model weight와 class bias를 조정한 결과이다.

 

최적 설정은 다음과 같았다.

model weights:
LightGBM  0.48625
CatBoost  0.51375

class bias:
GALAXY  0.79879
QSO     1.06739
STAR    1.13382

이 모델은 public anchor를 쓰지 않는다. 따라서 0.97139나 0.97141 public patch와는 성격이 다르다. 점수는 낮지만, private/generalization 관점에서 반드시 유지해야 하는 후보이다.

3. 순수 모델 진단

단순히 OOF score만 보는 것으로는 부족했다. 그래서 OOF prediction이 어디서 틀리는지 진단하는 스크립트를 만들었다.

scripts/analyze_pure_model_errors.py

진단 결과, 가장 큰 오류는 다음 방향이었다.

GALAXY -> STAR
GALAXY -> QSO
STAR   -> GALAXY
QSO    -> GALAXY

그중 가장 큰 오류는 GALAXY->STAR였다.

class별 recall은 다음과 같았다.

GALAXY recall: 0.956742
QSO recall:    0.975295
STAR recall:   0.966999

가장 문제가 되는 feature 구간도 확인했다.

redshift 0.05~0.13 부근
redshift_x_g-i 중간 구간
redshift_x_u-r 중간 구간
g-i 0.8~1.21 부근
mag_range 2.095~2.984 부근

즉 모델은 전체적으로 나쁘지 않지만, 특정 redshift와 color 조합에서 GALAXY와 STAR 경계를 흔들리고 있었다.

이 결과는 나중에 public patch 후보를 해석할 때도 도움이 되었다.


4. LightGBM variant screening

처음에는 LightGBM parameter를 바꾸면 순수 모델 OOF가 더 오를 수 있을 것이라고 생각했다.

그래서 variant screening 코드를 만들었다.

scripts/screen_lgbm_variants.py

실험한 후보는 다음과 같다.

baseline
deep_low_lr
no_class_weight
galaxy_precision
star_boundary
extra_trees

이 중 기록으로 남긴 주요 결과는 다음과 같다.

preset 1-fold balanced accuracy 해석
baseline 0.964863 기준선
deep_low_lr 0.964806 거의 비슷하지만 개선 아님
no_class_weight 0.957104 STAR recall이 크게 무너짐

 

no_class_weight는 logloss는 좋아 보였지만 balanced accuracy가 크게 떨어졌다. 특히 STAR recall이 0.928377까지 내려갔다.

이 실험에서 얻은 결론은 다음이다.

 


5. Meta stacker 실험

다음으로 2단계 stacker를 만들었다.

scripts/train_meta_stacker_cv.py

아이디어는 LightGBM과 CatBoost의 OOF probability, margin, entropy, 모델 간 agreement 정보를 meta feature로 넣고, 다시 LightGBM으로 학습하는 방식이다.

 

leakage를 피하기 위해 train에는 OOF probability를 사용하고, test에는 base model의 test probability를 사용했다.

하지만 1-fold screening 결과는 다음과 같았다.

meta stacker 1-fold score: 0.964951
같은 fold의 pure ensemble score: 0.966346

 

즉 meta stacker는 현재 pure ensemble보다 낮았다.

여기서 중요한 점은 stacker가 틀렸다는 것이 아니라, 지금 base model 2개만으로 만든 stacker는 충분한 추가 정보를 만들지 못했다는 것이다. 더 다양한 base model이 생기기 전까지는 이 방향을 최종 후보로 승격하지 않는 것이 맞다고 판단했다.

6. Boundary specialist 실험

진단 결과에서 GALAXY와 STAR 경계가 문제였기 때문에, 이 경계만 따로 보는 binary specialist도 만들었다.

scripts/train_boundary_specialist.py

처음 1-fold에서는 약간의 가능성이 보였다.

base score on covered rows: 0.966454
best override score:       0.966506
delta:                     +0.000052
changed rows:              31

하지만 full 5-fold로 확장하자 결과가 유지되지 않았다.

base score:     0.966345
best override:  0.966345
delta:          0.000000
best mask:      none

즉 1-fold에서 보였던 작은 개선은 전체 OOF에서는 일반화되지 않았다.

이 실험은 실패로 기록했다.

 

그래서 실험 결과는:

  • 전용 specialist 자체는 binary 문제에서는 강하다.
  • 하지만 그 결과를 3-class 최종 예측에 override하는 것은 훨씬 어렵다.
  • OOF 전체에서 유지되지 않으면 제출 후보로 쓰면 안 된다.

7. Public leaderboard 트랙으로 다시 분리

순수 모델 실험이 쉽지 않다는 것을 확인한 뒤, public LB 트랙은 별도로 진행했다.

1일차 best였던 0.97139 파일을 새 anchor로 잡았다.

artifacts/probe_queue/group_minconf_095_star_to_galaxy_except_rank_01.csv

이 파일은 0.97139를 기록했고, 변경 row는 6개뿐이었다.

특징은 다음과 같다.

  • 방향: 전부 STAR->GALAXY
  • rank 1 단독 무효 row 714971 제외
  • GALAXY->STAR 방향 제외

이후 다음 STAR->GALAXY 후보를 뽑기 위해 새 스크립트를 사용했다.

scripts/score_star_to_galaxy_candidates.py

 

이 스크립트는 단순히 모델 probability만 보는 것이 아니라, train distribution에서 만든 local evidence도 함께 사용했다.

LightGBM / CatBoost test probability
두 모델이 모두 GALAXY를 예측하는지 여부
mean_p_GALAXY
min_p_GALAXY
local_p_GALAXY
local_p_STAR
spectral_type
galaxy_population
redshift/color bin 기반 local class rate

그 결과 다음 후보 풀이 만들어졌다.

STAR->GALAXY candidates: 1098개
next probe pool:          43개

8. Public 제출 결과: 0.97139에서 0.97141까지

먼저 top_03, top_05, top_10을 제출했다.

제출 파일 변경 row Public Score
group_research_top_03.csv 3 0.97140
group_research_top_05.csv 5 0.97140
group_research_top_10.csv 10 0.97141

 

top3만으로 0.97140까지 상승, top5는 추가 상승 없음, top10에서 0.97141까지 상승

즉, 1~10번 후보 안에는 public score를 더 올리는 신호가 있었다.

 

이후 11~15 구간을 확인했다.

제출 파일 변경 row Public Score
group_research_top_15.csv 15 0.97141
group_research_rank_06_10.csv 5 0.97140
group_research_rank_11_15.csv 5 0.97139

해석은 다음과 같다.

  • rank 6~10 구간에는 일부 신호가 있다.
  • rank 11~15 단독은 개선 효과가 없다.
  • top15는 top10과 점수가 같지만 row를 더 많이 바꾼다.

따라서 현재 public best 후보는 top15가 아니라 top10이다.

9. 0.97141 plateau 확인

이후 top10 주변 후보를 더 확인했다. 이번 캐글 대회가 좋은게 하루에 10번이나 제출 할 수 있다. 하루에 더 많은 확인과 연구를 할 수  있어서 행복하다...!!

 

제출한 파일은 다음과 같다. 모두 점수는 같았다.

제출 파일 차이 Public Score
group_research_strong_local_top_10.csv 782600 제거, 700359 추가 0.97141
group_research_minpgal_092_top_10.csv 586725, 679177 제거, 608829, 609647 추가 0.97141
group_research_top10_plus_rank_17_19.csv top10에 17~19 추가 0.97141
group_research_top10_without_rank_09.csv top10에서 rank 9 제거 0.97141

 

그래도 얻은 정보는 있었다.

여러 변형이 모두 0.97141로 묶였다. rank 9인 782600은 public 표시 점수 기준으로 없어도 score가 유지됐다.
하지만 같은 score라면 더 적은 row를 바꾸는 top10 또는 top10_without_rank09가 private 리스크 측면에서 더 낫다.

 

이 시점부터 단순히 STAR->GALAXY 후보를 더 넣는 방식은 한계에 가까워 보였다.


10. Public feedback optimizer

그래서 제출 결과를 실험 데이터로 사용하기로 했다.

즉, 어떤 파일이 어떤 row를 바꿨고 public score가 어떻게 움직였는지를 행렬로 만들고, 각 row의 기여도를 역추정하는 방식이다.

이를 위해 다음 스크립트를 만들었다.

scripts/analyze_public_feedback_and_make_probes.py

이 스크립트는 지금까지 관측한 public score를 코드 안에 기록하고, 다음 probe 후보를 생성한다.

 

현재 기록한 public feedback은 다음과 같다.

 

현재 public best는 group_research_top_10.csv: rank 9는 public rounded score 기준으로 neutral 가능성이 있다. rank 11~15는 단독으로는 효과가 없다.

 

STAR->GALAXY top10 주변은 거의 plateau 상태다.

현재 public best는 group_research_top_10.csv
rank 9는 public rounded score 기준으로 neutral 가능성이 있다.
rank 11~15는 단독으로는 효과가 없다.
STAR->GALAXY top10 주변은 거의 plateau 상태다.

다음 후보 파일은 artifacts/public_feedback/에 만들어놨다. (오늘 제출 10개)

feedback_replace_rank09_with_rank17.csv
feedback_replace_rank09_with_rank18.csv
feedback_replace_rank09_with_rank19.csv
feedback_without_rank09_plus_best3.csv

이 파일들은 당장 확실한 best라기보다는, 0.97141 plateau 안에서 어떤 row를 유지하고 어떤 row를 버릴지 확인하기 위한 tomography probe에 가깝다.

시간도 충분해서 연구 및 확인 할 시간은 많다. 다만 취업 준비와 다른 대회들도 나가고 있어서 하루하루가 시간이 부족하다. 어째 국비 끝나니깐 시간이 더 부족하다...

11. 다른 class transition 탐색

STAR->GALAXY 축이 plateau에 걸렸기 때문에, 다음에는 아예 다른 class 전이를 열어야 한다고 판단했다.

그래서 현재 0.97141 anchor를 기준으로 모든 class transition을 다시 탐색하는 스크립트를 만들었다.

scripts/score_transition_candidates.py

기준 anchor는 다음 파일이다.

artifacts/star_to_galaxy_research/group_research_top_10.csv

탐색한 방향은 다음과 같다.

STAR->GALAXY
QSO->GALAXY
GALAXY->STAR
GALAXY->QSO
STAR->QSO
QSO->STAR

결과 요약은 다음과 같다.

transition candidates top ids
STAR->GALAXY 976 714971, 609647, 659273, 600940, 608829
QSO->GALAXY 153 796433, 708884, 725380, 629319, 724745
GALAXY->STAR 191 759496, 725680, 674147, 635279, 748959
GALAXY->QSO 12 685936, 715437, 770908, 760625, 817793
STAR->QSO 8 713270, 638310, 681234, 741525, 610450
QSO->STAR 6 741335, 706327, 795164, 588379, 596715

여기서 가장 흥미로운 새 방향은 QSO->GALAXY였다.

최상위 후보는 다음 row이다.

id 796433
anchor: QSO
proposed: GALAXY
mean_p_GALAXY: 0.833478
mean_p_QSO:    0.166408
local_p_GALAXY: 0.895798
local_p_QSO:    0.060802
redshift: 1.219847
spectral_type: M
galaxy_population: Red_Sequence

이 row는 두 모델이 모두 GALAXY를 강하게 보고 있고, local evidence도 GALAXY 쪽이다.

그래서 다음 public 돌파 후보는 STAR->GALAXY 추가가 아니라 QSO->GALAXY 단일 probe가 되었다.

생성된 파일은 다음과 같다.

artifacts/transition_research/transition_QSO_to_GALAXY_top_01.csv
artifacts/transition_research/transition_QSO_to_GALAXY_top_03.csv

12. 외부 baseline notebook에서 얻은 점

 

[개인 공부] Stellar Classification Baseline Notebook 코드 분석 기록

안녕하세요. 이번 글에서는 Kaggle Playground Series S6E6 대회와 관련해서 다른 참가자가 공유한 baseline notebook을 공부한 내용을 정리하겠습니다.캐글 경진 대회는 처음 참가해봤는데 토크나 파일 코드

pak1010pak.tistory.com

중간에 다른 참가자가 공유한 baseline notebook도 공부했다.

그 notebook은 제목에 CatBoost, HGBC, XGBoost, LightGBM, RealMLP가 모두 들어가 있었지만, 실제 실행 결과 기준으로는 HGBC 단일 모델이 학습된 상태였다.

 

성능:

HGBC OOF balanced accuracy: 0.962954

우리 모델과 비교하면 낮았다.

우리 LightGBM:  0.964320
우리 CatBoost: 0.964947
우리 pure ensemble: 0.966345

따라서 해당 notebook의 모델 자체를 가져오는 것은 의미가 크지 않았다.

하지만 배울 점은 있었다.

1. spectral curvature feature
2. redshift interaction
3. spectral_type + galaxy_population 조합 분석
4. subset별 balanced accuracy 분석

특히 subset별 error analysis가 중요했다.

전체 OOF score만 보면 모델이 어디서 약한지 알 수 없다. 하지만 spectral_type, galaxy_population, 그리고 둘의 조합별로 보면 특정 subset에서 모델이 흔들리는 구간이 보인다.

이 아이디어는 public patch에도 연결된다.

예를 들어 이번 STAR->GALAXY 후보들은 대부분 다음 subset에 몰려 있었다.

M / Red_Sequence
G/K / Red_Sequence

반대로 새 transition 후보인 QSO->GALAXY, GALAXY->STAR, STAR->QSO 쪽은 Blue_Cloud나 다른 spectral group이 더 많이 등장한다.

따라서 앞으로는 단순 confidence 순서가 아니라, subset별로 probe를 나누는 방식도 필요하다.

13. 현재까지의 결론

현재까지 얻은 결론은 다음과 같다.

순수 모델 best OOF:
0.966345

현재 public best:
0.97141

현재 public best 파일:
artifacts/star_to_galaxy_research/group_research_top_10.csv

순수 모델 쪽에서는 여러 실험을 했지만 아직 0.966345를 넘기지 못했다.

실패한 실험

broad feature LightGBM
LightGBM simple parameter variant
meta stacker
GALAXY/STAR boundary specialist override

하지만 이 실패들은 의미가 있었다. 어떤 방향이 안 되는지 확인했고, 현재 pure ensemble을 기준점으로 고정할 수 있었다.

Public LB 쪽에서는 0.97139에서 0.97141까지 올렸다.

 

다음으로 시헙해 볼 건 아래 두 가지이다.

  1. public feedback으로 top10 내부 row를 교체/압축한다.
  2. QSO->GALAXY 같은 새 class transition을 probe한다.

14. 마무리

이번 연구에서 가장 크게 느낀 점은 public leaderboard 점수와 순수 모델 성능은 같은 문제가 아니라는 것이다.

순수 모델은 OOF로 검증해야 하고, public patch는 실제 제출 feedback을 이용해 매우 작은 row-level 차이를 추적해야 한다.

 

또한 점수가 오르지 않은 실험도 중요하다. 이번에는 broad feature, stacker, boundary specialist가 모두 최종 개선으로 이어지지는 않았다. 하지만 그 덕분에 현재 pure model 기준이 명확해졌고, public LB 쪽에서는 STAR->GALAXY가 어디까지 유효한지 확인할 수 있었다.

 

현재 public score는 0.97141이다.

다음 목표는 단순히 row를 더 많이 바꾸는 것이 아니라, 0.97141 plateau를 깨는 새 transition을 찾는 것이다.

가장 먼저 확인할 후보는 QSO->GALAXY의 id 796433이다. 이 row가 public score를 움직이면, 다음 연구 방향이 조금은 더 괜찮아 질 것 같다.

'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 연구 기록 1일차 (현재 Public 8등)  (0) 2026.06.09
'6. 경진 대회 (kaggle, dacon 등)/6-1 연구 및 개선 기록' 카테고리의 다른 글
  • [개인 경진 대회] Kaggle Playground Series S6E6 연구 (4) 그래프 분석편
  • [개인 경진 대회] Kaggle Playground Series S6E6 연구 기록 3일차
  • [개인 경진대회] DACON - 성균관대 멀티모달 AI 챌린지 (6): 채점 구조 역공학과 commit recovery
  • [개인 경진 대회] Kaggle Playground Series S6E6 연구 기록 1일차 (현재 Public 8등)
고니3000원
고니3000원
프로젝트의 구현 과정과 기술적 노하우를 담았습니다. AI 모델 연구와 매일의 학습 기록을 차곡차곡 공유하고 있습니다.
  • 고니3000원
    곤이의 공부 블로그
    고니3000원
  • 전체
    오늘
    어제
    • 분류 전체보기 (231)
      • 1. AI 논문 + 모델 분석 (22)
        • AI 논문 분석 (13)
        • AI 모델 분석 (9)
      • 2. 자료구조와 알고리즘 (16)
        • 2-1 자료구조와 알고리즘 (13)
        • 2-2 강화학습 알고리즘 (3)
      • 3. 자습 & 메모(실전, 실습, 프로젝트) (27)
        • 3-1 문제 해석 (4)
        • 3-2 메모(실전, 프로젝트) (14)
        • 3-3 배포 실전 공부 (7)
        • 3-4 최신 기술 분석 (2)
      • 4. [팀] 프로젝트 및 공모전 (31)
        • 4-1 팀 프로젝트(메모, 공부) (1)
        • 4-2 Meat-A-Eye (6)
        • 4-3 RL-Tycoon-Agent (3)
        • 4-4 구조물 안정성 물리 추론 AI 경진대회(D.. (4)
        • 4-5 AgentShield(보안 플랫폼) (17)
      • 5. [개인] 프로젝트 및 공모전 (25)
        • 4-1 귀멸의칼날디펜스(자바스크립트 활용) (5)
        • 4-2 바탕화면 AI 펫 프로그램 (4)
        • 4-3 개인 프로젝트(기타) (3)
        • 4-4 공모전 (9)
        • 4-5 나만의 로컬 LLM 멀티 에이전트 구축 (4)
      • 6. 경진 대회 (kaggle, dacon 등) (12)
        • 6-1 연구 및 개선 기록 (11)
        • 6-2 공유 코드 분석하기 (1)
      • 개념 정리 step1 (32)
        • Python 기초 (7)
        • DBMS (1)
        • HTML | CSS (3)
        • Git | GitHub (1)
        • JavaScript (5)
        • Node.js (5)
        • React (1)
        • 데이터 분석 (6)
        • Python Engineering (3)
      • 개념 정리 step2 (60)
        • Machine | Deep Learning (15)
        • 멀티모달(Multi-modal) (23)
        • 강화 학습 (10)
        • AI Agent (9)
        • 메디컬 이미지 (3)
      • 개인 공부 - 내가 공부하고 싶은 모든 것 (3)
        • 1. 인프라 (2)
        • 2. 자율주행 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Notion-포트폴리오
    • Github
  • 공지사항

    • 나의 핵심 가치
  • 인기 글

  • 태그

    API
    github
    공모전
    paddleocr
    llm
    자바스크립트
    자료구조
    Ai
    강화학습
    파이썬
    파인튜닝
    Agent
    인공지능
    transformer
    학습
    Vision
    RAG
    Lora
    전처리
    Python
    Ollama
    pandas
    알고리즘
    구현
    OCR
    데이터분석
    프로젝트
    ViT
    연구
    논문 리뷰
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고니3000원
[개인 경진 대회] Kaggle Playground Series S6E6 연구 기록 2일차
상단으로

티스토리툴바