XGBoost
- 랜덤포레스트: 결정트리를 병렬로 배치
- XGBoost: 결정트리를 직렬로 배치
| 모델명 | 로직 |
|---|---|
| XGBoost | 성능이 가장 좋을 때의 부스팅 반복 횟수를, 예측시 iteration_range 패러미터로 명시 |
| LightGBM | 훈련단계에서 성능이 가장 좋았던 반복 횟수 때의 모델을 활용해 예측 |
이 문장은 **“조기 종료(Early Stopping)를 통해 찾은 최적의 반복 횟수(Best Iteration)를 예측 시점에 어떻게 반영하느냐”**에 대한 기술적인 차이를 설명하고 있습니다.
XGBoost의 iteration_range 사용법을 아주 쉽게 풀어서 설명해 드릴게요.
- 배경: 왜 이런 설정이 필요한가? 부스팅 모델(XGBoost, LightGBM)을 학습시킬 때, 보통 n_estimators=1000처럼 넉넉하게 횟수를 잡고 **조기 종료(Early Stopping)**를 설정합니다.
예를 들어, 1000번을 돌리기로 했는데 120번째에서 검증 오차가 가장 낮고 그 뒤로는 오차가 다시 커진다면(과적합), 학습은 거기서 멈춥니다.
이때 120번이 바로 **‘성능이 가장 좋을 때의 부스팅 반복 횟수’**가 됩니다.
- XGBoost: iteration_range 명시의 의미 XGBoost는 모델 객체 안에 1000번까지의 결과(혹은 중단된 지점까지의 결과)를 모두 들고 있는 경우가 많습니다. 그래서 예측할 때 **“어느 범위까지의 나무(Tree)들을 사용할 것인가”**를 직접 알려줘야 할 때가 있습니다.
문장의 의미: model.predict(test_data, iteration_range=(0, 120))라고 코드를 써서, “0번부터 최적의 횟수인 120번 나무까지만 써서 결과를 내줘!”라고 명령하라는 뜻입니다.
만약 이를 명시하지 않으면, 최적 지점 이후에 과적합된 나무들까지 계산에 포함되어 예측 성능이 떨어질 수 있습니다. (※ 최근 버전의 XGBoost는 best_iteration을 자동으로 적용하기도 하지만, 원칙적으로는 범위를 지정하는 것이 가장 확실합니다.)
- LightGBM과 비교 (차이점) 질문하신 문장에서 LightGBM과 비교한 이유는 모델의 기본 동작 방식이 다르기 때문입니다.
LightGBM: 학습이 끝나면 모델 자체가 자동으로 “아, 120번이 최고였지?”라고 기억하고, predict()를 호출하면 알아서 120번까지의 결과만 출력합니다. 사용자가 따로 범위를 적을 필요가 거의 없습니다.
XGBoost: 사용자가 직접 “120번까지 써라”라고 iteration_range를 통해 명시해 주는 과정이 필요할 수 있다는 것입니다.
- 코드 예시로 보기 Python
XGBoost 예시
학습 시 120번에서 조기 종료되었다고 가정
best_iter = model.best_iteration
예측 시 iteration_range로 범위를 지정 (0부터 best_iter까지)
preds = model.predict(X_test, iteration_range=(0, best_iter + 1)) 요약 **“예측할 때, 성능이 제일 좋았던 지점(나무 개수)까지만 계산에 사용하도록 구간을 딱 정해줘라”**는 뜻입니다.
이해가 되셨나요? 이 내용은 특히 캐글처럼 0.001점 차이로 메달 색이 바뀌는 대회에서 과적합을 방지하고 점수를 끝까지 짜내기 위해 매우 중요한 테크닉입니다.
혹시 조기 종료를 설정하는 구체적인 코드도 궁금하신가요?
출처: XGBoost Python API Reference (predict section), 파이썬 머신러닝 완벽 가이드(권철민 저)