[개인 경진 대회] Kaggle Playground Series S6E6 연구 (4) 그래프 분석편

2026. 6. 17. 15:34·6. 경진 대회 (kaggle, dacon 등)/6-1 연구 및 개선 기록
퍼블릭용 X 일반화 성능 O 파일 이름 제출 성능
6월 17일 boundary_pair_calibrated_submission.csv 0.96703
     
     

 

안녕하세요!

오늘도 캐글 Playground Series S6E6에 대해서 연구 블로그를 작성해볼까 합니다.

 

다른 경진 대회도 신경 쓰느라 분석을 제대로 못한 거 같아. 시간을 충분히 가지고 제대로 분석을 해봤습니다.

역시 AI의 꽃은 그래프 분석인거 같습니다. 그래프를 보니 어디가 잘못되고 있었는지 확실히 알게 되었습니다.

 

그럼 시작해볼게요!! 아, 그리고 제 연구용 블로그는 가설과 개인 의견이 굉장히 많이 포함되어 있습니다. 틀릴 수도 있단 점 참고 부탁합니다!

 

전 블로그: https://pak1010pak.tistory.com/251

 

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

안녕하세요. 이번 글에서는 Kaggle Playground Series S6E6 대회에서 진행한 세 번째 연구 기록을 정리하겠습니다. 이전 글 이후의 시작점은 public score 0.97141이였습니다. 그때까지는 모델 확률과 local evide

pak1010pak.tistory.com


그래프 출력하기

AI한테 처음에 로그창을 맡기고 다른 작업을 하면서 하느라 이상한걸 못느꼈습니다. 결국엔 성능이 올라가고 있었거든요.

[17:01:34] QSO:GALAXY fold 1 binary_balanced_accuracy=0.984601 best_iteration=250
[17:01:34] QSO:GALAXY fold 2/5 train_pair_rows=395698 valid_pair_rows=98925
[50]    valid_0's binary_logloss: 0.162101
[100]   valid_0's binary_logloss: 0.0716321
[150]   valid_0's binary_logloss: 0.0522195
[200]   valid_0's binary_logloss: 0.0480213
[250]   valid_0's binary_logloss: 0.0471669

이것도 중간에 수정을 통한 로그이긴 합니다. 보시면 best_iteration=250가 보입니다. 

(.venv) ...MacBookPro Kaggle_Predicting_Stellar_Class % python scripts/... --fold-limit 5 --n-estimators 250 --early-stopping-rounds 60 --learning-rate 0.028 --num-leaves 32 --max-depth 5 ... --diagnostic-period 25

AI가 iteration을 250까지 설정했는데, 모델 학습까지 logloss 베스트가 250까지 내려갔습니다. (처음엔 900으로 설정되어 있었음...)

그래서 구현을 1500까지 늘려봐도 여전히 logloss는 내려갔습니다.

보시는거와 같이 logloss가 낮아진다고 일반화 성능이 좋아지는게 아니다가 그래프상으로 명확하게 보였습니다.

로그로스는 250이든 1500이든 내려갔고, acc에서 차이가 명확하게 나타났습니다.

fold 900일 때 1500 진행 로그
GALAXY:STAR fold 1 0.971007 0.969924
GALAXY:STAR fold 2 0.967916 0.966725
GALAXY:STAR fold 3 0.971045 0.969998

 

즉 모델이 확률값은 더 부드럽게 맞추는 것처럼 보이는데, 실제로 원하는 class decision 성능은 떨어지고 있습니다. 이건 “logloss 최적화와 balanced accuracy 최적화가 어긋난 상황”입니다.

logloss는 900까지 계속 좋아지는데, balanced accuracy는 평균적으로 100 근처가 최고입니다. 그러니까 지금 모델은 오래 학습할수록 확률 보정은 좋아지지만, 우리가 원하는 class decision 성능은 나빠집니다.

 

그래서 이번에는 단순히 n_estimators를 줄이는 것에서 끝내지 않고, 실제로 여러 config를 나눠서 실험해봤습니다.

 

이번 실험의 핵심은 전체 3-class 모델을 다시 만드는 것이 아니라, 기존 pure model이 헷갈리는 GALAXY와 STAR 경계만 따로 보정하는 것이었습니다.

 

중요한 점은 이 실험은 public submission CSV를 학습에 사용한 것이 아닙니다.
기존 일반화 모델에서 만든 OOF probability와 train/test feature를 이용해서, GALAXY:STAR 경계만 별도로 학습했습니다.

즉 목적은 public leaderboard를 억지로 맞추는 것이 아니라, OOF 기준으로 실제 일반화 성능이 오르는지 보는 것이었습니다.

그래프를 보면 train과 valid가 같이 움직이길래, 혹시 validation data도 학습에 들어간 것 아닌가 의심이 들었습니다.
하지만 코드를 다시 확인해보면 validation data가 gradient 학습에 들어간 것은 아니었습니다.

 

학습에는 train fold만 들어가고, validation fold는 eval_set으로 들어가서 logloss 측정, early stopping, diagnostic 계산에만 사용됩니다. 다만 여기서 조심할 점은 있습니다.

validation으로 best iteration을 고르는 것도 일종의 모델 선택입니다.


그래서 fold별 validation balanced accuracy가 가장 좋은 iteration을 그대로 쓰면 OOF가 약간 낙관적일 수도 있습니다.

그래서 이번에는 더 보수적으로 fixed iteration 실험을 했습니다.

 

그래프상 GALAXY:STAR는 75 iteration 근처에서 validation balanced accuracy가 가장 좋아 보였기 때문에, prediction_iteration을 75로 고정해서 검증했습니다.

 

이번에 돌린 실험은 크게 4개였습니다.

실험 OOF delta 변경 row 방향
gs_fixed075_mid_capacity +0.00008990 984 GALAXY -> STAR
gs_fixed100_thr046_062_regA +0.00008575 310 GALAXY -> STAR
gs_fixed075_stronger_reg +0.00008063 466 GALAXY -> STAR
gs_fixed075_thr046_062_regA +0.00007571 377 GALAXY -> STAR

전부 OOF는 올랐습니다.

 

하지만 제가 제출 후보 기준으로 잡은 +0.0001은 넘지 못했습니다.
그래서 accepted_as_candidate는 false입니다. 이 부분은 아쉽지만, 그래도 굉장히 중요한 결과라고 생각합니다.

왜냐하면 4개 실험이 전부 같은 방향을 가리키고 있기 때문입니다.

 

모두 GALAXY -> STAR 보정이었습니다.
즉 기존 pure model은 특정 구간에서 GALAXY를 조금 과하게 예측하고 있었고, 그중 일부를 STAR로 바꾸면 balanced accuracy가 올라갔습니다.

특히 가장 좋았던 실험은 gs_fixed075_mid_capacity였습니다.

항목 값
fixed iteration 75
num_leaves 40
max_depth 6
min_child_samples 260
reg_alpha 0.6
reg_lambda 10
변경 row 984
OOF delta +0.00008990

여기서 재미있는 점은 너무 강하게 regularization을 건 실험보다, 약간 더 모델 용량을 준 mid capacity가 더 좋았다는 것입니다.

처음에는 과적합을 막으려고 모델을 더 보수적으로 만드는 것이 무조건 좋을 줄 알았는데, 실제 결과는 그렇지 않았습니다.
GALAXY:STAR 경계는 어느 정도 복잡한 패턴을 잡아야 하는 것 같습니다.

다만 너무 오래 학습하면 안 됩니다.

 

앞에서 본 그래프처럼 logloss는 계속 좋아지지만, balanced accuracy는 오히려 꺾일 수 있습니다.
그래서 이 문제에서는 logloss를 최종 목표로 보면 안 되고, 대회 metric인 balanced accuracy를 직접 기준으로 봐야 합니다.

이번 실험을 통해 제일 크게 배운 점은 이겁니다.

  1. logloss가 낮아진다고 대회 점수가 좋아지는 것은 아니다.
  2. train/valid 교차점을 찾는 것이 아니라, validation balanced accuracy가 가장 높은 지점을 봐야 한다.
  3. GALAXY:STAR 경계는 실제로 일반화 성능 개선 여지가 있다.
  4. QSO:GALAXY보다 GALAXY:STAR 쪽이 현재는 훨씬 중요하다.
  5. 단순히 row를 바꾸는 것이 아니라, OOF에서 검증된 boundary rule만 써야 한다.

그리고 이번 실험은 전체 57만 row를 모두 binary 학습에 넣은 것은 아닙니다.

GALAXY:STAR boundary model은 GALAXY와 STAR row만 사용합니다.
QSO는 이 binary 학습에서는 제외됩니다.

대략적으로 fold마다 이런 크기였습니다.

boundary train pair rows valid pair rows
GALAXY:STAR 약 368,000 약 92,000
QSO:GALAXY 약 395,000 약 99,000

그래도 pair 기준으로는 수십만 row이기 때문에, 작은 데이터셋처럼 모델을 크게 잡으면 안 된다고 생각했습니다.
그래서 num_leaves, max_depth, min_child_samples, reg_lambda 등을 조정하면서 실험했습니다.

이번 그래프도 다시 개선했습니다.

처음 만든 그래프는 x축 숫자가 너무 부족했고, y축도 보기 불편했습니다.
그래서 실험 비교용 그래프와 best run 분석 그래프를 따로 만들었습니다.

이번에 새로 만든 그래프는 다음을 확인하기 위한 것입니다.

  1. 각 실험의 OOF delta가 얼마나 차이 나는지
  2. +0.0001 후보 기준선에 얼마나 가까운지
  3. best run에서 train과 valid balanced accuracy가 어떻게 움직이는지
  4. logloss와 balanced accuracy가 실제로 어긋나는지

이제 다음 가설:

현재 최고 실험이 +0.00008990까지 왔기 때문에, 아주 조금만 더 개선하면 +0.0001 기준을 넘을 수 있습니다.

다음에는 gs_fixed075_mid_capacity 주변을 더 세밀하게 파볼 예정입니다.

 

특히 threshold가 0.47 근처에서 잡혔기 때문에, GALAXY -> STAR 후보를 조금 더 넓히는 실험이 필요합니다.
그리고 regularization도 reg_lambda 10 근처에서 한 번 더 조정해볼 필요가 있어 보입니다.

 

지금 단계에서 제가 생각하는 다음 실험 방향은 다음과 같습니다.

  1. threshold 범위를 더 낮춰서 GALAXY -> STAR 후보를 넓혀보기
  2. mid_capacity에서 reg_lambda를 8 정도로 낮춰보기
  3. fixed iteration 50, 75, 100을 비교하기
  4. OOF delta가 +0.0001을 넘을 때만 submission 후보로 인정하기

아직 최종 제출 파일을 만든 단계는 아닙니다.

하지만 이전처럼 public score만 보고 row를 바꾸는 방식이 아니라, 이제는 OOF 그래프와 boundary specialist를 통해 실제 일반화 성능을 조금씩 올리는 방향으로 가고 있습니다.

 

개인적으로는 여기서 처음으로 “진짜 모델 개선 실험을 하고 있다”는 느낌이 들었습니다.
점수 자체는 아직 작지만, 방향이 한쪽으로 반복해서 나오는 것은 꽤 중요한 신호라고 생각합니다.


 

 

이 블로그는 이 연구가 마무리 될 때까지 계속 이어질 것 입니다 (추후 업데이트)

 

2026-06-19 Single Model Import Notes 기준 메모장

현재 판단 기준: 공유 노트북들을 더 가져와서 분석을 해보았다. 모두들 블랜딩 수법을 써서 (메달을 받기 위한 리더보드 갱신용.) 필요한 코드나 유용한 코드를 찾기 힘들었다. -> 토크에도 올라오는걸 보니 실제로 캐글에서 이런 문제들이 많은가보다.

 

공유된 단일 모델 노트북을 확인한 결과, 우리 단일 모델 성능이 낮은 핵심 이유는 알고리즘 이름 자체가 아니라 feature 구조와 학습 구조 차이가 있었다. 분석한 내용을 토대로 블로그를 이어서 작성을 할 것이다.

현재 우리 직접 학습 결과:

  • LightGBM: OOF 약 0.965704
  • XGBoost: OOF 약 0.965721
  • CatBoost 짧은 run: OOF 약 0.965082
  • CatBoost long depth8: OOF 약 0.965103
  • CatBoost long depth7: OOF 약 0.965247

상위권 단일 모델 기준:

  • RealMLP v5: CV 약 0.96904
  • CatBoost v3: CV 약 0.96897
  • one-vs-rest XGB: CV 약 0.96862
  • one-vs-rest TabM: CV 약 0.96862
따라서 지금 차이는 반복 수만으로 해결되지 않는다.

상위권 단일 모델에서 확인한 핵심 장치

숫자를 구간값으로 다시 보기

alpha, delta, u, g, r, i, z, redshift를 그대로만 쓰지 않고 정수 구간, 분위수 구간, 조합 구간으로 바꾼다.

이유:

  • 나무 모델과 신경망 모두 특정 경계 구간을 더 쉽게 잡는다.
  • 별/은하/퀘이사 경계는 연속적인 숫자 크기보다 특정 색과 적색편이 구간에서 갈리는 경우가 많다.

색 차이와 밝기 형태를 더 강하게 쓰기

중요 feature:

u-g, g-r, r-i, i-z
u-r, g-i, r-z
mag_mean, mag_range
g / redshift, i / redshift

이유:

  • 천문 데이터에서는 단일 band 밝기보다 band 사이 차이가 물리적으로 더 직접적인 신호다.
  • 같은 색이라도 redshift 위치에 따라 의미가 달라진다.

위치와 밝기의 조합 범주 만들기

중요 조합:

alpha_floor x delta_floor
u_floor x z_floor

이유:

  • 각각 따로 보면 약한 feature라도 조합하면 class별 밀집 구간이 생긴다.
  • 상위권 RealMLP는 이 조합을 fold-safe target encoding 재료로 사용했다.

fold-safe target encoding

범주값마다 class 비율을 숫자로 바꾸는 방식이다.

주의:

  • 전체 train 정답을 한 번에 보면 누수다.
  • 반드시 fold 안에서만 통계를 만들고 validation에는 transform만 해야 한다.

현재 상태:

  • 아직 우리 코드에 완전 이식하지 않았다.
  • 이번 밤샘 run은 먼저 target을 쓰지 않는 non-leaky feature부터 넣는다.
  • 다음 단계에서 fold-safe target encoding을 별도 helper로 추가한다.

one-vs-rest 구조

3개 클래스를 한 모델이 한 번에 맞히는 대신, class별로 “이 class인가 아닌가”를 따로 학습한다.

이유:

  • GALAXY, QSO, STAR의 오류 경계가 서로 다르다.
  • 특히 GALAXY <-> STAR, QSO <-> GALAXY 경계는 다른 모델이 필요할 수 있다.

현재 상태:

  • CatBoost one-vs-rest는 이미 간단 구현이 있다.
  • XGBoost/TabM one-vs-rest는 아직 직접 구현하지 않았다.
  • 이번 run에는 CatBoost one-vs-rest + RealMLP식 feature를 먼저 넣는다.

CatBoost long run 해석

CatBoost long depth7이 가장 좋았다.

  • OOF: 0.965247
  • depth8 long보다 약간 좋음
  • 기존 짧은 run보다 약간 좋음

하지만 그래프상 검증 균형정확도는 중반 이후 거의 평평하다.

  • 최고 지점 저장은 제대로 된다.
  • 더 긴 반복만으로 0.968+까지 가기는 어렵다.
  • 상위권 CatBoost v3와의 차이는 feature, 범주화, 외부 SDSS 낮은 가중치 학습 구조다.

실험 목표

이번 run의 목적은 public 점수 올리기가 아니다. 목표는 다음과 같이 정리했다.

  1. RealMLP v5식 non-leaky feature를 공통 feature builder에 추가한다.
  2. LightGBM, XGBoost, CatBoost에 같은 feature를 넣어 직접 비교한다.
  3. CatBoost one-vs-rest에도 같은 feature를 넣는다.
  4. 새로 만든 OOF/test probability를 기존 prediction bank와 함께 stacker에 넣는다.
  5. 결과는 OOF, fold 안정성, class recall, 추후 SDSS external 기준으로 판단한다.

승격 기준:

OOF가 기존 reliable anchor 0.9703513342698414를 넘거나, OOF가 비슷하더라도 fold 안정성과 class recall 균형이 좋아야 한다.

 

보류 기준:

  • OOF가 올라도 특정 class recall이 크게 깨지는 경우
  • SDSS external에서 확실히 악화되는 경우
  • public LB만 좋아지고 OOF 근거가 약한 경우

남의 코드를 가져와서 계속 보니깐 연구 방향이 조금씩 제대로 잡히기 시작했다. CV/OOF 기준을 정확히 구현하고, 그걸 기준으로 계속해서 시도중이다.

'6. 경진 대회 (kaggle, dacon 등) > 6-1 연구 및 개선 기록' 카테고리의 다른 글

[개인 경진대회] DACON - 성균관대 멀티모달 AI 챌린지 (마무리1) - Private 1등  (0) 2026.06.25
[개인 경진 대회] Kaggle Playground Series S6E6 연구 (5): RealMLP 피처 뱅크 실험 기록  (0) 2026.06.19
[개인 경진 대회] 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
'6. 경진 대회 (kaggle, dacon 등)/6-1 연구 및 개선 기록' 카테고리의 다른 글
  • [개인 경진대회] DACON - 성균관대 멀티모달 AI 챌린지 (마무리1) - Private 1등
  • [개인 경진 대회] Kaggle Playground Series S6E6 연구 (5): RealMLP 피처 뱅크 실험 기록
  • [개인 경진 대회] Kaggle Playground Series S6E6 연구 기록 3일차
  • [개인 경진대회] DACON - 성균관대 멀티모달 AI 챌린지 (6): 채점 구조 역공학과 commit recovery
고니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
  • 공지사항

    • 나의 핵심 가치
  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고니3000원
[개인 경진 대회] Kaggle Playground Series S6E6 연구 (4) 그래프 분석편
상단으로

티스토리툴바