Ensemble Methods II

chelseey·2025년 5월 20일

Bias-Variance Tradeoff

데이터 생성 모델

y=f(x)+εy=f(x)+ε

x,yx,y : 모집단(population)에서 관측된 입력–출력 쌍
ε : 노이즈(오차) 항, ϵN(0,σ2)\epsilon \sim \mathcal{N}(0, \sigma^2)

함수 정의

  • 진짜 함수 f(x)f(x) : 입력 x와 y 사이의 실제 관계
  • 추정 함수 f^(x)\hat{f}(x) : 표본(sample) 데이터를 통해 학습된 모델의 예측 함수

예측 오차(Err) 정의

Err(x)=E[(yf^(x))2]=(E[f^(x)]f(x))2Bias2+E[(f^(x)E[f^(x)])2]Variance+σ2Irreducible error\text{Err}(x) = \mathbb{E}[(y - \hat{f}(x))^2] = \underbrace{(\mathbb{E}[\hat{f}(x)] - f(x))^2}_{\text{Bias}^2} + \underbrace{\mathbb{E}[(\hat{f}(x) - \mathbb{E}[\hat{f}(x)])^2]}_{\text{Variance}} + \underbrace{\sigma^2}_{\text{Irreducible error}}
  • Bias : 모델 추정치의 평균이 실제 함수에서 얼마나 벗어났는지
  • Variance : 표본마다 f^(x)\hat{f}(x)가 얼마나 변동하는가
  • Irreducible Error (σ2σ^2): 데이터 자체의 본질적 잡음.

복잡도↑ → Bias↓ but Variance↑
단순도↑ → Variance↓ but Bias↑

최적 모델은
전체 Err(Bias2+Variance+σ2)Err(Bias^2+Variance+σ^2)를 최소화하는 지점에 위치

Bias–Variance Tradeoff와 앙상블 기법의 역할

  • Bagging 은 모델 다양성으로 분산을 낮춤
  • Boosting 은 순차적 보완 학습으로 편향을 낮춤

Boosting

앞선 모델이 틀린 샘플에 집중하는 방식으로,
순차적으로(sequentially) 여러 약한 학습기(base learner)를 학습시켜
최종 예측을 개선하는 기법

  1. 초기 모델 h1h_1학습

  2. 오류 샘플 가중치 조정
    h1h_1이 잘못 예측한 데이터에 가중치를 높여 다음 학습에 반영

  3. 두 번째 모델 h2h_2 학습 → 전 단계 오류 보완

  4. 반복

AdaBoost (Adaptive Boosting)

이전 모델이 틀린 샘플의 가중치(weight)를 높여,
다음 모델이 이들을 더 중점적으로 학습하도록 함

Gradient Boosting

이전 모델의 오차(잔차, residual)를 다음 모델이 채워 나감

AdaBoost

Algorithm

훈련 샘플 {(xi,yi)}i=1m,yi{1,+1}\{(x_i, y_i)\}_{i=1}^m, y_i \in \{-1, +1\}
반복 횟수 T 설정
각 샘플의 초기 가중치 분포 D(1)(i)=1mD^{(1)}(i) = \frac{1}{m}

반복 학습 (for t=1,…,T)

  1. 기본 분류기 학습

    ft:x{1,+1} using weights D(t)f_t: x \mapsto \{-1, +1\} \text{ using weights } D^{(t)}
  2. 오류율 계산

    Et=i:ft(xi)yiD(t)(i)\mathcal{E}_t = \sum_{i: f_t(x_i) \neq y_i} D^{(t)}(i)
  3. 모델 가중치

    αt=12ln(1EtEt)\alpha_t = \frac{1}{2} \ln\left(\frac{1 - \mathcal{E}_t}{\mathcal{E}_t}\right)
  4. 샘플 가중치 업데이트

    D(t+1)(i)=D(t)(i)exp(αtyift(xi))Z(t)D^{(t+1)}(i) = \frac{D^{(t)}(i) \exp(-\alpha_t y_i f_t(x_i))}{Z^{(t)}}

: Z(t)Z^{(t)}는 가중치 합이 1이 되도록 정규화

  1. 최종 예측
    F(x)=sign(t=1Tαtft(x))F(x) = \text{sign}\left(\sum_{t=1}^T \alpha_t f_t(x)\right)

Round 1 결과

초기 가중치 분포 : D1(i)=110=0.1(i)D^1(i) = \frac{1}{10} = 0.1 \quad (\forall i)

첫 번째 약한 분류기 f1f_1 학습

  • 틀린 샘플 수: 3/10 → 오류율
    ϵ1=310=0.3\epsilon_1 = \frac{3}{10} = 0.3

  • 모델 가중치

    α1=12ln(1ϵ1ϵ1)=12ln(0.70.3)0.42\alpha_1 = \frac{1}{2} \ln\left(\frac{1 - \epsilon_1}{\epsilon_1}\right) = \frac{1}{2} \ln\left(\frac{0.7}{0.3}\right) \approx 0.42

가중치 업데이트 → D2D^2

각 샘플 i의 새로운 가중치는

D2(i)=D1(i)exp(α1yif1(xi))Z(1)D^2(i) = \frac{D^1(i) \exp(-\alpha_1 y_i f_1(x_i))}{Z^{(1)}}

정답 (yif1(xi)=+1y_i f_1(x_i)=+1)인 경우 :

D2(i)=0.1e0.420.065D^2(i) = 0.1 e^{-0.42} \approx 0.065

오답 (yif1(xi)=1y_i f_1(x_i)=-1)인 경우 :

D2(i)=0.1e+0.420.152D^2(i) = 0.1 e^{+0.42} \approx 0.152

→ 첫 모델이 틀린 3개 샘플의 가중치가 크게 올라가고(≈0.152),
맞춘 나머지 7개는 줄어듦(≈0.065)

Round 2

두 번째 약한 분류기 f2f_2 학습
D2D^2 가 반영된 데이터로 새로운 경계 학습

오류율 : ε2=0.21ε_2=0.21

모델 가중치

α2=12ln(1ε2ε2)=12ln(0.790.21)0.65\alpha_2 = \frac{1}{2} \ln\left(\frac{1-\varepsilon_2}{\varepsilon_2}\right) = \frac{1}{2} \ln\left(\frac{0.79}{0.21}\right) \approx 0.65

Round 3

다시 업데이트된 가중치 D3D^3
: f2f_2가 틀린 샘플의 가중치가 다시 상승

세 번째 약한 분류기 f3f_3 학습
: D3D^3 를 반영해 또 다른 경계 학습

오류율 : ε3=0.14ε_3=0.14

모델 가중치

α3=12ln(1ε3ε3)=12ln(0.860.14)0.92\alpha_3 = \frac{1}{2} \ln\left(\frac{1-\varepsilon_3}{\varepsilon_3}\right) = \frac{1}{2} \ln\left(\frac{0.86}{0.14}\right) \approx 0.92

흐름

매 라운드마다

  • 가중치 분포 DtD^t에 따라 약한 분류기 ftf_t를 학습

  • 오류율 εtε_t 계산 → 모델 가중치 αtα_t 결정

  • 오분류된 샘플의 가중치를 올려 다음 라운드에 더 집중 학습

εtε_t 가 작아질수록 αtα_t는 커져,
성능이 좋은 분류기는 최종 앙상블에서 더 큰 비중을 갖게 됨

AdaBoost 회귀 버전

손실 함수 선택

잔차(residual) 대신 세 가지 형태의 샘플별 손실 LiL_i을 쓸 수 있음

Linear :

Li=yi(p)(xi)yiDL_i = \frac{\left|y_i^{(p)}(x_i) - y_i\right|}{D}

Square law:

Li=(yi(p)(xi)yi)2D2L_i = \frac{\left(y_i^{(p)}(x_i) - y_i\right)^2}{D^2}

Exponential:

Li=1exp(yi(p)(xi)yiD)L_i = 1 - \exp\left(-\frac{\left|y_i^{(p)}(x_i)-y_i\right|}{D}\right)

가중치 갱신

샘플 가중치 업데이트 계수

Lˉ=i=1NLipi    β=Lˉ1Lˉ\bar{L} = \sum_{i=1}^{N} L_i p_i \implies \beta = \frac{\bar{L}}{1 - \bar{L}}

(pip_i : 현재 샘플 가중치)

각 샘플 ii의 다음 라운드 가중치는

D(t+1)(i)=D(t)(i)β1Li/Z(t)D^{(t+1)}(i) = D^{(t)}(i) \beta^{1-L_i} / Z^{(t)}

1Li1-L_i가 클수록(손실이 작을수록) 가중치가 더 증가

최종 예측

회귀든 분류 모두 가중합 방식을 사용

F(x)=t=1Tαtft(x)F(x) = \sum_{t=1}^{T} \alpha_t f_t(x)

Gradient Boosting

각 단계에서 이전 모델이 놓친 부분(잔차, residual)을 다음 모델이 학습하도록 함

Gradient Boosting = Gradient Descent + Boosting

• 손실 함수(Loss) : MSE

L=12i=1n(yiF(xi))2L = \frac{1}{2} \sum_{i=1}^{n} (y_i - F(x_i))^2

• 손실 함수의 Gradient
손실 함수 LL에 대한 모델의 예측값 F(xi)F(x_i)을 미분

LF(xi)=(yiF(xi))\frac{\partial L}{\partial F(x_i)} = -(y_i - F(x_i))
  • 초기 모델 학습
    : 첫 스윙 → F0F_0, 손실 = (yF0y−F_0)

  • 1차 학습 → F1=F0+f1F_1=F_0+f_1
    : 두 번째 스윙 → Δ₁ , 손실 감소 → (yF1)2(y−F_1)^2

  • 2차 잔차 학습 → F2=F1+f2F_2=F_1+f_2
    : 세 번째 스윙 → Δ₂ , 손실 추가 감소 → (yF2)2(y−F_2)^2

  • 최종 예측 F4=F3+f4F_4=F_3+f_4
    : 네 번째 스윙 → Δ₄, 손실 거의 0에 근접

→ 작은 보정(잔차 예측) 을 반복해 합산

Example 1

Example 2

  • Tree 1
    원본 yy를 예측
    오차(잔차)가 많이 남아 있음.

  • Tree 2
    남은 잔차 r(2)(x)=yf1(x)r^{(2)}(x) = y - f_1(x)를 목표로 두고
    두 번째 트리 f2(x)f_2(x) 를 학습.
    첫 트리가 놓친 부분(잔차)을 보정.

  • Tree 3
    다시 남은 잔차 r(3)(x)=y[f1(x)+f2(x)]r^{(3)}(x) = y - [f_1(x) + f_2(x)] 를 학습하는
    세 번째 트리 f3(x)f_3(x).
    점점 보정 폭이 작아지면서 전체 예측 F3(x)=f1+f2+f3F_3(x) = f_1 + f_2 + f_3
    가 Ground truth 곡선에 가까워짐

  • 전체 예측 합산
    FT(x)=f1(x)+f2(x)+f3(x)+F_T(x) = f_1(x) + f_2(x) + f_3(x) + \cdots
    각 트리는 잔차만을 예측해 누적 보정
    트리가 많아질수록 모델은 복잡한 패턴을 더 정교하게 캡처

Algorithm

초기 예측값 설정

f0(x)=argminγi=1NL(yi,γ)f_0(x) = \arg \min_{\gamma} \sum_{i=1}^{N} L(y_i, \gamma)

반복 보정 (for m=1 to M)

  • 잔차(음의 gradient) 계산
    : 현재 모델 fm1f_{m-1}가 틀린 만큼을 샘플별로 구함

    rim=L(yi,f(xi))f(xi)f=fm1r_{im} = - \frac{\partial L(y_i, f(x_i))}{\partial f(x_i)} \Bigg|_{f=f_{m-1}}

    rimr_{im} : m−1번째 모델이 i번째 샘플에 대해 틀린 정도

  • 회귀 트리
    : 입력 xix_i, 목표 rimr_{im}로 회귀 결정트리 hmh_m를 학습

  • 리프별 최적 보정량 계산
    RjmR_{jm} : m번째 트리가 만든 j번째 리프 영역 (샘플들을 모아 놓은 구간)

    γjm=argminγxiRjmL(yi,fm1(xi)+γ)\gamma_{jm} = \arg \min_{\gamma} \sum_{x_i \in R_{jm}} L(y_i, f_{m-1}(x_i) + \gamma)

    γjm\gamma_{jm} : 각 리프 RjmR_{jm} 안에서 얼마만큼 예측을 보정할지 최적값

  • 모델 업데이트

    fm(x)=fm1(x)+j=1Jmγjm1{xRjm}f_m(x) = f_{m-1}(x) + \sum_{j=1}^{J_m} \gamma_{jm} \mathbf{1}\{x \in R_{jm}\}

    리프 구간마다 계산된 γjm\gamma_{jm}를 더해 모델을 업데이트

Regularization

• Shrinkage (학습률, learning rate)

fm(x)=fm1(x)+ηj=1Jmγjm1(xRjm),0<η1f_m(x) = f_{m-1}(x) + \eta \sum_{j=1}^{J_m} \gamma_{jm} \mathbf{1}(x \in R_{jm}), \quad 0 < \eta \leq 1

ηη 가 작을수록 한 번에 보정하는 양이 줄어들어(느린 학습) 과적합 위험 감소

• Subsampling (Stochastic Gradient Boosting)

매 반복마다 전체가 아닌 데이터의 부분집합만 랜덤 샘플링해 트리를 학습
보통 replacement 없이 샘플링

• Early Stopping
학습 과정 중 검증 데이터(validation set)에 대한 오차가
더 이상 개선되지 않으면 반복 중단.

Variable importance

: Gradient Boosting에서의 변수 중요도

단일 트리 TmT_m 내에서 변수 jj의 중요도

트리 TmT_m에 말단 노드(terminal node)가 L개 있으면
→ 가능한 분할(split) 횟수는 L1L−1

각 분할 i에서 얻는 정보 이득(Information Gain, IGiIG_i)이 있고,
이 분할에 사용된 변수가 jj라면 IGiIG_i를 더해줌.

Importancej(Tm)=i=1L1IGi×1(spliti 변수=j)\text{Importance}_j(T_m) = \sum_{i=1}^{L-1} IG_i \times \mathbf{1}(\text{split}_i \text{ 변수} = j)

전체 앙상블(모든 M개의 트리)에 걸친 변수 jj의 중요도

M개의 트리를 평균내어 최종 중요도를 구함.

Importancej=1Mm=1MImportancej(Tm)\text{Importance}_j = \frac{1}{M} \sum_{m=1}^{M} \text{Importance}_j(T_m)

Variants of Gradient Boosting

  1. XGBoost (eXtreme Gradient Boosting)
  2. LightGBM (Light Gradient Boosting Machine)
  3. CatBoost
  4. Regularized Greedy Forest (RGF)
  5. H2O GBM

XGBoost (eXtreme Gradient Boosting)

Regularization

• 전체 목적 함수

Obj=i=1NL(yi,y^it1+ft(xi))순수 손실+Ω(ft)정규화 항\text{Obj} = \underbrace{\sum_{i=1}^{N} L(y_i, \hat{y}_i^{t-1} + f_t(x_i))}_{\text{순수 손실}} + \underbrace{\Omega(f_t)}_{\text{정규화 항}}

y^it1\hat{y}_i^{t-1} : 이전까지의 예측값
ftf_t : 이번 단계에 추가할 트리

• 정규화 항 Ω(ft)\Omega(f_t)

Ω(ft)=12λj=1Twj2+αj=1Twj\Omega(f_t) = \frac{1}{2}\lambda \sum_{j=1}^{T} w_j^2 + \alpha \sum_{j=1}^{T} |w_j|

T: 트리의 말단 노드 수
wjw_j : 각 말단 노드의 예측값(leaf weight)
λ: L2 페널티 강도
α: L1 페널티 강도

Handling missing values (결측치 처리)

분할 임계값(ex. x<0.6)을 고를 때 그 임계값 하나를 시험할 때마다
결측값을 왼쪽에 넣었을 때의 이득 vs 오른쪽에 넣었을 때의 이득 비교

  • x>1.9 로 분류할 경우 여러 클래스가 섞여 있기 때문에 불순도가 높음.
  • x<0.6 로 좌/우 노드를 나누면, 각 자식 노드의 불순도가 낮아짐.

가장 이득이 큰 (임계값, 결측 기본방향) 조합을 선택
: x<0.6 , 결측치는 항상 왼쪽으로

→ 별도의 결측치 보간(imputation) 없이,
각 분할 기준마다 최적으로 선택된 방향으로 자동 처리

Light GBM (Light Gradient Boosting Machine)

Leaf-wise growth (vs. Level-wise growth)

Level-wise growth (기존 XGBoost 등)
깊이(depth) 기준으로 한 레벨에 속한 모든 leaf 노드를 동시에 분할(split)

→ 같은 깊이의 모든 노드 분할을 강제하기 때문에,
손실 감소(gain)가 큰 노드만 골라 분할하는 것보다 효율이 떨어질 수 있음

Leaf-wise growth (LightGBM)
이득(gain)이 가장 큰 잎노드 하나만 골라 분할
그 다음에도, 전체 중 손실 감소량이 최대인 단일 잎노드를 분할하는 식으로 진행.

한쪽 가지(branch)가 깊게 자라나면서 가장 큰 손실 감소를 빠르게 달성

→ 특정 가지가 지나치게 깊게 파여 과적합(overfitting) 위험이 있을 수 있음

Gradient-based One-Side Sampling (GOSS)

: 잔차(gradient)가 큰 샘플에 집중하기 위해 관측치를 선별해서 트리 학습에 사용

  • 잔차(Residual) 기준으로 정렬
    이전 트리까지의 예측값과 실제값의 차이(잔차)를 구한 뒤,
    절댓값이 큰 순서(= 모델이 크게 틀린 순서)로 데이터를 내림차순 정렬

  • 상위 a%(ex. 20%) 전부 사용
    정렬된 데이터 중 절댓값 잔차 상위 20%를 무조건 학습에 포함
    모델이 가장 크게 실수한 사례에 집중하여 다음 트리를 학습

  • 하위 나머지 중 b%(ex. 10%)만 랜덤 샘플링
    나머지 80% 중에서 일부만 무작위 추출
    : 과도한 데이터 축소로 편향이 생기지 않도록,
    잔차 작은(잘 맞춘) 샘플도 포함

Exclusive Feature Bundling (EFB)

x1x_1x4x_4은 한 번도 두 컬럼이 “둘 다 0”이 되는 행이 없음.
x2x_2x3x_3도 한 번도 두 컬럼이 “둘 다 0”이 되는 행이 없음.
Exclusive 한 feature 쌍

• 피처 묶기 (EFB)
x1x_1x4x_4은 Exclusive 하므로, 둘을 하나로 합쳐도 정보가 겹치지 않음

  • 기준 컬럼을 잡음. (ex. x1x_1)
  • x1x_1 값은 그대로 두고
  • 오프셋(offset)을 더함
    : x4x_4에서 0이 아닌 모든 값에 x1의 최댓값(=3) 더해줌

• 충돌(conflict) 처리
x1x_1x4x_4 둘 다 원래 비어 있지 않고 nonzero 값을 가질 경우,
번들된 x14x_{14} 에서 숫자가 x4x_4로부터 온 건지 x1x_1로부터 온건지 알 수 없음.
→ 충돌 시 기준 피처의 원래 값을 사용

0개의 댓글