← Tier.SC 메인

ML 모델 개요

마지막 수정: 2026-04-22 16:10 KST

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)이 학습한 결과다.

하이퍼파라미터 튜닝

  • 교차검증: TimeSeriesSplit 5-fold — 시계열 순서를 보존하여 미래 누수를 차단. GroupKFold4 대안은 overfit_gap5이 악화되어 기각(상세는 지표 해석).
  • 탐색: Optuna 100 trials, TPE(Tree-structured Parzen Estimator) 샘플러. 수렴조건은 n_trials=100timeout=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_rate 5개 피처에 단조 증가 제약을 걸어 "실력/유리한 신호가 커질수록 승률이 단조 증가"라는 상식을 모델에 강제한다.
  • 최종 모델: Optuna가 선택한 n_estimators를 시작점으로, Calib 셋 기반 early stopping(50 rounds) 으로 최종 트리 수를 확정. 현재 스냅샷은 ≈ 550 트리, 40 피처.
  • 최종 Sample weight: 시간 감쇠 0.9995^days_to_most_recent를 학습 셋에 적용해 오래된 경기의 영향을 완만히 줄인다.

학습 조건과 검증 철학

튜닝 파라미터 이전에 무엇을 보여주고 무엇을 가렸는지가 훨씬 중요하다. 모델이 "미래를 보고 과거를 맞추는" 일이 없도록 아래 네 원칙을 학습 파이프라인에 강제한다.

  1. 점수의 강제 초기화 — 모든 선수를 1000점에서 출발시킨다. 사전 편향 없이 관측된 경기 결과만으로 실력축을 재구성한다.
  2. Data Leakage 원천 배제 — 모델이 보는 피처는 "경기 시작 전에 알 수 있는 정보"로 국한한다. 상대전적, 최근 승률, 점수차 등. 경기 종료 후에만 확정되는 값을 피처에 섞으면 Test 성능은 오르지만 실전에서는 재현되지 않는다.
  3. 엄격한 시계열 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 홀드아웃은 최종 성능 리포트의 기준선이다.
  4. 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이 가장 자연스러운 선택이었다.

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한 영역에 안착했다는 신호로 본다.

왜 이 구성이 현재 최선인가

  1. 해석 가능성 — BT 스코어가 순수 실력축을 고정하고, LightGBM이 그 위에 맥락 효과를 얹어 SHAP로 개별 기여를 설명 가능. 핵심 피처 5개에는 monotone constraints로 도메인 상식이 명시 주입되어 있어, 예측이 "실력이 낮은데 승률이 오른다" 같은 반직관적 방향으로 움직이지 않는다.
  2. 데이터 효율성 — 매치 5만 규모에서 딥러닝은 과적합 위험이 큼. LightGBM + 40 피처가 파라미터 수·해석성·정확도의 균형점.
  3. Edge 배포 친화 — 모델을 JSON으로 직렬화해 Cloudflare Workers에서 수 ms 내 추론.

향후 보강 방향

  • 빌드 오더·APM 등 인게임 행동 피처 도입
  • 시간 감쇠(time-decay) 고도화 — 현재 선형 감쇠(0.9995^days)에서 시즌(버전) 경계 리셋형 가중으로 확장
  • 확률적 앙상블 — BT 포스테리어 불확실성을 LGBM 출력과 결합

로드맵 상세: ML 로드맵


  1. LightGBM — Microsoft가 공개한 경사부스팅(Gradient Boosting) 트리 기반 학습 라이브러리. 이전 트리들이 틀린 샘플의 잔차(residual)를 다음 트리가 이어 맞추는 방식으로 수많은 얕은 트리를 누적 학습해 비선형·교호작용을 표현한다. Histogram-based · leaf-wise 성장으로 XGBoost 대비 학습·추론이 빠르고 메모리가 가볍다. 수치형이 대부분인 정형 데이터(현 프로젝트 40 피처)에서 성능 상단이며, JSON 직렬화 지원으로 Cloudflare Workers Edge 추론에 직접 얹기 좋다. 

  2. www.eloboard.com 

  3. Optuna(TPE) — Optuna는 하이퍼파라미터 자동 탐색 프레임워크이고, TPE(Tree-structured Parzen Estimator) 는 그 기본 샘플러다. 이전 trial들의 성능을 학습해 "좋은 파라미터가 있을 법한 구간"의 확률밀도를 모델링하고, 매 trial마다 유망한 지점을 우선 제안한다. 즉 GridSearch처럼 격자를 빠짐없이 훑거나 RandomSearch처럼 무작위 추출하는 것이 아니라, 과거 trial 정보를 활용해 탐색 자체를 점점 똑똑하게 만드는 방식이다. 예산(n_trials·timeout) 내에서 최적 근방으로 훨씬 빠르게 수렴한다. 

  4. GroupKFold — scikit-learn의 교차검증 방식. 같은 그룹(여기서는 동일 Match number의 A/B 두 관측)에 속한 샘플이 반드시 같은 fold에 묶이도록 분할해 그룹 간 누출을 물리적으로 차단한다. 다만 시계열 순서는 보존되지 않아 본 도메인에서는 오히려 과적합이 악화되었다. 

  5. overfit_gapTrain AUC − Test AUC. 모델이 학습 데이터를 얼마나 "외웠는지"의 단순 지표로, 통상 0.03 이하를 안전 범위로 본다. 현 모델은 0.0257. 

  6. binary log_loss — 이진 분류의 확률 예측 손실. 실제 라벨 $y \in {0, 1}$ 과 예측 확률 $\hat p$ 에 대해 $-[y \log \hat p + (1-y)\log(1-\hat p)]$. 맞든 틀리든 예측 확률과 진실의 거리를 벌점으로 누적하기 때문에, 단순 정확도(accuracy)보다 확률 자체의 정밀도를 직접 최적화한다. 0에 가까울수록 좋다.