XGBOOST

SSO·2024년 10월 24일

XGBoost (Extreme Gradient Boosting)

gdm 확장한 모델
개념: XGBoost는 gradient boosting의 한 형태로, 여러 개의 결정 트리(주로 결정 트리)를 순차적으로 학습하여 강력한 예측 모델을 만드는 고성능 앙상블 학습 기법이다.(Boosting)
각 트리는 이전 트리가 만든 오류를 줄이기 위해 학습한다. ( = 각 트리가 이전 트리의 오차를 기반으로 수정 = Gradient Descent)

  • Regularization: 과적합을 방지하기 위해 L1 및 L2 정규화가 적용된다.
  • Parallelization: 여러 트리를 동시에 학습할 수 있는 기능이 있어 계산 효율성을 높인다.
  • Tree Pruning: 트리의 가지치기를 통해 불필요한 노드를 제거하고, 최종 모델의 간결성을 높인다.
  • 병렬 처리 가능 = 빠른 학습 가능
  • 조기 종료 = 과적합을 방지
  • 정규화 (별도로 정리 필요 없음)
  • 최적화 분할 찾고,목표 함수 최소화 목적(= 가중치 업데이트 = 함수의 값이 줄어들도록)
  • XGBoost는 각 트리의 예측 결과를 가중합하여 최종 예측을 수행
  • 전반적으로 sklearn과 비슷한 구성

XGBoost의 원리

  1. 초기 모델 학습: 첫 번째 결정 트리를 학습시켜 초기 모델을 만든다.
  2. 잔여 오차 계산: 초기 모델의 예측 결과와 실제 값 간의 잔여 오차를 계산한다.
  3. 잔여 오차 학습: 잔여 오차를 예측하는 새로운 결정 트리를 학습시킨다.
  4. 모델 업데이트: 새로운 결정 트리를 기존 모델에 추가하여 모델을 업데이트한다.
  5. 반복: 잔여 오차가 충분히 작아질 때까지 2~4 단계를 반복한다.

1. 분류 문제에 대한 코드 (XGBClassifier 사용)

<붓꽃(Iris) 데이터셋 예제>

import xgboost as xgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 준비: 특징(X)과 레이블(y)로 분리
data = load_iris()
X = data.data
y = data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# XGBoost 모델 생성 및 훈련
model = xgb.XGBClassifier()
model.fit(X_train, y_train)

# 테스트 데이터를 사용하여 예측을 수행
preds = model.predict(X_test)

# 평가: 정확도 출력
accuracy = accuracy_score(y_test, preds)
print("Accuracy:", accuracy)

2. 회귀 문제에 대한 코드 (XGBRegressor 사용)

아래는 회귀 문제를 다루는 코드로, 아이리스 데이터셋이 아닌 다른 회귀 데이터셋을 사용하는 것이 일반적이다. 예를 들어, 보스턴 주택 가격 데이터셋을 사용할 수 있다.

회귀 문제에 사용되며, 평균 제곱 오차(MSE)를 평가한다.

import xgboost as xgb
from sklearn.datasets import load_boston  # 예시 데이터셋
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 데이터 준비: 특징(X)과 레이블(y)로 분리
data = load_boston()
X = data.data
y = data.target

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# XGBoost 모델 생성 및 훈련
xgb_model = xgb.XGBRegressor(n_estimators=100, learning_rate=0.1, max_depth=3, random_state=42)
xgb_model.fit(X_train, y_train)

# 테스트 데이터를 사용하여 예측을 수행
y_pred_xgb = xgb_model.predict(X_test)

# 평가: MSE 출력
mse_xgb = mean_squared_error(y_test, y_pred_xgb)
print(f'XGBoost 모델의 MSE: {mse_xgb}')

3. 궁금한점

<1> 왜 스케일링 작업을 하지 않는가? 모델의 특성과 데이터의 특성에 따라 달라진다.

  • 모델의 특성:
    1. 트리 기반 모델: XGBoost와 같은 결정 트리 기반 모델은 스케일링에 민감하지 않다. 이 모델들은 데이터를 분할할 때 특성의 순서에 기반하므로, 특성의 스케일이 결과에 큰 영향을 미치지 않는다. 즉, 특정 특성이 다른 특성보다 더 큰 값의 범위를 가지고 있더라도, 모델의 분류나 회귀 결과에는 큰 영향을 주지 않다.
    2. 데이터의 범위: 붓꽃 데이터셋의 특성들은 모두 비슷한 범위(예: 센티미터)로 측정된다. 모든 특성이 동일한 단위를 가지고 있고, 유사한 크기 범위 내에 있기 때문에 스케일링의 필요성이 낮다.
  • 언제 스케일링이 필요한가?
    스케일링이 필요한 경우는 다음과 같습니다:
    - 거리 기반 모델: KNN, SVM, 선형 회귀 등 거리 계산이 중요한 모델은 스케일링을 통해 특성의 영향을 균일하게 만들어야 합니다.
    - 특성의 범위 차이: 특성이 서로 다른 단위(예: 센티미터와 킬로그램)나 범위를 가진 경우, 스케일링을 통해 모델 성능을 향상시킬 수 있습니다.
    결론적으로, 사용 중인 모델과 데이터의 특성을 고려하여 스케일링 여부를 결정하는 것이 중요합니다.

<2> XGBRegressor에서는
from sklearn.metrics import mean_squared_error를,
XGBClassifier에서는
from sklearn.metrics import accuracy_score를
사용하는게 맞는가?

맞다.
회귀 문제 (XGBRegressor)에서는 예측 성능을 평가하기 위해 MSE (Mean Squared Error)를 사용한다. 이를 위해 mean_squared_error를 가져온다.

분류 문제 (XGBClassifier)에서는 모델의 정확도를 평가하기 위해 정확도 (Accuracy)를 사용한다. 이를 위해 accuracy_score를 가져온다.

요약
XGBRegressor:
사용: mean_squared_error
XGBClassifier:
사용: accuracy_score

profile
개발자로 한걸음씩!

0개의 댓글