왜 XGBoost를 선호할까? 성능 좋은 2가지 이유

10년 넘게 데이터 분석을 해오면서 가장 효율 좋은 알고리즘을 꼽으라면 XGBoost인데요. 통계적 학문에서 머신러닝이 주목받기 시작하면서 다양한 방법론이 나왔었죠. 

그 중에서 XGBoost는 분석가에게 가장 인기있는 알고리즘입니다. 이 글에서는 데이터 과학 분야에서 인기를 끌고 있는 XGBoost의 특징과 사용법입니다.

캐글대회 우승 top5 알고리즘
Kaggle대회 top-5팀이 이용한 머신러닝 순위(출처: reddit.com)

XGBoost는 왜 주목받고 있을까?

뭐니뭐니해도 XGBoost는 성능이 좋기로 유명합니다. 그라디언트 부스팅 알고리즘 중 특히 대규모 데이터셋과 복잡한 문제를 해결하는데 탁월한 성능을 보이고 있죠.

그래서 Kaggle과 같은 데이터 분석대회에서 두각을 나타내고 있는 이유입니다. XGBoost를 선호하는 이유는 그 효율성과 확장성에 있습니다.

이는 기존의 많은 머신러닝 알고리즘이 요구하는 데이터 준비 과정을 간소화해 주는데요. 특히 누락된 값과 범주형 데이터 처리 측면에서 탁월한 차이를 냅니다. 

xgboost 원리


 

XGBoost의 차별화된 데이터 처리 기능

우선 두 가지 측면에서 XGBoost는 차별화된 기능이 있는데요. 왜 그것이 차별화인지 하나하나 따져보시죠. 

1. 누락된 값의 효율적 처리

XGBoost는 누락된 데이터를 자동으로 처리하는 기능을 제공합니다. 사실 대부분의 다른 알고리즘이 데이터 전처리 시 결측 값을 채우거나 제거해야 하는데요. 

그와는 대조적으로 XGBoost는 데이터 전처리의 복잡성을 줄여줍니다. 그리고 전처리를 하지 않아 발생하는 모델의 불이익, 즉 예측 정확성이 낮아지는 것을 방지해 줍니다. XGBoost의 회귀 모델을 생성하는 클래스 아래와 같이 선언할 수 있습니다.

# xgboost 회귀 모델 생성 코드 예시
import xgboost as xgb
xgb_model = xgb.XGBRegressor(seed=42)

 

2. 범주형 데이터의 직접 처리

XGBoost는 Pandas의 category 타입으로 변환된 범주형 변수를 직접 처리할 수 있습니다. 이는 one-hot 인코딩과 같은 사전 처리 과정 없이도 범주형 데이터를 효과적으로 다룰 수 있어 모델링 과정을 더욱 간소화합니다.

쉽게 말해 알고리즘은 숫자형 데이터를 주입 받도록 설계되어 있기 때문에, 범주형 데이터를 적절히 변환해주는 과정이 필요합니다. 그런데 XGBoost는 자동으로 변환해서 처리한다는 말이죠.

사실 이 기능은 그냥 XGBoost 특징으로 알고 있지만, 실제 내가 처리하는 것보다 모델 내에서 더 좋은 방향으로 처리해 주기 때문에 좋은 성능을 보장했었죠.

아래 코드는 Ames 데이터셋에서 ‘Neighborhood’ 열에 있는 지역 정보를 숫자로 표현된 범주형 데이터로 인식하도록 설정하는 것입니다. 

# Pandas로 데이터를 category 타입으로 변환
Ames['Neighborhood'] = Ames['Neighborhood'].astype('category')

 

XGBoost로 더 나은 모델 구현

RFECV는 Recursive Feature Elimination with Cross-Validation의 약자로, 순차적 특징 제거와 교차 검증을 결합하여 최적의 feature 집합을 찾는 방법입니다.

즉, 모델의 성능에 큰 영향을 미치지 않는 불필요한 feature들을 제거하여 모델의 일반화 성능을 향상시키고, 모델의 해석력을 높이는 데 도움을 줍니다.

RFECV기법을 사용하여 XGBoost 모델의 성능을 극대화할 수 있는데요. 이는 모델의 복잡성을 줄이고, 데이터의 핵심 feature를 활용하여 보다 해석 가능한 모델을 만들어 줍니다.

중요한 것은 범주형 데이터가 제대로 변환되어 잘 활용될 때라는 점입니다. 아래는 RFECV를 이용한 XGBoost 모델의 feature selection 코드입니다. 

import xgboost as xgb from sklearn.feature_selection 
import RFECV 

# XGBoost 모델 생성 
xgb_model = xgb.XGBRegressor() 

# RFECV 객체 생성 
rfecv = RFECV(estimator=xgb_model, step=1, cv=5, scoring='r2', min_features_to_select=1)
rfecv.fit(X, y)

# 최적의 특징 선택 결과 출력 
print("Optimal number of features : %d" % rfecv.n_features_)
print("Selected features : %s" % rfecv.support_)

주요 파라미터 설명

파라미터명 설명
estimator 필수 파라미터이며, 선택하고자 하는 특징을 사용하는 모델 객체를 입력합니다.
이 코드에서는 앞서 생성된 XGBoost 모델 객체인 xgb_model 을 입력하고 있습니다.
step 한 번에 제거할 특징의 수를 설정합니다. 기본값은 1이며, 1씩 제거하면서 최적의 특징 집합을 찾습니다.
cv 교차 검증 횟수를 설정합니다. 기본값은 5이며, 이는 데이터를 5개의 그룹으로 나누어 교차 검증을 수행한다는 의미입니다.
scoring 모델 평가 지표를 설정합니다.
이 코드에서는 ‘r2’ 를 사용하고 있으며, 결정 계수(R-squared)를 사용하여 모델 성능을 평가합니다.
다른 지표 (예: ‘neg_mean_squared_error’, ‘accuracy’) 도 사용 가능합니다.
min_features_to_select 최소 선택 특징 수를 설정합니다.
기본값은 None이며, 적어도 하나의 특징은 남도록 합니다.
이 코드에서는 min_features_to_select=1 로 설정하여 반드시 최소 1개의 특징을 선택하도록 강제하고 있습니다.

이렇게 선택된 feature들을 활용할 때, 모델의 효율성과 해석 가능성이 높아집니다.


 

결론

XGBoost는 복잡한 데이터셋을 처리하면서도 모델의 예측 정확도를 향상시키기 위해 많이 선택됐었습니다. 특히, 누락된 값이나 범주형 데이터의 처리에서 그 위력을 발휘합니다.

RFECV와 같은 기법을 통해 최적화된 특징을 선별해내는데 기여하며, 높은 수준의 모델 성능을 구현하는 데 있어 반드시 고려해야 할 라이브러리입니다.

XGBoost의 강력함을 잘 활용하기 위해 데이터를 잘 이해하고, 그 특성에 맞는 최적의 기법을 선택하는 것이 중요합니다. XGBoost의 수식 및 원리는 링크를 참고하시기 바랍니다. 

Leave a Comment