Tier.SC에서는, 플레이어 실력과 매치업별 승률 등을 두 층의 모델을 기반으로 추정한다.
즉, Bradley-Terry(BT) 모델이 장기 실력 점수를 산출하고, LightGBM1 경사부스팅이 맥락(종족·맵·상대 등)을 반영한 승률을 예측한다.
데이터 개요 (2026-04 기준)
- 소스: ELOboard2에 기록된 스트리머의 경기 로그
- 전처리: 플레이어 정규화(닉네임 병합), 경기 중복 제거, 맵/종족 표준화
- 학습/검증 분할: 시계열 3-way 홀드아웃 (Train 60 / Calib 20 / Test 20) — 시간 기반 분리로 data leakage(정보누수) 원천 배제 + Calib 셋 early stopping과 Test 셋 성능 검증으로 overfitting(과적합) 제어
- 하이퍼파라미터 튜닝: Optuna(TPE)3로 LightGBM 탐색 — 상세는 아래 2층 섹션
두 층의 구성
1층 — Bradley-Terry 실력 모형
경기 결과 쌍 비교로 각 플레이어의 잠재 실력 점수 $\theta_i$를 추정한다. 승률은
$$P(i \text{ beats } j) = \sigma(\theta_i - \theta_j)$$
로 모형화되며, 최대우도로 추정된다.
- 장점: 매치 수가 불균형해도 전역 순위가 안정적
- 한계: 순수 BT만으로는 종족·맵 같은 컨텍스트를 직접 반영하지 못함
- 개선안: 종족 상성 BT와 맵 효과 BT를 별도 레이어로 붙여, 최종 피처
BT_base_prob_A는 선수 실력 + 종족 상성 + 맵 효과를 모두 반영한 기대승률로 2층 LightGBM에 투입. data leakage 방지를 위해cross_val_predict기반 OOF(out-of-fold) 예측으로 주입됨.
2층 — LightGBM 승률 예측
1층 BT 스코어를 피처 중 하나로 사용하고, 맵/종족/최근 폼/상대 전적 등 40개 피처로 승률을 예측한다. 학습 라벨은 하드 라벨(outcome ∈ {0, 1})이고, 출력은 Sigmoid 보정(Platt scaling)으로 확률의 캘리브레이션까지 맞춘다. 즉 시뮬레이터가 호출하는 2층은 Optuna로 튜닝한 하이퍼파라미터 위에서 LightGBM(Gradient Boosting Machine)이 학습한 결과다.
하이퍼파라미터 튜닝
- 교차검증:
TimeSeriesSplit5-fold — 시계열 순서를 보존하여 미래 누수를 차단. GroupKFold4 대안은 overfit_gap5이 악화되어 기각(상세는 지표 해석). - 탐색: Optuna 100 trials, TPE(Tree-structured Parzen Estimator) 샘플러. 수렴조건은
n_trials=100과timeout=600s중 먼저 도달하는 조건으로 제한한다. - 하이퍼파라미터 탐색 공간 (10개):
n_estimators,learning_rate,num_leaves,max_depth,min_child_samples,lambda_l1,lambda_l2,feature_fraction,bagging_fraction,bagging_freq. - 목적 함수: 폴드 평균 binary log_loss6 최소화. 확률 예측의 정밀도를 직접 최적화한다.
- 도메인 사전지식 주입 — monotone constraints:
BT_base_prob_A,recent_h2h_wr_A,total_matches_diff,total_win_rate_A,h2h_win_rate5개 피처에 단조 증가 제약을 걸어 "실력/유리한 신호가 커질수록 승률이 단조 증가"라는 상식을 모델에 강제한다. - 최종 모델: Optuna가 선택한
n_estimators를 시작점으로, Calib 셋 기반 early stopping(50 rounds) 으로 최종 트리 수를 확정. 현재 스냅샷은 ≈ 550 트리, 40 피처. - 최종 Sample weight: 시간 감쇠
0.9995^days_to_most_recent를 학습 셋에 적용해 오래된 경기의 영향을 완만히 줄인다.
학습 조건과 검증 철학
튜닝 파라미터 이전에 무엇을 보여주고 무엇을 가렸는지가 훨씬 중요하다. 모델이 "미래를 보고 과거를 맞추는" 일이 없도록 아래 네 원칙을 학습 파이프라인에 강제한다.
- 점수의 강제 초기화 — 모든 선수를 1000점에서 출발시킨다. 사전 편향 없이 관측된 경기 결과만으로 실력축을 재구성한다.
- Data Leakage 원천 배제 — 모델이 보는 피처는 "경기 시작 전에 알 수 있는 정보"로 국한한다. 상대전적, 최근 승률, 점수차 등. 경기 종료 후에만 확정되는 값을 피처에 섞으면 Test 성능은 오르지만 실전에서는 재현되지 않는다.
- 엄격한 시계열 3-way 홀드아웃 (60 / 20 / 20) — 시간 순 정렬 후 상위 80%를 Train 영역으로, 하위 20%를 Test로 떼어 둔다. Train 영역은 다시 75 : 25로 나눠 앞쪽 75%를 Train(60%), 뒤쪽 25%를 Calib(20%)로 쓴다. Calib 셋은 early stopping 기준과 Sigmoid(Platt) 보정 적합에 사용되고, Test 셋은 한 번도 학습·튜닝 과정에 노출되지 않는다. 예) 시즌(버전) 1~3을 과거(Train+Calib), 시즌(버전) 4를 미래(Test)로 두는 방식. TimeSeriesSplit 5-fold가 Train 영역 내부의 튜닝용 CV라면, 이 3-way 홀드아웃은 최종 성능 리포트의 기준선이다.
- Mathematical Symmetry를 이용한 데이터 증강 — 원본 고유 매치 약 49,000건을 A/B 관점 대칭으로 확장해 학습 행은 약 98,000건이 된다 (2026-04 스냅샷 기준, 데이터가 누적되면 비율 유지한 채 함께 증가).
증강이 noise가 아닌 이유 — Mathematical Symmetry
데이터 증강(augmentation)은 일반적으로 noise를 주입할 수 있다는 우려가 따르지만, 여기서의 대칭은 수학적 대칭(mathematical symmetry) 이다.
A가 B를 이겼다(Win = 1)는 사실은, 필연적으로 B는 A에게 졌다(Win = 0)를 동반한다.
즉 한 경기에 대해 양쪽 관점의 관측은 동일한 진실의 두 표현이다. 양 플레이어 시점에서 데이터를 학습시키는 것은 noise 주입이 아니라 decision boundary를 명확하게 하는 필수적 과정이고, 이를 통해 unbiased·robustness가 극대화된다. 오히려 한쪽 관점만 학습시키면 "A 위치/B 위치" 같은 인위적 축에 모델이 민감해지는 부작용이 생긴다.
자세한 지표와 해석은 지표 해석, 피처 기여는 SHAP 분석·Feature Importance에서 다룬다.
왜 LightGBM + Optuna인가 — 대안 검토
동일 계열의 대안인 XGBoost, CatBoost, 딥러닝 계열, 그리고 탐색 방식인 GridSearch/RandomSearch를 모두 검토한 끝에 현재 조합을 선택했다.
왜 LightGBM을 ML 모델로 선정했는가
(1) 비선형성(Non-linear) 해결. 스타크래프트 같은 RTS 게임의 승패는 단순한 ELO 점수 차이만으로 갈리지 않는다. 종족 상성, 맵 유불리, 최근 폼, 특정 상대와의 누적 히스토리 등 비선형·교호작용을 풀어내야 한다. 선형 회귀(LR) 모델은 이 구조를 표현할 수 없고, 부스팅 트리는 분할 기준 조합만으로 자연스럽게 교호작용을 학습한다.
(2) 최적의 효율성. 정형 데이터에 강력한 XGBoost·CatBoost까지 포함해 후보를 비교한 결과, 데이터 규모·학습 속도·메모리 효율을 종합하면 LightGBM이 가장 적합했다.
| 후보 | 채택 여부 | 핵심 판단 근거 |
|---|---|---|
| LightGBM | 채택 | Histogram-based leaf-wise 성장 → 학습·추론 모두 최단. JSON 직렬화 지원으로 Cloudflare Workers Edge 추론에 직접 얹을 수 있음. 본 데이터(수치형 위주 40 피처, 4.9만 매치)에서 성능 상단. |
| XGBoost | 기각 | 안정적이지만 학습 속도·메모리 면에서 무거움. Edge 배포 시 모델 로딩 비용이 더 큼. |
| CatBoost | 기각 | 범주형(문자열) 피처 native 처리가 강점이나, 본 데이터의 카테고리는 종족(3)·맵(수십 개) 수준으로 cardinality가 낮아 LabelEncoder로 충분. 수치형 위주의 데이터셋에서는 큰 이점이 없다. |
| Deep Learning (MLP·Transformer) | 기각 | 매치 5만 규모에서 학습 비용 대비 성능 향상 폭이 미미하고 과적합 위험이 큼. 해석성·Edge 배포 친화도 모두 트리 기반이 우위. |
요약하면 (a) 데이터 크기·피처 구성이 부스팅 트리의 스윗스팟, (b) Edge 배포에 최적, (c) 해석 도구(SHAP·Feature Importance)의 성숙도 — 세 축 모두에서 LightGBM이 가장 자연스러운 선택이었다.
왜 Optuna인가 — Efficiency와 Smart Search
LightGBM은 튜닝 파라미터가 많고 서로 복잡하게 얽혀 있다. 탐색 전략에 따라 같은 예산으로도 도달 지점이 크게 달라진다.
Optuna의 TPE가 수행하는 일 — 이전 trial들의 결과를 학습해 "좋은 파라미터가 있을 확률이 높은 곳"을 스스로 집중 탐색한다. 현재 설정은 trial 수(100)와 timeout(600초) 중 먼저 도달하는 조건으로 예산을 닫는 방식이며, Optuna 자체가 제공하는 pruning·distributed·study 영속화 등의 기능도 필요 시 추가 도입이 쉽다.
| 후보 | 채택 여부 | 핵심 판단 근거 |
|---|---|---|
| Optuna (TPE) | 채택 | 이전 trial 결과를 학습해 유망 구간을 집중 탐색. n_trials + timeout으로 예산 통제가 명확. TimeSeriesSplit과의 결합이 깔끔. |
| GridSearch | 기각 | 파라미터 10개 × 각 5~7값이면 수만 조합. 튜닝 예산 폭증. 과거 시도 정보 미활용. |
| RandomSearch | 기각 | Grid보다는 낫지만 과거 trial 정보를 활용하지 못함. 같은 예산에서 Optuna 대비 수렴 지점이 열위. |
| Bayesian Optimization (scikit-optimize) | 기각 | 개념은 유사하나 Optuna의 스튜디오 관리·pruner·distributed 등 실전 기능이 더 성숙. |
전문가를 위한 1줄 요약: Grid Search와 Random Search의 단점을 배제하다 보니 자연스럽게 도착한 튜닝 방법이 Optuna다.
100 trials로 수렴한 파라미터는 이후 ablation(하드 라벨 전환·OOF BT 주입 등)에서도 큰 재튜닝 없이 안정적으로 상위 구간을 유지했다 — 탐색 자체가 robust한 영역에 안착했다는 신호로 본다.
왜 이 구성이 현재 최선인가
- 해석 가능성 — BT 스코어가 순수 실력축을 고정하고, LightGBM이 그 위에 맥락 효과를 얹어 SHAP로 개별 기여를 설명 가능. 핵심 피처 5개에는 monotone constraints로 도메인 상식이 명시 주입되어 있어, 예측이 "실력이 낮은데 승률이 오른다" 같은 반직관적 방향으로 움직이지 않는다.
- 데이터 효율성 — 매치 5만 규모에서 딥러닝은 과적합 위험이 큼. LightGBM + 40 피처가 파라미터 수·해석성·정확도의 균형점.
- Edge 배포 친화 — 모델을 JSON으로 직렬화해 Cloudflare Workers에서 수 ms 내 추론.
향후 보강 방향
- 빌드 오더·APM 등 인게임 행동 피처 도입
- 시간 감쇠(time-decay) 고도화 — 현재 선형 감쇠(
0.9995^days)에서 시즌(버전) 경계 리셋형 가중으로 확장 - 확률적 앙상블 — BT 포스테리어 불확실성을 LGBM 출력과 결합
로드맵 상세: ML 로드맵
-
LightGBM — Microsoft가 공개한 경사부스팅(Gradient Boosting) 트리 기반 학습 라이브러리. 이전 트리들이 틀린 샘플의 잔차(residual)를 다음 트리가 이어 맞추는 방식으로 수많은 얕은 트리를 누적 학습해 비선형·교호작용을 표현한다. Histogram-based · leaf-wise 성장으로 XGBoost 대비 학습·추론이 빠르고 메모리가 가볍다. 수치형이 대부분인 정형 데이터(현 프로젝트 40 피처)에서 성능 상단이며, JSON 직렬화 지원으로 Cloudflare Workers Edge 추론에 직접 얹기 좋다. ↩
-
Optuna(TPE) — Optuna는 하이퍼파라미터 자동 탐색 프레임워크이고, TPE(Tree-structured Parzen Estimator) 는 그 기본 샘플러다. 이전 trial들의 성능을 학습해 "좋은 파라미터가 있을 법한 구간"의 확률밀도를 모델링하고, 매 trial마다 유망한 지점을 우선 제안한다. 즉 GridSearch처럼 격자를 빠짐없이 훑거나 RandomSearch처럼 무작위 추출하는 것이 아니라, 과거 trial 정보를 활용해 탐색 자체를 점점 똑똑하게 만드는 방식이다. 예산(
n_trials·timeout) 내에서 최적 근방으로 훨씬 빠르게 수렴한다. ↩ -
GroupKFold — scikit-learn의 교차검증 방식. 같은 그룹(여기서는 동일
Match number의 A/B 두 관측)에 속한 샘플이 반드시 같은 fold에 묶이도록 분할해 그룹 간 누출을 물리적으로 차단한다. 다만 시계열 순서는 보존되지 않아 본 도메인에서는 오히려 과적합이 악화되었다. ↩ -
overfit_gap —
Train AUC − Test AUC. 모델이 학습 데이터를 얼마나 "외웠는지"의 단순 지표로, 통상 0.03 이하를 안전 범위로 본다. 현 모델은 0.0257. ↩ -
binary log_loss — 이진 분류의 확률 예측 손실. 실제 라벨 $y \in {0, 1}$ 과 예측 확률 $\hat p$ 에 대해 $-[y \log \hat p + (1-y)\log(1-\hat p)]$. 맞든 틀리든 예측 확률과 진실의 거리를 벌점으로 누적하기 때문에, 단순 정확도(accuracy)보다 확률 자체의 정밀도를 직접 최적화한다. 0에 가까울수록 좋다. ↩