이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.
핵심 요약
복잡한 딥러닝 모델보다 과거의 우수한 베이스라인을 분석하여 불필요한 제약을 제거하고, 데이터의 통계적 특성을 잘 반영한 심플한 모델이 변동성이 큰 환경에서 더 강력한 성능을 발휘했다.
배경
매년 열리는 NCAA 대학 농구 토너먼트(March Madness) 결과를 예측하는 Kaggle 경진대회에서 1위를 차지한 RustyB의 우승 사례이다.
대상 독자
머신러닝 경진대회 참여자 및 스포츠 데이터 분석에 관심 있는 개발자
의미 / 영향
이 솔루션은 도메인 지식이 부족하더라도 데이터의 통계적 특성과 기존 우수 사례를 철저히 분석하면 전문 데이터 사이언티스트를 능가하는 성과를 낼 수 있음을 보여준다. 특히 노이즈가 많은 분야에서는 복잡한 딥러닝보다 심플하고 견고한 XGBoost 모델이 실전에서 더 높은 신뢰도를 제공한다.
챕터별 상세
00:00
배경 및 자기소개
RustyB(Steve Bratz)는 전문 데이터 사이언티스트가 아닌 공인회계사(CPA)로 활동하며 취미로 Kaggle에 참여해왔다. 엑셀로 처리하기 힘든 대용량 회계 데이터를 다루기 위해 Python과 Pandas를 업무에 활용하며 데이터 분석 역량을 쌓았다. 이번 대회 우승을 통해 Kaggle Expert 등급과 함께 금, 은, 동메달을 모두 보유하게 되었다.
- •비전공자로서 실무에서 익힌 Python 기술을 경진대회에 적용했다
- •회계 감사 업무의 디테일한 분석 습관이 모델 개선에 기여했다
02:18
모델 개요 및 성능
2018년 우승자 Raddar의 모델을 기반으로 한 XGBoost 모델을 사용했다. 전체 모델 실행 시간은 230초(약 4분) 미만으로 매우 효율적이며 가벼운 구조를 가졌다. 복잡한 아키텍처 대신 소수의 핵심 피처를 활용하여 모델의 견고함을 유지했다.
- •XGBoost를 활용한 고속 추론 모델을 구축했다
- •4분 이내에 전체 학습과 예측이 완료되는 효율성을 확보했다
03:05
피처 엔지니어링 전략
총 45개의 피처를 사용했으며 대부분 정규 시즌 경기 결과의 평균값이다. 팀 간의 시드 차이(Seed Diff), 각 팀의 시드 번호, 팀 퀄리티(Team Quality), 정규 시즌 득점 차이 평균 등이 주요 변수로 포함됐다. 특히 최근 14일간의 승률을 통해 팀의 상승세를 반영하는 피처를 추가했다.
- •정규 시즌 데이터를 평균 내어 팀의 기초 전력을 수치화했다
- •시드 차이와 팀 퀄리티를 가장 중요한 예측 인자로 활용했다
04:20
변수 중요도 분석
SHAP 값을 통해 분석한 결과 시드 차이가 예측 결과에 가장 압도적인 영향력을 미쳤다. 그 뒤를 이어 팀 퀄리티와 정규 시즌 득점 차이 평균이 주요 변수로 확인됐다. 턴오버(Turnover) 관련 지표들은 다른 변수들에 비해 상대적으로 낮은 중요도를 보였다.
- •SHAP 분석으로 모델의 판단 근거를 시각화하고 검증했다
- •시드 차이가 승패 예측의 가장 강력한 지표임을 확인했다
06:41
학습 방법 및 데이터 구성
Cauchy 커스텀 손실 함수를 적용한 XGBoost 모델을 학습시켰다. 타겟 변수는 두 팀 간의 점수 차이를 기반으로 설정했다. 서로 다른 랜덤 스테이트(Random State)로 3번 학습한 모델의 예측값을 평균 내어 최종 제출물을 생성함으로써 결과의 변동성을 줄였다.
- •Cauchy Loss를 사용하여 이상치에 강건한 모델을 만들었다
- •3개 모델의 앙상블을 통해 예측 안정성을 높였다
python
import xgboost as xgb
# Cauchy custom loss function
def cauchy_loss(preds, dtrain):
labels = dtrain.get_label()
c = 5000 # Constant for Cauchy distribution
x = preds - labels
grad = x / (x**2 + c**2)
hess = (c**2 - x**2) / (x**2 + c**2)**2
return grad, hess
# Model training with different random states
seeds = [42, 123, 999]
final_preds = []
for s in seeds:
model = xgb.train(params, dtrain, num_boost_round=100, obj=cauchy_loss, seed=s)
final_preds.append(model.predict(dtest))
# Averaging predictions
submission = sum(final_preds) / len(final_preds)Cauchy 커스텀 손실 함수를 정의하고 서로 다른 시드값으로 학습된 모델의 결과를 앙상블하는 핵심 로직
08:21
2018년 베이스라인의 개선 사항
Raddar의 2018년 R 코드를 Python 버전으로 변환하여 사용하며 몇 가지 핵심적인 수정을 가했다. 팀 퀄리티 계산 시 무한대 값을 유발하던 지수 함수(np.exp)를 제거하여 모델의 수치적 안정성을 확보했다. 또한 상위 시드 팀이 하위 시드 팀을 무조건 이긴다고 가정하는 강제 오버라이드 로직을 삭제하여 모델이 데이터에 기반해 판단하도록 했다.
- •수치적 불안정성을 유발하는 지수 함수 계산을 제거했다
- •인위적인 규칙(Override)을 없애고 순수하게 모델의 예측을 신뢰했다
14:30
결과 분석 및 Q&A
이번 대회는 남녀 토너먼트가 통합된 첫 사례였으며 여성부 경기의 낮은 이변 발생률이 모델 안정성에 기여했다. RustyB는 여성부 예측에서 99.9 퍼센타일의 성적을 거둔 반면 남성부에서는 50 퍼센타일에 머물렀으나 통합 점수에서 1위를 차지했다. 단순히 복잡한 모델을 만드는 것보다 데이터의 특성을 이해하고 검증된 로직을 적절히 수정하는 것이 승리의 열쇠였다.
- •남녀 통합 대회 특성을 활용하여 여성부의 안정적인 예측으로 승기를 잡았다
- •복잡한 딥러닝보다 정교하게 튜닝된 통계 모델이 효과적임을 입증했다
실무 Takeaway
- 과거의 우승 솔루션을 분석하여 현재 데이터에 맞게 리팩터링하고 불필요한 제약 조건을 제거하는 것만으로도 강력한 베이스라인을 구축할 수 있다.
- SHAP 분석을 통해 모델이 시드 차이와 팀 퀄리티에 의존한다는 사실을 파악하고 해당 피처의 데이터 품질을 개선하는 데 집중했다.
- 변동성이 큰 스포츠 데이터에서는 단일 모델보다 여러 랜덤 시드를 활용한 평균(Ensemble) 방식이 순위 방어에 유리하다.
- 수치 계산 중 발생하는 무한대(Infinite) 값이나 이상치를 유발하는 함수를 제거하여 모델의 수렴 안정성을 높였다.
AI 분석 전체 내용 보기
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
원문 발행 2026. 02. 25.수집 2026. 02. 25.출처 타입 YOUTUBE
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.