앙상블
여러 모델을 사용하여 일반화 성능을 높이는 방법으로 보팅(voting), 배깅(bagging), 부스팅(boosting), 스태킹(stacking) 등 다양한 방법이 있다.
가장 대표적으로 사용되는 모델이 랜덤 포레스트(random forest)와 XGBoost로 각각 배깅과 부스팅을 이용한 모델이다.
비정형 데이터를 이용할 때는 딥러닝이 뛰어난 성능을 보이지만, 정형 데이터에서는 앙상블만으로도 충분히 의미있는 성능을 내는 경우가 많다.
세부적으로 다양한 모델들이 있고, 이를 하나로 묶은 전체 모델이 있다. 전체 모델을 앙상블 모델(ensemble model)이라 하고, 앙상블 모델 속 개별 모델을 기저 학습기(base learner) 혹은 약한 학습기(week learner)라 한다. 랜덤포레스트를 예로 들면 랜덤포레스트 자체가 앙상블 모델이고 그 안 결정트리가 기저 학습기인 것이다.
보팅 (Voting)
좀 더 직관적으로 다수결 투표(majority voting)라고 하기도 한다. 분류 문제라면 각 기저 학습기에서 가장 많은 표를 받은 클래스로 최종 앙상블 모델이 분류하는 방식이다. 회귀 문제라면 기저 학습기의 예측값을 평균내는 방식으로 처리한다. 이때 가중치를 둘 수도 있다.
이진 분류 문제라 할 때 $ m $ 개의 기저 학습기 $ C_1, C_2, \cdots, C_m $ 을 학습시킨 후 다음과 같이 예측값을 구한다.
$$ \hat{y} = \operatorname{mode} \left\{ C_1 (x), C_2(x), \cdots, C_m (x) \right\} = \operatorname{sign} \left[ \sum_j^m C_j (x) \right] = \begin{cases} 1, & \quad \left(\sum _j C_j (x) \geq 0 \right) \\ -1, & \quad \,\,\,\, \text{otherwise} \end{cases} $$
모든 기저 학습기 $ m $ 의 에러율이 동일하게 $ \epsilon $ 이라 가정할 때 $ k $ 개 이상의 기저 학습기가 오답일 확률은 다음과 같다.
$$ P(x \geq k) = \sum_k^m \binom{m}{i=k} \epsilon^i (1-\epsilon)^{m-i} $$
실제로 앙상블이 틀릴 확률은 다음과 같다.
$$ P \left( X > \frac{m}{2} \right) $$
일반적으로 같은 훈련 데이터셋에 대해 서로 다른 기저 학습기를 훈련시킨다.
배깅 (Bagging)
동일한 훈련 세트를 사용하는 대신 원래 훈련 세트에서 부트스트랩 샘플(복원 추출된 무작위 샘플)을 여러 번 뽑아 각 개별 기저 학습기를 훈련시킨다. 이를 통해 불안정한 모델의 정확도를 향상시키고, 과적합 정도를 줄인다. 배깅 자체가 부트스트랩 집계(bootstrap aggregating)의 줄임말이다.
쉽게 말하자면 같은 모델을 서로 다른 데이터로 학습시켜 일반화 성능을 높이는 것이다. 최종 앙상블 모델의 결정은 보팅과 비슷하게 다수결 혹은 평균으로 결정한다.
여기서 복원 무작위 추출이 아니라 비복원 추출이면 페이스팅(pasting)이라 한다.
재미있는 것 중 하나는 OOB 샘플(out-of-bag sample)이 복원 추출 과정에서 생긴다는 것인데 대략 $ 37\%$ 정도이다. 이 수치는 다음과 같이 계산된다.
$$ \lim_{n \to \infty} \left( 1 - \frac{1}{n} \right) ^n = \frac{1}{e} \approx 0.3679 $$
한번 샘플링 될 때 특정 샘플 $ x_i $ 가 선택될 확률이 $ 1 / n $ 이므로 선택되지 않을 확률은 $ 1 - 1/n $ 이고, 이를 무한히 반복한다 하면 자연로그의 밑 $ e $ 의 역수가 등장하는 것이다.
즉 대략 $ 37\% $ 의 데이터가 훈련에 사용되지 않으므로 이를 통해 모델의 성능을 평가할 수 있다.
대표적으로 랜덤 포레스트가 배깅 방식의 모델이며, 이때 조금 특이하게 데이터 뿐 아니라 피처 서브샘플링(feature subsampling)도 사용한다.
약한 학습기 모델 하나가 너무 복잡하여 과적합되는 경우에 적합한 방법이라 할 수 있다. 그래서 과적합되기 쉬운 결정트리 기반의 배깅 모델이 많이 사용된다.
부스팅 (Boosting)
학습후 오차가 큰 데이터를 중심으로 다음 약한 학습기에 학습시키는 방식으로 오차가 큰 샘플을 다음 학습기에 넘겨 순차적으로 학습시켜 일반화 성능을 높이는 모델링 방법이다.
예를 들어서 훈련 세트 $ D $ 에서 복원 없이 무작위로 샘플 $ d_1 $ 을 추출하고 이를 약한 학습기 $ C_ 1 $ 이 학습한다. 그 후 $ d_2 $ 를 뽑았을 때 이전 오분류된 샘플의 절반을 포함하고 이를 다시 $ C_2 $ 가 학습한다. 다시 $ C_1 $ 과 $ C_2 $ 가 다르게 분류한 샘플 $ d_3 $ 를 $ C_3 $ 가 학습한다. 이 세 약한 학습기를 다수결 또는 가중결합으로 결합하여 전체 앙상블 모델을 만든다.
$$ C_m (x_i ) = \alpha_1 k_1 (x_i) + \alpha_2 k_2 (x_i) + \cdots + \alpha_m k_m (x_i) $$
약한 학습기 모델 하나가 너무 단순한 경우 일반적으로 부스팅이 잘 활용된다.
AdaBoosting (Adaptive Boosting)
반복적으로 약한 학습기를 학습시킬 때 이전에 오차가 큰 샘플에 가중치를 부여하여 더욱 중점적으로 학습시킨다.
먼저 모든 샘플에 동일한 가중치를 부여하여 학습시킨다. 학습이 끝나면 오분류된 샘플에 더 높은 가중치를 부여하여 다음 학습기가 학습한다. 다시 오분류된 샘플에 더 높은 가중치를 주고 다음 학습기가 학습하는 방식으로 개별 약한 학습기가 학습한다. 이렇게 학습이 끝난 학습기를 이용해 앙상블 모델이 최종적으로 다수결 혹은 평균내어 예측값을 산출한다.
Gradient Boosting
비용 함수를 최소화하기 위해 경사하강법을 활용하여 약한 학습기를 반복적으로 추가하여 모델을 개선하는 방식으로 AdaBoost가 가중치를 이용한 것을 손실함수(Loss function)을 미분하는 방식으로 보완한 것이다.
많은 문제에서 강력한 성능을 보여주며 GBM, XGBoost, LightGBM이 대표적인 모델이다.
기본적인 모델 $ F $ 를 가정하자. 참고로 일반적으로 손실함수는 잔차 제곱이다.
$$ \hat{y} = F(x) $$
이제 학습 과정을 보면 다음과 같다.
상수값으로 모델 최적화한다.
$$ F_0 (x) = \underset{\gamma}{\operatorname{argmin}} \sum_{i=1}^n L(y_i , \gamma) $$
먼저 잔차를 계산(pseudo-redidual)한다.
$$ r_{im} = - \left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right] _{F(x) = F_{m-1}(x)} $$
기저 학습기 $ h_m(x) $ 를 다음을 이용하여 학습시킨다.
$$ \{ (x_i , r_{im} ) \}^n_{i=1} $$
최적 가중치 $ \gamma_m $ 을 다음과 같이 계산한다.
$$ \gamma_m = \underset{\gamma}{\operatorname{argmin}} \sum_{i=1}^n L(y_i, F_{m-1}(x_i) + \gamma h_m (x_i) ) $$
이제 모델을 업데이트 한다.
$$ F_m (x) = F_{m-1} (x) + \gamma_m h_m (x) $$
이제 $ m = 1 $ 부터 $ M $ 까지 반복하면 된다.
'Artificial Intelligence > Machine Learning' 카테고리의 다른 글
[ML] 계층적 클러스터링(hierarchical clustering) (0) | 2025.05.14 |
---|---|
[ML] K-평균 군집화(K-means clustering) (0) | 2025.05.14 |
[ML] 적합(fitting)과 일반화(generalization) 그리고 편향-분산 트레이드오프(bias-variance tradeoff) (0) | 2025.05.13 |
[ML] 주성분 분석(PCA)과 선형판별분석(LDA)을 통한 차원 축소(dimensionality reduction) (0) | 2025.04.10 |
[ML] 간단한 피처 선택(feature selection) (0) | 2025.04.09 |