기본기/ML

[ML] ML Models 2 - Tree기반 모델

dohyeon2 2025. 4. 1. 14:11

목차

    안녕하세요 윤도현입니다. 이번 글에서는 머신러닝 모델 중 Tree 기반 모델들에 대해 살펴보도록 하겠습니다. Decision Tree Regressor부터 Random Forest, AdaBoost, Gradient Boosting Regressor 모델들까지 순서대로 설명해보겠습니다.

     

    관련글
    [1] [ML] ML Models 1 - 선형 모델
    [2][ML] ML Models 2 - Tree기반 모델
    [3][ML] ML Models 3 - 실습(with Boosting Model)

     

    1. Tree 기반 모델이란?

    트리 기반 모델은 알고리즘에서 탐색 문제를 풀어보셨다면 아마 익숙하실 것 같습니다. 나뭇가지처럼 여러 개의 분기로 나뉘어 데이터 내의 규칙성을 찾아 Tree 구조로 데이터를 분류/회귀하는 모델을 말합니다. 트리 기반 모델은 선형 모델들과 달리 "비선형 데이터"의 패턴을 파악할 수 있다는 장점이 있으며, 최근 캐글에서 많이 사용되는 XGBoost, LightGBM, CatBoost 등이 대표적인 트리 기반 모델들입니다.

    Tree 기반 모델들의 경우 의사결정 나무(Decision Tree)를 시작으로 Random Forest, AdaBoost, GBM 순으로 발전해 왔습니다.
    이번 글에서는 Decision Tree~AdaBoost 모델까지 간단하게 다루고 GBM 모델들에 대해 자세히 다뤄보겠습니다.
     

    2. 여러가지 Tree 기반 모델

    2.1 의사결정 나무(Decision Trees)

    의사결정 나무는 tree-like 구조의 데이터 분류/회귀 모델로 여러가지 규칙을 순차적으로 적용하면서 독립 변수 공간을 분할합니다. Classification과 Regression을 동시에 할 수 있다는 장점이 있습니다. 저는 분류(범주형 데이터)보다는 회귀(연속형 데이터)에 집중하여 설명해보겠습니다.

    2개의 독립변수(몸통 길이, 지느러미 길이)로 종속변수(체중)를 예측하는 문제를 예로 들어보겠습니다. 오른쪽 붉은색으로 박스친 부분의 해석은 다음과 같습니다.
     
    해석. 몸통 길이가 55.0 미만(≤55.0)이고 지느러미 길이가 16.5 미만(≤16.5)이면 체중은 500g 이다.
     
    여기서 나온 500g은 몸통 길이가 55 미만이고, 지느러미 길이가 16.5 미만이라는 조건을 만족하는 샘플들의 종속변수(체중)의 평균값입니다. 의사결정 나무를 그림과 같은 연속형 데이터 뿐만 아니라 범주형 데이터 또한 처리할 수 있습니다. 또한 선형회귀 모델과 다르게 비선형 데이터를 처리할 수 있고 다중공선성 문제를 고려하지 않아도 된다는 장점이 있습니다.
     

    의사결정 나무 학습과정

    의사결정 나무의 학습은 크게 네 단계로 진행됩니다.
     
    1. 데이터 입력
    의사결정 나무로 연속형 데이터를 회귀하는 모델을 학습하는 경우, 모델은 분산(Variance)을 최소화하는 방향으로 학습됩니다. 여기서 말하는 분산이란 각 노드에 들어온 y^(체중 예측값)의 평균으로 예측했을 때 y(체중 실제값)과의 오차 제곱합(RSS)이고, 트리는 이 값을 최소화하는 방향으로 학습합니다. (통계학에서 흔히 말하는 분산보다는 예측 오차의 크기라고 해석하는게 맞습니다.)
    예를들어 저는 2개의 독립변수(몸통길이, 지느러미 길이) X와 종속변수(체중) Y를 준비해보겠습니다.

    • X = [15,3], [30,9], [45,15] ... [75,27]
    • Y = [350, 680, 1150, ... 2370]

     
    2. 가능한 모든 분할 기준 탐색
    모든 feature(몸통길이, 지느러미길이)에 대해 가능한 threshold(임계값)를 순차적으로 시험하며 다음 loss를 계산합니다:
    예를들어,

    • 몸통 길이 ≤ 11, 12, 13, 14...
    • 지느러미 길이 ≤ 3, 4, 5, 6...

    → 이 Loss(RSS)를 최소화하는 (feature, threshold) 조합을 split 기준으로 선택합니다.

    예를들어 몸통 길이 ≤ 11 일때 loss=3, 몸통 길이 ≤ 12 일때 loss=4, 몸통 길이 ≤ 13 일때 loss=1 이라면

    몸통 길이 ≤ 13으로 분할 진행!
     
    3. 가장 좋은 split으로 데이터 분할 
    예를들어, 몸통길이 ≤ 55.0이 가장 좋은(loss 최소) split이라면 아래와 같이 노드가 구성됩니다.

      • X_left = [15,3], [30,9], [45,15], Y_left = [350, 680, 1150], Y_avg = 726.6g
      • X_right = [75, 27], Y_right = 2350, Y_avg = 2350g

     
     
    4. 반복
    위에서 생성된 좌/우 자식 노드 각각에 대해 동일하게 1~3단계를 반복합니다. 이 과정은 다음 조건 중 하나를 만족할 때까지 계속됩니다:

    • 더 이상 분할 가능한 threshold가 없거나,
    • 노드에 포함된 데이터 수가 너무 작거나 (min_samples_split 미만),
    • 트리가 지정한 최대 깊이(max_depth)에 도달한 경우 등

    이렇게 재귀적으로 트리를 성장시켜 학습을 마칩니다.

    의사결정 나무의 한계점

    이러한 의사결정 나무에는 몇가지 단점이 존재했습니다.


    1. 과적합 (Overfitting)

    • 트리가 깊어질수록 훈련 데이터에 너무 잘 맞추게 됨
    • 훈련 정확도는 높지만 테스트 성능은 낮아짐
    • 특히 노이즈나 이상치에도 민감하게 반응함

    2. 고분산 (High Variance)

    • 데이터셋이 조금만 바뀌어도 트리 구조가 크게 달라짐
    • 즉, 예측이 불안정하고 일관성이 떨어짐

    3. 예측 성능의 한계

    • 단일 트리는 복잡한 비선형 문제에선 성능이 제한적일 수 있음


    이러한 의사결정 나무의 문제점들을 해결하기 위해 랜덤 포레스트라는 기법이 등장하게 되었습니다.


    2.2 랜덤 포레스트(Random Forest)

    랜덤 포레스트는 앙상블 학습 기법중의 하나로, 여러 개의 의사결정 나무를 조합하여 더 강력한 분류 모델을 구축하는 방법입니다. 이때 앙상블이란 머신러닝에서 여러개의 모델을 학습시켜 그 모델들의 예측결과들을 이용해 하나의 모델보다 더 나은 값을 예측하는 방법을 말합니다. 랜덤 포레스트 또한 훈련 과정에서 구성한 여러 개의 의사결정 나무로부터 평균 예측치를 사용함으로써 하나의 의사결정 나무보다 더 나은 값을 예측하게 됩니다.
     

    랜덤 포레스트 학습과정

    랜덤 포레스트 회귀 모델의 학습은 크게 네 단계로 진행됩니다. 
     
    1. 데이터 샘플링(Bootstrap Sampling)
    원본 데이터에서 중복을 허용하여 여러 개의 sample datasets를 생성합니다. 각 sample datasets은 원본 데이터와 동일한 크기를 가지며, 일부 데이터 포인트는 여러 번 선택될 수 있습니다. 이렇게 원본 데이터에서 중복을 허용해서 생성된 데이터셋을 Bootstrap dataset이라고 합니다. 
     
    2. 의사결정 나무 생성(with Bootstrap sample dataset)
    각 sample dataset로 의사결정 나무를 학습시킵니다. 이때, 각 노드에서 분할할 특성을 선택할 때 전체 특성 중 무작위로 선택된 일부만(몸통길이, 지느러미 길이가 있을 경우 몸통길이만)을 고려합니다. 이를 통해 나무들 간의 상관성을 낮추고 모델의 다양성을 높입니다.
     
    3. 반복
    위의 과정을 지정된 수의 나무가 생성될 때까지 반복합니다. 일반적으로 수백~수천개까지 나무를 생성합니다.
     
    4. OOB(Out of Bag) 평가
    학습에 사용되지 않는(Bootstrap dataset에 포함되지 않는) 데이터셋을 OOB dataset 이라고 합니다. 각 의사결정 나무는 OOB dataset으로 해당 tree의 예측력을 측정합니다. 모든 의사결정 나무에 대해 OOB-score를 평가하고 평균내면 마치 test dataset 없이 교차검증한 효과를 얻을 수 있습니다.
     
    이렇게 학습된 랜덤포레스트(여러 개의 의사결정 나무)모델의 예측값을 종합하여 그 평균값으로 예측을 진행합니다.
    (분류 모델의 경우 과반수 투표)

    2.3 AdaBoost

    부스팅(boosting)은 성능이 약한 학습기(weak learner)를 여러 개 연결하여 강한 학습기(strong learner)를 만드는 앙상블 학습 기법입니다. 여러개의 독립적인 모델들을 병렬적으로 학습시키는 배깅 방식과 달리 부스팅 방법의 아이디어는 "앞에서 학습된 모델이 틀린 샘플에 가중치를 부여해서 더나은 모델로 발전시키는 것"입니다. 부스팅 방법에는 여러 종류가 있는데, 그 중 가장 유명하고 인기 있는 알고리즘은 에이다부스트(AdaBoost, Adaptive Boosting)와 그래디언트 부스팅(Gradient Boosting)입니다.
     
    에이다부스트(AdaBoost)는 과소적합(underfitted)됐던 학습 데이터 샘플의 가중치를 높이면서 새로 학습된 모델이 학습하기 어려운 데이터에 더 잘 적합되도록 하는 방식을 말합니다. 에이다부스트의 단계를 설명하면 다음과 같습니다.

    1. 첫 번째 약한 학습기가 첫번째 분류기준(D1)으로 + 와 - 를 분류
    2. 잘못 분류된 데이터에 대해 가중치를 부여(두번째 그림에서 커진 + 표시)
    3. 두번째 약한 학습기가 두번째 분류기준(D2)으로 +와 -를 다시 분류
    4. 잘못 분류된 데이터에 대해 가중치를 부여(세번째 그림에서 커진 - 표시)
    5. 세 번째 약한 학습기가 세번째 분류기준(D3)으로 +와 -를 다시 분류해서 오류 데이터를 찾음
    6. 마지막으로 분류기들을 결합하여 최종 예측 수행(네번째 그림)

     

    2.4 GBM(Gradient Boosting Model) = 그래디언트 (Gradient) + 부스팅 (Boosting)

    GBM을 이해하는 가장 쉬운 방법은 Residual fitting으로 이해하는 것입니다. 아주 간단한 모델 A를 통해 y를 예측하고 남은 잔차 (residual)을 다시 B라는 모델을 통해 예측하고 A+B 모델을 통해 y를 예측한다면 A보다 나은 B 모델을 만들 수 있게 되죠. 이러한 방법을 계속하면 잔차는 계속해서 줄어들게되고, training set을 잘 설명하는 예측 모형을 만들 수 있게 됩니다.

    위 그림을 보시면 tree 1을 통해 예측하고 남은 잔차를 tree2를 통해 예측하고, 이를 반복함으로서 점점 잔차를 줄여나가는 것을 볼 수 있습니다. 이 때, 각각의 모델 tree1,2,3 을약한 분류기 (weak learner), 이를 결합한 분류기를 강한 분류기 (strong learner)라고도 합니다. 보통 약한 분류기로는 간단한 의사결정나무 (decision tree)를 많이 사용합니다. 이를 Gradient boosting tree라고도 하는데, 구현한 대표적인 라이브러리로 XGboost를 들 수 있습니다. XGBoost는 python, R로 이용할 수 있습니다. 

     

    GBM 학습 과정

    학습 과정은 2개의 독립변수(성별,키)로 1개의 종속변수(몸무게)를 회귀하는 모델을 학습한다고 가정하겠습니다.

    1. 첫번째 모델(초기 모델) 학습

    초기 모델은 일반적으로 데이터의 평균값으로 초기화됩니다. 50kg이라고 가정하겠습니다.

     

    2. 첫번째 모델(초기 모델)에서 잔차 계산

    첫 번째 모델, 즉 의사결정나무는 잔차(실제 몸무게에서 초기 예측값을 뺀 값)를 계산하고 이를 학습합니다. 의사결정나무는 앞서 이야기 한 것처럼 모든 feature의 모든 데이터 포인트를 고려해 평균제곱오차 (MSE)가 최소가 되는 값을 분기점으로 택해 분기해 나갑니다.

    첫번째 모델은 잔차를 학습하고 잔차가 가장 작아지는 분기점으로 Height <=171.5를 택해 분기했으며 각 그룹의 예측값은 각각 -7.25와 7.25가 되었습니다. 이 값을 초기 예측값에 더해 최종 예측값 42.5, 57.5kg 이 되었습니다.

     

    3. 두번째 모델에서 잔차 계산

    두번째 모델 역시 잔차(실제 몸무게에서 업데이트된 예측값을 뺀 값)를 계산하고 이를 학습합니다. 앞선 과정과 같이 모든 feature의 모든 데이터 포인트를 고려해 평균제곱오차가 최소가 되는 값을 분기점으로 택해 분기해 나갑니다.

    이번에는 Height <=179.5를 기준으로 분기했으며 각 리프의 예측값은 -1.295와 5.1이 되었습니다. 이를 앞선 모델의 최종 예측값에 더하면 다시 최종 예측값 41.205, 62.6kg이 되었습니다.

     

    첫번째 모델이 학습한 잔차보다 두번째 모델이 학습한 잔차가 더 줄어들고, 최종 예측값이 점차 실제값에 가까워지는 것을 볼 수 있습니다. 이 과정을 반복하여 모델을 순차적으로 추가해나가면 부스팅된 모델의 최종 예측값은 앞서 나온 모든 예측값들의 합으로 업데이트됩니다. 

     

    2.5 XGBoost, LightGBM, CatBoost

    XGBoost, LightGBM, CatBoost는 Gradient Boost 알고리즘을 기반으로 변형된 알고리즘 입니다.

      GBM의 어떤 버전인가?
    XGBoost 정규화(regularization), level-wise 성장 추가
    LightGBM histogram + leaf-wise 성장
    CatBoost ordered boosting + 범주형 피처 처리 강화

     

    각 알고리즘은 일반적으로 오픈소스 라이브러리 형태로 불러와서 사용합니다. 다음 글에서 실습을 하며 사용법을 정리해보겠습니다.

     


    Reference
    [1] [Machine Learning Advanced] 5강. 머신러닝 강의 - 기본 ML 모델 (의사결정 나무)
    [2] 핸즈온 머신러닝 github
    [3] Gradient Boosting Algorithm의 직관적인 이해

    '기본기 > ML' 카테고리의 다른 글

    [ML] ML Models 1 - 선형모델  (0) 2025.03.29