Blog
XGBoost Tips and Tricks | Kaggle
2026.01.25
·Service·by 이호민#XGBoost#Machine Learning#Data Science#Feature Engineering#Hyperparameter Tuning
핵심 포인트
- 1이 글은 Kaggle에서 XGBoost를 효과적으로 활용하기 위한 팁과 트릭을 제시하며, 빠른 실험, 신뢰할 수 있는 Local Validation, 그리고 GPU를 활용한 데이터 전처리의 중요성을 강조합니다.
- 2XGBoost 모델 구축 및 최적화에서는 `max_depth`, `colsample_bytree`와 같은 핵심 Hyperparameters를 조정하고, 특히 Target Encoding을 포함한 Feature Engineering을 통해 성능을 극대화하는 방법을 설명합니다.
- 3대규모 데이터 처리 및 Inference 가속화를 위해 `QuantileDMatrix`, DASK XGBoost, 그리고 NVIDIA cuML FIL과 같은 기술들을 활용하여 XGBoost의 확장성과 배포 효율성을 높이는 방법을 제안합니다.
이 논문은 Kaggle에서 XGBoost를 효과적으로 사용하여 머신러닝 경쟁에서 승리하고 솔루션을 배포하는 데 도움이 되는 팁과 트릭을 공유합니다. 데이터 사이언스 기반, XGBoost 기본 사항, 모델 구축 및 최적화, 대규모 데이터 스케일링, 배포 및 추론의 다섯 가지 주요 영역을 다룹니다.
데이터 사이언스 기반 (Data Science Foundations)
- 빠른 실험 (Fast Experimentation): 머신러닝 성공의 핵심은 빠른 실험입니다. 이를 위해 로컬 전처리, Feature Engineering, 모델 학습, 추론, 평가 과정을 최대한 빠르게 만들어야 합니다. GPU 사용은 속도를 가속화하는 가장 중요한 방법이며, NVIDIA cuDF와 cuML 라이브러리가 데이터프레임 작업 및 ML 모델 학습/추론을 가속화합니다. XGBoost에서
device:"cuda"파라미터 설정을 통해 GPU를 쉽게 활용할 수 있습니다. - 로컬 검증 (Local Validation): 실험을 평가하고 최적의 모델을 결정하기 위해서는 신뢰할 수 있는 로컬 검증이 필수적입니다. KFold 교차 검증이 가장 효과적이며, 이는 전체 학습 데이터를 활용하여 모델 성능을 평가합니다. KFold 디자인은 테스트 데이터와 학습 데이터 간의 관계를 모방해야 합니다. 예를 들어, 테스트 데이터에 학습 데이터에 없는 새로운 환자가 포함된다면,
GroupKFold를 사용하여 로컬 검증 세트에도 새로운 환자가 포함되도록 구성해야 합니다. 시계열 데이터의 경우, 학습 데이터 이후에 발생하는 테스트 데이터를 모방하도록 검증 전략을 설계해야 합니다. - 탐색적 데이터 분석 (Exploratory Data Analysis, EDA): 데이터를 깊이 이해하고 Feature와 타겟 간의 관계를 파악하는 것이 Feature Engineering 및 모델 아키텍처 설계에 필수적입니다. 데이터를 다각도로 분석함으로써 XGBoost 모델의 성능을 향상시킬 수 있습니다.
XGBoost 기본 사항 (XGBoost Fundamentals)
- XGBoost란?: XGBoost는 Decision Tree 앙상블 모델입니다. 각 Decision Tree는 이전 Decision Tree의 잔차(residual) 또는 오차에 대해 순차적으로 학습됩니다. 중요한 두 가지 특성은 다음과 같습니다:
- Decision Tree는 숫자의 순서(ordering)만 중요하게 여기며 분포(distribution)에는 영향을 받지 않습니다.
- Decision Tree는 학습 데이터의 입력 범위를 벗어나는 값에 대해 외삽(extrapolate)할 수 없습니다.
- API 종류:
- Native Python API:
xgb.DMatrix를 사용하여 데이터를 패키징하고,xgb.train()함수로 모델을 학습시킵니다. 이 API는 반복별 커스텀 학습률, 증분 학습, 콜백(callbacks) 등 더 많은 기능을 제공하며, 세밀한 학습 제어가 가능합니다. - Scikit-Learn API:
xgboost.XGBRegressor또는xgboost.XGBClassifier와 같은 클래스를 인스턴스화하고,model.fit()및model.predict()메서드를 사용합니다. Scikit-Learn 워크플로우(예:GridSearchCV,Pipeline)에 자연스럽게 통합되며 사용 편의성이 높습니다. 하지만 Native API의 모든 고급 기능을 직접적으로 노출하지는 않습니다.
- Native Python API:
모델 구축 및 최적화 (Building & Optimizing Models)
- 베이스라인 모델: XGBoost의 큰 장점 중 하나는 전처리 없이도 모델을 생성할 수 있다는 것입니다. 결측치(missing data), 범주형 Feature(categorical features), 수치형 Feature(numerical features)를 있는 그대로 사용할 수 있습니다.
- KFold를 사용한 학습 코드 예시: Native Python API를 사용하여 KFold 교차 검증을 수행하는 학습 코드가 제시됩니다.
xgb.DMatrix를 생성할 때 를 설정하여 범주형 데이터를 효율적으로 처리할 수 있습니다.num_boost_round는 부스팅 라운드 수를,evals는 학습 및 검증 세트에 대한 평가 메트릭을,early_stopping_rounds는 검증 성능 향상이 없을 때 학습을 조기 종료하는 기능을,verbose_eval은 학습 진행 상황을 출력하는 간격을 설정합니다. 추론 시에는 을 사용하여 최적의 반복 횟수까지만 예측을 수행합니다. - 하이퍼파라미터 (Hyperparameters): XGBoost의 하이퍼파라미터는 압도적일 수 있지만, 몇 가지 핵심 파라미터만 조정해도 대부분의 성능을 얻을 수 있습니다.
- 핵심 파라미터:
objective(문제 유형 정의),eval_metric(평가 메트릭),learning_rate(학습률, 기본 0.1),max_depth(트리 깊이, 기본 6),subsample(학습에 사용할 데이터 샘플 비율, 기본 0.8),colsample_bytree(트리당 Feature 샘플 비율, 기본 0.8),device("cuda" 사용 권장). - 가장 중요한 두 가지 조절 변수는
max_depth(3~12 사이)와colsample_bytree(0.3~0.9 사이)입니다. 이 두 가지를 주로 튜닝하여 95% 이상의 성능을 달성할 수 있습니다. - 정규화 파라미터:
min_child_weight,gamma,lambda,alpha등이 있으며, 추가적인 성능 향상을 위해 튜닝할 수 있습니다. - 기타 파라미터:
scale_pos_weight,grow_policy,max_leaves,tree_method("hist" 권장),max_bin(256 권장). - 하이퍼파라미터 최적화는 수동으로 하거나 Optuna와 같은 자동 최적화 라이브러리를 사용할 수 있습니다.
- 핵심 파라미터:
- Feature Engineering: 저자는 하이퍼파라미터 최적화보다는 Feature Engineering에 더 많은 시간을 투자하는 것을 권장합니다.
- 핵심 기법: 새로운 범주형 Feature를 많이 생성하고 이를 인코딩하는 것입니다.
- 인코딩 기법:
groupby집계(aggregation): 범주형 Feature를 기준으로 그룹화하고 수치형 Feature의 통계량(예: 평균, 표준편차, 분위수)을 집계하여 새로운 Feature를 생성합니다. NVIDIA cuDF를 사용하면groupby작업을 최대 50배까지 가속화할 수 있습니다.- Target Encoding: 타겟 변수의 통계량을 집계하는 강력한 기법입니다. 데이터 누출(data leakage)을 피하기 위해 적절한 기법(예: KFold 분할 내에서 인코딩)을 사용해야 합니다.
- One-Hot Encoding, Label Encoding, Count Encoding 등.
- 기타 Feature Engineering 기법: 수치형 Feature를 Binning하여 범주형으로 변환, 여러 컬럼 결합, 컬럼 분할 등. NVIDIA cuDF와 GPU는 수많은 Feature Engineering 아이디어를 탐색하는 데 필수적입니다.
대규모 데이터 스케일링 (Scaling XGBoost for Large Data)
- 데이터 타입 축소 (Reducing Data Types): 메모리 사용량을 줄이기 위해 데이터 타입을 필요한 만큼만 작게 설정합니다.
- QuantileDMatrix 사용: XGBoost v2.0 또는 v3.0부터 도입된
xgb.QuantileDMatrix와xgb.ExtMemQuantileDMatrix는 향상된 메모리 관리 기능을 통해 더 큰 데이터셋으로 학습할 수 있도록 합니다. 이는 CPU RAM이나 GPU VRAM 증가 없이 가능합니다. 특히ExtMemQuantileDMatrix는 외부 메모리를 활용하여 더욱 큰 데이터셋을 처리할 수 있습니다. 와 함께 사용하면 RMM(RAPIDS Memory Manager)을 활용하여 GPU 메모리 관리를 최적화할 수 있습니다. - DASK XGBoost: 시스템에 여러 GPU가 있는 경우, DASK XGBoost를 사용하여 모든 GPU를 활용할 수 있습니다.
dask.distributed.Client를 설정하고,xgb.dask.DaskDMatrix로 데이터를 준비한 후xgb.dask.train()함수로 분산 학습을 수행합니다. NVIDIA 팀은 이러한 기법들을 통해 4xGPU vs 1xCPU에서 250배, 4xGPU vs 20xCPU에서 25배의 속도 향상을 달성했으며, 이는 RecSys 경쟁에서 우승하는 데 기여했습니다.
배포 및 추론 (Deployment & Inference)
- NVIDIA cuML Forest Inference Library (FIL): NVIDIA FIL은 XGBoost 모델의 추론 속도를 가속화합니다.
xgb_model.save_model()로 저장된 모델을ForestInference.load()를 통해 불러와 GPU에서 매우 빠르게 예측을 수행할 수 있습니다. 를 통해 특정 배치 사이즈에 최적화할 수도 있습니다. - 전체 데이터로 재학습 (Refit on Full Data): KFold 교차 검증으로 최적의 하이퍼파라미터를 찾은 후, 전체 학습 데이터(100%)를 사용하여 단일 모델을 재학습하는 것은 Kaggle에서 리더보드 점수를 높이는 일반적인 기법입니다. 이는 모델 성능을 향상시키고, 추론 시 K개의 모델 대신 단일 모델을 사용하여 복잡성을 줄여줍니다. 재학습 시 에폭(epochs) 수는 KFold 학습에서 얻은 최적 에폭 수의 배로 설정하는 것이 권장됩니다.