DACON · 2026
모기 궤적 예측 대회 회고
80ms 뒤 좌표를 1cm 안에 넣는 물리 기반 예측
이 대회는 과거 400ms 동안 관측된 3D 비행 궤적을 보고, 지연 시간 이후인 +80ms 시점의 모기 위치를 예측하는 문제였다. 평가 기준은 예측 좌표가 실제 좌표에서 1cm 안에 들어오는지였다. 평균 오차를 조금 줄이는 것보다, 실제 타격 반경 안으로 얼마나 많이 넣는지가 훨씬 중요했다.
최종 결과는 785팀 중 117등, 최고 score 0.6886이었다. 1등 score 0.7036과 비교하면 아직 차이가 있지만, baseline 0.4848에서 시작해 물리 기반 전처리와 selector 구조, 정렬 오류 디버깅을 거치며 꽤 멀리 올라간 프로젝트였다.
문제를 어떻게 봤나
처음에는 이 문제를 일반적인 3D regression으로 볼 수 있다. 과거 11개 좌표를 넣고, 다음 좌표를 직접 예측하는 식이다. 하지만 metric이 R-Hit@1cm라면 관점이 조금 달라진다. 모델이 전체 평균 오차를 낮추더라도, 1cm 경계 바깥으로 조금씩 밀리면 점수는 바로 손해를 본다.
그래서 이 문제는 "미래 좌표 하나를 정확히 맞히는 회귀"이면서 동시에 "물리적으로 가능한 후보 궤적 중 정답에 가까운 것을 고르고, 1cm 경계 안으로 미세 조정하는 문제"에 가까웠다.
점수를 끌어올린 것들
| 단계 | LB | 핵심 변화 |
|---|---|---|
| Baseline | 0.4848 | tabular 시계열 feature와 GBDT baseline |
| Isotropic scaling | 0.5594 | 3D 좌표축 비율을 보존하는 전처리 |
| Physics-informed selector | 0.6852 | 물리 후보 궤적 selector로 0.68대 진입 |
| Target leak / reindexing fix | 0.6882 | ID 기반 merge와 sample submission 재정렬 |
| 5-cohort blend | 0.6886 | 속도 구간별 Dirichlet ensemble |
Isotropic scaling
처음에는 x, y, z를 각각 표준화하는 평범한 전처리를 썼다. 그런데 3D 물리 좌표에서는 이게 문제가 됐다. 축별 분산이 다르다고 각 축을 따로 맞춰버리면, 모델이 보는 공간의 비율이 실제 유클리드 공간과 달라진다. 특히 z축의 작은 편차가 과하게 부풀어 오차 구조가 왜곡될 수 있었다.
해결은 좌표축을 따로 표준화하지 않고, 3D 전체에 하나의 global scale을 적용하는 쪽이었다. 말하자면 모델에게 "진짜 공간의 모양"을 덜 망가뜨려 보여준 셈이다. 이 변화만으로도 baseline 구간을 꽤 크게 넘어섰다.
Physics-informed selector
가장 큰 도약은 직접 regression만 하던 관점에서 벗어난 것이다. 모기의 과거 비행 궤적을 보고 물리적으로 가능한 후보 궤적들을 만들고, 모델이 그중 정답에 가까운 후보를 고르게 했다.
repo의 분석 문서에서는 이 패러다임을 Regression -> Selection + Micro-Correction으로 정리했다. 후보에는 등속 직선 운동, 가속도 유지, Frenet-Serret frame 기반 회전, jerk, latency 계열이 포함됐다. 이후 tiny correction net으로 1cm 경계 부근의 오차를 미세하게 보정했다.
이 접근이 좋았던 이유는 모델이 허공으로 크게 튀는 외삽을 덜 하게 만들었기 때문이다. 데이터만 보고 연속 좌표를 뱉는 모델보다, 물리적으로 그럴듯한 후보 안에서 고르게 하는 구조가 metric과 더 잘 맞았다.
Permutation leak 디버깅
가장 아찔했던 문제는 로컬 검증과 리더보드가 갑자기 벌어진 순간이었다. 예측 좌표의 개수와 값은 정상처럼 보이는데, 제출 점수가 급락했다. 원인은 모델이 아니라 행 정렬이었다.
분산 실행과 후처리 과정에서 고유 ID와 예측 좌표의 매칭이 미묘하게 뒤틀렸다. 좌표값 자체는 그럴듯하지만, 다른 sample의 좌표를 제출하면 metric은 당연히 무너진다. 이 문제를 해결하기 위해 마지막 단계에서 ID 기반 pd.merge와 sample_submission.csv 기준 재정렬을 강제했다.
이건 꽤 중요한 교훈이었다. competition에서는 모델이 틀릴 수도 있지만, 파이프라인이 틀릴 수도 있다. 특히 좌표 예측처럼 row alignment가 절대적인 문제에서는 제출 파일 검증이 모델 성능만큼 중요하다.
회고
이 대회에서 재미있었던 점은, 성능 개선이 "더 복잡한 모델"이 아니라 "문제를 물리적으로 더 정확히 보는 방식"에서 나왔다는 것이다. 모기는 생물이고 궤적은 3D 물리 공간에 있다. 그 사실을 전처리, 후보 생성, 후처리, ensemble에 계속 반영할수록 점수가 좋아졌다.
아쉬운 점도 있다. 최종 117등은 나쁘지 않지만, 1등권과의 차이를 줄이려면 후보 selector를 더 안정적으로 학습하거나, 1cm 경계 부근의 boundary sample을 더 정교하게 다뤄야 했을 것 같다. 또 대회 중간에 정렬 오류를 잡는 데 시간이 꽤 들었는데, 처음부터 submission contract test를 더 강하게 만들었으면 시행착오를 줄일 수 있었다.
다음에 비슷한 3D trajectory 문제를 한다면 다음을 먼저 챙길 것이다.
- 제출 파일 row alignment 테스트를 초반부터 자동화한다.
- 좌표축별 독립 scaling이 metric 공간을 왜곡하는지 먼저 본다.
- 순수 regression baseline과 physics-informed candidate selector를 초반부터 같이 비교한다.
- metric 경계 근처 sample을 별도 분석한다.
- 속도/가속도 regime별로 모델 강점이 다른지 early stage부터 기록한다.
이 프로젝트는 "AI 대회에서 도메인 물리를 어떻게 모델링에 넣을 수 있는가"를 보여주는 좋은 사례로 남았다. 점수도 중요했지만, 더 오래 남은 건 1cm metric에 맞춰 문제를 다시 해석했던 과정이다.
더 읽을거리
- 상세 기술 백서와 실험 기록은 repo README와 docs에 남겨 두었다.
- 이 글은 3D 물리 공간, metric 해석, 정렬 오류 디버깅, physics-informed selector 중심으로 요약했다.
- 특히
sample_submission.csv기준 재정렬과 ID 기반 merge는 이후 대회에서도 계속 재사용할 만한 제출 안정성 패턴이다.