CHAPTER 09
9.3 데이터와 장비에 맞춰 부스팅 고르기
XGBoost, LightGBM, CatBoost의 학습 방식과 실행 조건을 비교합니다.
분할을 고르는 비용과 규칙의 복잡도
종목 492만 행을 여러 검증 구간에서 반복 학습한다고 하자. 한 번 학습에 50초가 걸리는 모델과 100초가 걸리는 모델은 100회 시도에서 학습만 약 83분과 167분이 든다. 같은 부스팅 방식이라도 경계 후보를 찾는 방법과 나무를 제한하는 방식이 달라 반복 학습의 비용이 달라진다.
XGBoost에서 잎을 하나 더 만들 대가
eXtreme Gradient Boosting(극단 그래디언트 부스팅, XGBoost)은 손실에 나무의 복잡도 비용을 더한다. 새 분할이 오차를 조금 줄여도 잎을 추가하는 비용보다 절감량이 작으면 그 분할을 채택할 이유가 줄어든다. 잎의 보정값에 제곱 비례 비용을 주는 L2 Regularization(L2 정규화)은 소수 종목 때문에 큰 보정을 내는 가지를 억제한다. 예컨대 4 퍼센트포인트의 보정은 2 퍼센트포인트 보정보다 제곱 비용이 네 배다.
예측을 얼마나 바꿀지도 손실의 기울기와 Curvature(곡률)를 같이 본다. 곡률은 예측을 움직일수록 기울기가 얼마나 빨리 변하는지를 나타낸다. 손실이 급하게 휘면 현재 기울기만 보고 크게 움직일 때 최소점을 지나칠 수 있다. 2차 근사는 이 변화를 고려해 분할과 잎 점수를 계산한다. 희소한 표에서는 실제로 저장된 값 중심으로 탐색하고 결측의 기본 경로를 학습한다. 메모리 배치를 캐시에 맞추면 같은 행을 읽는 반복 계산도 줄일 수 있다.
LightGBM에서 필요한 경계와 행만 비교하기
최근 변동성 관측값이 백만 개라면 매번 서로 다른 값을 모두 경계 후보로 시험하기 어렵다. Histogram(히스토그램)은 근접한 값을 같은 구간에 넣고 그 구간별로 기울기 등을 합산한다. 구간을 만들 때는 데이터를 읽지만, 분할을 시험할 때는 구간 사이의 경계만 보면 된다.
Light Gradient Boosting Machine(경량 그래디언트 부스팅 머신, LightGBM)의 Leaf-wise Growth(잎 우선 성장)는 이미 만든 잎 중 다음 분할로 손실이 가장 많이 줄 곳부터 나눈다. 비슷한 깊이로 전체를 확장하는 방식보다 잎 수가 같을 때 학습 손실이 빠르게 줄 수 있다. 자료가 적은 잎에서 우연한 패턴을 발견하면 한 가지에 분할이 몰릴 수 있으므로 잎 개수, 최대 깊이와 잎마다 필요한 최소 관측 수를 함께 관리한다.
Gradient-based One-Side Sampling(기울기 기반 편측 표본 추출, GOSS)은 큰 기울기의 행을 남기고 작은 기울기의 행은 일부만 뽑는다. 뽑힌 작은 기울기 행에 가중치를 더 줘 빠진 행의 몫을 보정한다. Exclusive Feature Bundling(배타적 특성 묶기, EFB)은 같은 행에서 거의 동시에 켜지지 않는 열을 한 묶음으로 기록해 분할 계산을 줄인다. 예를 들어 업종마다 하나의 표시 열이 있고 각 종목에 한 열만 켜지면 묶을 여지가 크다. 두 기법의 이득은 기울기 분포와 표의 희소성에 달려 있다.
CatBoost에서 업종의 수익률 통계를 만드는 순서
희귀 업종에 학습 행이 하나뿐이고 그 행의 다음 주 수익률이 8%라면, 그 업종의 평균 수익률을 해당 행에 입력하는 순간 정답이 입력에 들어간다. 이를 Target Leakage(목표값 누출)라고 한다. Categorical Boosting(범주형 부스팅, CatBoost)의 Ordered Target Statistics(순서 기반 목표값 통계)는 학습 행의 순서를 정하고 현재 행보다 앞에 놓인 행의 라벨로만 범주 통계를 만든다. 해당 범주가 처음 등장하면 사전 평균을 사용할 수 있다. 순서를 여러 번 구성하면 희귀 범주 통계가 특정 순서에 좌우되는 정도를 줄일 수 있다.
같은 행의 라벨을 빼는 문제와 미래 시점을 막는 문제는 따로 점검한다. 날짜로 학습과 검증을 분리하고, 거래 시점에 알려진 입력으로만 변환을 재현한다. 종목 식별자나 애널리스트 코드처럼 값이 매우 많은 범주에서는 빈도가 낮은 범주와 신규 범주의 성능도 확인한다.
기본 Symmetric Tree(대칭 트리)는 같은 깊이의 모든 노드에서 같은 조건을 쓴다. 깊이가 3이면 조건 세 개의 참·거짓을 이진 번호로 만들어 잎을 찾을 수 있다. 노드마다 다음 조건을 새로 찾는 작업이 줄어 예측이 빠를 수 있다.
같은 규모에서 학습 시간 비교하기
미국 주식의 학습 표 492만 행과 특성 72개를 사용한 비교에서 Central Processing Unit(중앙 처리 장치, CPU)은 스레드 8개를 사용했다. Graphics Processing Unit(그래픽 처리 장치, GPU) 비교는 CUDA 환경에서 했다.
막대가 짧을수록 학습이 빠르다. CPU에서는 LightGBM이 가장 짧고, 이 GPU 실험에서는 CatBoost가 가장 짧다.
학습 시간과 예측 처리량은 별도다. 무거운 설정에서 시험 행 2만 4천 개를 예측한 CPU 처리량은 CatBoost가 초당 약 650만 행, XGBoost가 약 50만 행, LightGBM이 약 7만 행이었다. XGBoost의 GPU 처리량은 약 170만 행이었다. 묶음 전체의 처리량을 종목 하나씩 요청하는 지연 시간으로 환산하려면 요청 준비와 장치 이동 비용도 따로 재야 한다.
규모를 22만 7천 행의 상장지수펀드 표로 낮추면 LightGBM의 무거운 설정은 CPU 약 9.5초, CUDA 약 48초였다. 장치 실행과 데이터 이동 비용의 비중이 커졌고, 실험의 CUDA 구현은 배정밀도(FP64) 연산을 사용했다. 같은 LightGBM의 OpenCL 경로는 단정밀도(FP32)를 사용할 수 있고, 배정밀도 처리 능력이 높은 장비에서는 결과가 달라질 수 있다. 비교 기록에는 데이터 크기와 스레드 수뿐 아니라 라이브러리 빌드, 장치와 정밀도도 남긴다.
| 비교 상황 | 먼저 살필 구현 | 결과를 바꿀 조건 |
|---|---|---|
| CPU로 작은 표의 기준선 학습 | scikit-learn의 HistGradientBoostingRegressor | GPU와 전문 튜닝 도구가 필요한지 |
| 큰 표를 CPU에서 여러 번 학습 | LightGBM | 잎 크기, 깊이, 범주 인코딩과 메모리 |
| CPU·CUDA와 범용 배포 도구를 함께 사용 | XGBoost | 범주 지원 설정, 희소성, 실제 예측 지연 |
| 범주 종류가 많거나 대량 예측 지연이 중요 | CatBoost | 시간 기준 누출, 희귀 범주와 장비별 비용 |
같은 시간 분할과 비슷한 설정 탐색 예산으로 비교하면, 라이브러리를 바꾸는 것보다 설정의 차이가 더 클 수 있다. 전체 기간 평균뿐 아니라 구간마다 순위가 뒤바뀌는지도 본다.
분할 횟수와 개선량을 구분하기
변동성이 10개 분할에 쓰여 각각 손실을 1만큼 줄이고, 업종이 두 번 쓰여 각각 8만큼 줄였다고 하자. Split Count(분할 횟수)로는 10 대 2이고 Total Gain(총 개선량)으로는 10 대 16이다. 첫 지표는 자주 쓰인 조건을, 둘째는 학습 과정에서 손실을 많이 줄인 조건을 가리킨다. 라이브러리마다 개선량의 합이나 평균 등 집계 기준이 다를 수 있다.
연속값이나 종류가 많은 입력은 경계를 시험할 기회가 많아 중요도가 높아지기 쉽다. 함께 움직이는 두 입력 중 어느 쪽이 먼저 선택됐는지에 따라 재학습 결과도 바뀐다. 개별 종목의 점수를 무엇이 얼마나 움직였는지 알아볼 때는 9.7에서 다룰 기여도와 함께 읽는다.