Decision Tree(의사 결정 트리)와 XGBoost 비교
안녕하세요! 오늘은 XGBoost가 의사 결정 트리와 비교해 보면서 모델 성능을 어떻게 하면 더 향상시킬 수 있는지 살펴보겠습니다.
결정 트리는 분류, 회귀 모델에서 모두 잘 사용되는 머신 러닝 알고리즘입니다. 그렇지만 의사 결정 트리는 과적합이 쉽게 되기 때문에 성능이 저하될 가능성이 높습니다. XGBoost는 이런 의사 결정 트리의 문제점을 보완하는 데 도움이 되는 그래디언트 부스팅의 최적화된 구현입니다.
의사 결정 트리의 제한 사항
과적합, 편향-분산 절충
결정 트리는 위에서도 말했듯이 분류나 회귀 모델에서 널리 사용되는 지도 학습 알고리즘입니다. 대부분 정보 이득을 제공하는 피처를 기반으로 데이터를 하위 집합으로 분할하여 사용됩니다. 결정 트리는 너무 복잡하기도 하고 훈련 데이터에 최적화되어 있어서 새로운 데이터에 대해서 일반화가 잘 이루어지지 않는 과적합 문제가 자주 발생합니다. 또한 트리가 높은 편향(과소적합) 또는 높은 분산(과적합)을 가질 수 있는 bias-variance tradeoff가 있습니다.
XGBoost의 이점
과적합 감소, 성능 향상
XGBoost(eXtreme Gradient Boosting)는 위에서 말했던 의사 결정 트리의 단점 사항을 해결하기 위한 고급 의사 결정 트리라고 할 수 있습니다. 그래디언트 부스팅 프레임워크를 사용해서 상대적으로 약한 결정 트리를 강력한 예측으로 결합하는 방식입니다. 이 접근 방식은 기존의 의사 결정 트리에 비해서 과적합이 적게 발생되고 성능도 향상됩니다.
XGBoost의 작동 방식
XGBoost는 각각의 데이터가 다른 부분에 초점을 맞추어서 의사 결정 트리를 사용합니다. 트리는 순차적으로 구축이 되며, 새로운 트리는 각각 이전의 트리의 실수를 수정하려고 시도합니다. 경사 하강 알고리즘은 예측 값과 실제 값 사이의 잔차의 합인 손실 함수를 최소화하는 데 사용이 됩니다. 이때 트리는 얕아서 과적합을 방지하는 데 도움이 되고, 각 leaf 노드에는 최종 예측에 대한 해당 leaf의 기여도를 결정하는 관련된 가중치가 있습니다.
의사 결정 트리와 XGBoost 차이점
정규화, pruning, 부스팅
XGBoost는 기존의 의사 결정 트리와 비교했을 때 몇 가지 다른 점이 있습니다. 첫 번째는, 과적합을 방지하기 위해서 L1, L2 정규화와 같은 정규화 기술을 통합합니다. 두 번째는, 가지치기 기술을 사용해서 트리에 불필요한 노드들을 제거하기 때문에 더 간단하고 해석하기 쉬운 모델을 만들게 됩니다. 마지막으로는, XGBoost는 부스팅을 사용하는데요, 부스팅은 새로운 트리를 순서대로 추가하면서 이전 트리에서 발생한 실수를 수정해서 더 정확한 모델을 생성하게 됩니다.
의사 결정 트리와 XGBoost를 비교하는 Python 예제 코드
모델 train, test 성능 평가, 결과 시각화
아래 코드는 데이터 세트를 로드하고, train 세트와 test 세트로 분할하고, train 세트에서 결정 트리와 XGBoost 모델을 학습시킬 수 있는 코드입니다. 그런 다음 MAE 메트릭을 사용해서 test 세트에서 각 모델의 성능을 평가할 수 있습니다. 마지막으로 산점도 예측과 실제 값들을 시각화로 확인해 볼 수 있는 코드까지 생성해 보았습니다.
import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from xgboost import XGBRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
import matplotlib.pyplot as plt
# 데이터 세트 로드
data = pd.read_csv("data.csv")
# 데이터를 train 및 test 세트로 분할
train_data, test_data, train_target, test_target = train_test_split(data.drop('target', axis=1), data['target'], test_size=0.2)
# 의사 결정 트리 회귀 훈련
tree_reg = DecisionTreeRegressor(max_depth=5)
tree_reg.fit(train_data, train_target)
# XGBoost 회귀 훈련
xgb_reg = XGBRegressor(max_depth=5)
xgb_reg.fit(train_data, train_target)
# test 세트에서 모델 평가
tree_pred = tree_reg.predict(test_data)
xgb_pred = xgb_reg.predict(test_data)
tree_mae = mean_absolute_error(test_target, tree_pred)
xgb_mae = mean_absolute_error(test_target, xgb_pred)
# 각 모델에 대한 평균 절대 오차(MAE) 출력
print("Decision Tree MAE: ", tree_mae)
print("XGBoost MAE: ", xgb_mae)
# 결과 시각화
plt.scatter(test_target, tree_pred, label="Decision Tree")
plt.scatter(test_target, xgb_pred, label="XGBoost")
plt.xlabel("Actual Target")
plt.ylabel("Predicted Target")
plt.legend()
plt.show()
XGBoost 하이퍼파라미터를 조정하여 성능을 최적화하는 방법
대부분의 머신 러닝 알고리즘과 마찬가지로 XGBoost의 성능은 하이퍼파라미터의 선택에 크게 의존합니다.
하이퍼파라미터는 학습 프로세스가 시작되기 전에 설정시키며, 데이터에서 학습되지 않는 매개변수입니다. 하이퍼파라미터에는 학습률, 앙상블의 트리 수, 트리의 최대 깊이 등이 포함됩니다. XGBoost에서 조정할 수 있는 다양한 하이퍼파라미터들을 살펴보겠습니다.
- learning rate(학습률): 과적합을 방지하기 위해서 사용되는 단계로, 크기 축소를 제어
- max_depth: 앙상블에서 각 트리의 최대 깊이
- min_child_weight: 자식에 필요한 인스턴스 가중치의 최소 합
- gamma: 트리의 leaf 노드에서 추가 파티션을 만들기 위해 필요한 최소 손실 감소
- subsample: 트리당 사용된 샘플의 백분율
- colsample_bytree: 트리당 사용된 피처의 백분율
이러한 하이퍼파라미터를 조정하기 위해 그리드 서치라는 프로세스를 사용할 수 있습니다. 그리드 서치에서는 각 하이퍼파라미터에 대해 가능한 값들을 정의한 다음, 모든 하이퍼파라미터 조합에 대해 모델을 훈련하고 평가합니다. 그런 다음 최적의 성능을 제공하는 하이퍼파라미터 조합을 선택합니다.
다음은 파이썬에서 XGBoost로 그리드 서치를 수행하는 방법의 예시 코드입니다.
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
# 데이터 로드
data = pd.read_csv('data.csv')
# 데이터를 피처와 타깃으로 분할
X = data.drop('target', axis=1)
y = data['target']
# 조정할 하이퍼파라미터 정의
param_grid = {
'learning_rate': [0.1, 0.01, 0.001],
'max_depth': [3, 5, 7],
'min_child_weight': [1, 3, 5],
'gamma': [0.1, 0.01, 0.001],
'subsample': [0.8, 0.9],
'colsample_bytree': [0.8, 0.9]
}
# 모델 정의
model = xgb.XGBRegressor()
# 그리드 서치 수행
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, n_jobs=-1, verbose=2)
grid_search.fit(X, y)
# 최상의 하이퍼파라미터 및 성능 출력
print("Best hyperparameters: ", grid_search.best_params_)
print("Best performance: ", grid_search.best_score_)
위의 예시 코드에서는 먼저 csv 파일에서 데이터를 로드하고, 피처(X)와 타깃(y)으로 분할합니다. 그런 다음 'param_grid'를 사용해서 하이퍼파라미터 그리드를 정의해 줍니다. 사용할 모델(xgb.XGBRegressor())을 정의한 다음 scikit-learn의 GridSearchCV를 사용해서 그리드 서치를 수행합니다. 교차 검증 폴드 수(cv=3), 실행할 병렬 작업의 수(n_jobs=-1), 상세 출력(verbose=2)들도 지정해 줍니다. 마지막으로 하이퍼파라미터와 성능을 출력해서 확인해 봅니다.
XGBoost의 실제 응용 프로그램 사례
XGBoost는 Kaggle 대회나 산업에서 사용된 사례를 비롯해서 다양한 실제 애플리케이션에서 매우 효과적인 머신 러닝 알고리즘임이 입증되었습니다.
인기 있는 데이터 고학 경쟁 플랫폼인 Kaggle은 많은 수상 이력에서 XGBoost를 사용했습니다. 예를 들어, Higgs Boson Machine Learning Challenge에서 우승한 팀이 이 알고리즘을 사용했습니다. 이 외에도 XGBoost는 Allstate Claims Severity 대회ㅡ Santander Customer Satisfoaction 대회, Rossmann Store Sales 대회 등 다양한 Kaggle 대회에서 사용되었습니다.
실제 산업에서는 XGBoost가 신용 위험 평가, 사기 탐지, 이탈 예측, 자연어 처리 등 다양한 애플리케이션에서 사용되었습니다. 예를 들면, Santander Bank는 XGBoost를 사용해서 특정 제품을 구매할 가능성이 높은 고객을 식별했고 그 결과 매출이 크게 증가했다고 합니다. 또 다른 예로는, Airbnb는 XGBoost를 사용해서 검색 순위 알고리즘을 최적화해서 사용자 참여와 전환율을 향상시켰습니다.
의료 분야에서는 XGBoost를 활용해서 당뇨병, 암, 심장병과 같은 질병의 위험을 예측하는 데 사용되었습니다. 한 연구에서는 연구원들이 XGBoost를 사용해서 화자 데이터를 기반으로 제2형 당뇨병 발병 위험을 예측했으며 90% 이상의 예측 정확도를 달성했다고 합니다!
이미지 분류나 객체 탐지와 같은 작업들을 위해 XGBoost는 컴퓨터 비전 분야까지 적용되었습니다. 95% 이상의 정확도로 유방암의 이미지를 분류하는 데 성공했다고 합니다.
전반적으로 XGBoost는 실제 응용 프로그램으로 광범위하게 사용되고 있고, 다양한 도메인에서 매우 효과적인 알고리즘으로 입증되었습니다.
