그래디언트 부스팅의 최적화 과정은 반복적으로 이루어지며, 각 반복에서는 현재 모델의 오차를 줄이기 위해 새로운 예측기(주로 의사결정나무)를 추가합니다. 이 과정은 손실 함수의 그래디언트를 사용하여 모델을 점진적으로 개선하는 방식으로 진행됩니다. 이번에는 그래디언트 부스팅의 최적화 과정을 단계별로 자세히 설명합니다.
1. 초기 모델 설정
최적화 과정은 모든 데이터 포인트에 대해 동일한 값을 예측하는 매우 단순한 초기 모델로 시작합니다. 회귀 문제의 경우, 이 값은 일반적으로 타겟 변수의 평균이 될 수 있습니다. 분류 문제의 경우, 로그 오즈 비를 사용하는 경우가 많습니다.
2. 손실 함수의 그래디언트 계산
각 반복에서, 그래디언트 부스팅은 현재 모델에 의해 생성된 오차를 평가하기 위해 손실 함수를 사용합니다. 그런 다음, 각 데이터 포인트에 대해 손실 함수의 그래디언트(또는 부정 그래디언트)를 계산합니다. 이 그래디언트는 모델의 예측이 실제 값에서 얼마나 벗어났는지, 그리고 예측을 어떤 방향으로 조정해야 손실을 줄일 수 있을지를 나타냅니다.
3. 새로운 예측기 학습
그래디언트 부스팅은 이 그래디언트를 타겟으로 사용하여 새로운 예측기(의사결정나무)를 학습시킵니다. 이 단계에서 학습된 나무는 이전 모델의 오차를 보정하는 역할을 합니다. 즉, 새로운 나무는 이전 단계의 잔차(실제 값과 이전 모델의 예측 값 사이의 차이)를 예측하려고 합니다.
4. 학습률을 사용한 업데이트
새로운 예측기가 학습되면, 그래디언트 부스팅은 학습률(learning rate)이라는 하이퍼파라미터를 사용하여 이 예측기의 기여도를 조정합니다. 학습률은 새로운 예측기가 최종 모델에 미치는 영향을 제어합니다. 낮은 학습률을 사용하면 더 많은 예측기가 필요하지만, 모델의 과적합 위험을 줄일 수 있습니다.
5. 반복
이 과정은 미리 정의된 반복 횟수에 도달하거나, 모델의 성능이 특정 기준 이상으로 개선되지 않을 때까지 반복됩니다. 각 반복마다 새로운 예측기가 추가되어 모델의 성능을 점진적으로 개선합니다.
최적화의 복잡도
그래디언트 부스팅의 최적화 과정은 강력하지만 복잡할 수 있습니다. 모델의 성능을 최대화하기 위해 적절한 손실 함수의 선택, 학습률, 반복 횟수, 그리고 트리의 깊이와 같은 하이퍼파라미터의 조정이 필요합니다. 이러한 하이퍼파라미터는 교차 검증과 같은 기법을 사용하여 최적화할 수 있습니다.
그래디언트 부스팅의 최적화 과정을 직접 구현하기는 매우 복잡합니다. 간단한 그래디언트 부스팅 알고리즘의 구현 예를 제시하겠습니다. 실제 복잡한 데이터셋과 문제에는 scikit-learn, XGBoost, LightGBM 같은 라이브러리를 사용합니다.
이 구현에서는 평균 제곱 오차(MSE)를 손실 함수로 사용하며, 각 단계에서의 그래디언트를 이용하여 의사결정나무를 학습시킵니다.
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
# 가상의 회귀 데이터셋 생성
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 그래디언트 부스팅 파라미터
n_estimators = 100 # 부스팅 단계 수
learning_rate = 0.1 # 학습률
tree_max_depth = 3 # 의사결정나무의 최대 깊이
# 초기 예측을 평균 값으로 설정
y_pred = np.full(np.shape(y_train), np.mean(y_train))
models = [] # 각 단계의 모델을 저장할 리스트
for _ in range(n_estimators):
# 그래디언트 계산 (실제 값 - 예측 값)
gradient = y_train - y_pred
# 새로운 모델을 그래디언트에 맞추어 학습
model = DecisionTreeRegressor(max_depth=tree_max_depth)
model.fit(X_train, gradient)
# 예측 업데이트
y_pred += learning_rate * model.predict(X_train)
# 모델 저장
models.append(model)
# 테스트 데이터에 대한 예측
y_test_pred = np.full(np.shape(y_test), np.mean(y_train))
for model in models:
y_test_pred += learning_rate * model.predict(X_test)
# 성능 평가
mse = mean_squared_error(y_test, y_test_pred)
print(f"Test MSE: {mse:.3f}")
이 코드는 다음 단계를 따릅니다.
- 가상의 데이터셋을 생성하고 훈련/테스트 세트로 분할합니다.
- 초기 예측값을 데이터셋의 타겟 변수의 평균으로 설정합니다.
- 반복적으로 의사결정나무를 학습시켜 각 단계에서의 그래디언트(오차)를 줄여 나갑니다.
- 각 나무의 예측을 학습률에 따라 조정하여 최종 예측값을 업데이트합니다.
- 학습된 모델을 사용하여 테스트 데이터에 대한 예측을 수행하고, 평균 제곱 오차를 계산하여 모델의 성능을 평가합니다.
예제가 그래디언트 부스팅 알고리즘을 이해하는 데 도움이 되셨길 바랍니다.
'트리 모형' 카테고리의 다른 글
깊이 우선 성장 (0) | 2024.02.15 |
---|---|
XGBoost란? (0) | 2024.02.15 |
그래디언트 부스팅의 간단한 파이썬 구현 (0) | 2024.02.12 |
그래디언트 부스팅이란? (1) | 2024.02.12 |
의사결정나무 기준 코드 구현 (0) | 2024.02.11 |