LightGBM, XGBoost의 모체가 되는 Gradient Boosting Machine의 분할에 대해서 정리해보았다.
GBM (Gradient Boosting Machine)에서 "분할"이라는 용어는 주로 각 트리의 분기(split)를 의미한다.
구체적으로, 각 트리의 노드가 데이터를 어떻게 분할하는지에 대한 과정을 설명하는 용어다.
1. GBM의 기본 개념
GBM은 부스팅(Boosting) 알고리즘의 일종으로, 여러 개의 약한 학습기(보통 결정 트리)를 순차적으로 학습시켜서 강한 학습기를 만드는 방식이다. 각 트리는 이전 트리가 잘못 예측한 부분을 수정하기 위해 학습한다.
- 트리 분할: 각 결정 트리는 입력 데이터를 특정 기준에 따라 분할(split)하여 예측을 수행하게 된다.
- 분할 기준은 피쳐에 따라 결정된다. 이때, 분할은 데이터를 두 개 이상의 그룹으로 나누는 과정이다.
2. 결정 트리에서의 분할 (Split)
결정 트리에서 분할은 어떤 기준을 사용하여 데이터를 자르는지에 대한 과정이다. 주로 각 특징에 대해 조건을 정해서 데이터를 두 개의 그룹으로 나누는 작업을 한다.
예를 들어, 특정 트리에서 첫 번째 분할은 "특징 A가 10보다 작은지 큰지에 따라" 데이터를 나누는 방식이다.
두 번째 분할은 "특징 B가 5보다 큰지 작은지"에 따라 데이터를 나누는 방식이다. 이와 같은 식으로 분할이 진행된다.
GBM에서는 각 트리가 이전 트리에서 학습한 오류를 보정하기 위해 학습되기 때문에, 각 트리의 분할 방식이 중요하다.
3. GBM에서의 분할 기준
GBM은 다수의 트리가 순차적으로 학습되기 때문에, 각 트리의 분할이 중요한 역할을 한다.
일반적으로 트리의 분할 기준은 손실 함수(loss function)를 최소화하는 방향으로 선택된다.
주로 사용하는 방법은
- 최소화할 손실 함수: 분할을 결정하는 중요한 기준은 손실 함수이다. 예를 들어, 회귀 문제에서는 평균 제곱 오차(MSE), 분류 문제에서는 로그 손실(Log Loss)을 사용한다. 각 트리는 데이터를 어떻게 분할할지 결정할 때 손실 함수를 최소화하는 방향으로 분할 수행한다.
- 정보 이득 (Information Gain): 결정 트리에서 분할 기준으로 가장 널리 사용되는 방법은 정보 이득을 최대화하는 것입니다. 즉, 데이터를 분할했을 때 불순도(impurity)를 얼마나 줄일 수 있는지에 따라 분할을 결정한다.
- 불순도는 각 노드의 데이터가 얼마나 섞여 있는지를 나타내는 값이다. 불순도가 낮을수록 하나의 클래스가 더 많고, 높을수록 클래스가 혼합되어 있음을 의미한다.
4. GBM에서 트리의 분할 과정
GBM의 트리는 각 단계마다 이전에 학습한 모델의 오차를 보정하려고 한다. 즉, 각 트리의 분할 기준은 이전 트리가 잘못 예측한 부분을 수정하기 위한 방향으로 설정된다.
- 첫 번째 트리는 처음부터 주어진 데이터를 분할한다. 이때, 손실 함수(예: MSE)가 최소화되는 방향으로 분할이 이루어진다.
- 두 번째 트리는 첫 번째 트리가 잘못 예측한 부분에 대해 학습한다. 따라서 두 번째 트리는 첫 번째 트리의 예측 오류를 최소화하는 방식으로 분할을 한다.
- 세 번째 트리는 첫 번째와 두 번째 트리에서 잘못 예측한 부분을 다시 보정하면서 분할을 진행한다.
이런 방식으로 GBM에서는 각 트리가 이전 트리들의 오차를 보정하는 방식으로 학습을 계속한다.
6. GBM에서 분할이 중요한 이유
- 잘못된 분할이 이루어지면, 그 분할을 통해 얻어진 모델이 잘못된 예측을 계속 반복하게 된다. 그래서 각 트리의 분할 기준은 매우 중요하다.
- 오차 보정: GBM은 각 트리가 이전 트리의 예측 오류를 수정하는 방식으로 학습되므로, 트리 분할이 적절히 이루어지지 않으면 오차 보정이 잘 되지 않아 성능이 저하된다.
GBM의 분할은 결정 트리에서 데이터를 두 개 이상의 그룹으로 나누는 기준을 의미한다.
각 트리는 손실 함수나 불순도를 최소화하는 방식으로 분할을 결정하며, GBM에서는 각 트리가 이전 트리의 오차를 보정하기 위해 데이터를 분할한다.
이러한 분할 과정을 거치면서 점점 예측값의 정확도가 높아지게 된다.
'데이터 사이언스 공부' 카테고리의 다른 글
| 00. np.log와 np.log1p의 차이 (0) | 2024.11.14 |
|---|---|
| 00. numpy로 구현한 경사하강법 코드 흐름 (0) | 2024.11.13 |
| 00. LightGBM, XGBoost에서의 eval_set 파라미터 (0) | 2024.11.11 |
| 00. cross_val_score가 사용하는 KFold 방식 (0) | 2024.11.10 |
| 00. XGBoost의 래퍼 클래스 Wrapper Class (0) | 2024.11.09 |