오늘은 xgboost를 다루기 전 기초 지식에 대해 정리해보고자 한다. 앙상블 기법인 stacking, bagging, random forest, boosting에 대해 정리할 예정이며, 대부분의 내용은 머피의 머신러닝 1의 18장에 해당한다. 책에서 앙상블 기법은 tree계열 모델을 설명하면서 언급되는데, 의사결정 트리의 기본적인 개념을 안 상태에서 본 글을 읽으면 더욱 도움이 될 거 같다.
참고 : 머피의 머신러닝 1
0. 사전지식
bootstrap
bootstrap은 Monte Carlo기반 샘플링 기법으로, 아이디어 자체는 간단하다. 데이터셋이 충분히 크지 않으니 임의로 학습 데이터셋을 늘려서 학습에 사용하는 방법이다. 이는 parametric, nonparametric bootstrap으로 나뉘는데, 오늘 앙상블 기법에서 쓰일 방법은 nonparametric에 해당한다.
parametric bootstrap은 데이터 분포를 근사할 수 있어 파라미터(θ)로 실제 데이터 같은 데이터셋을 만들 수 있다. 이 데이터 분포를 따르는 가짜 데이터들을 만들어내서 학습에 이용한다. 파라미터는 학습이 진행됨에 따라 업데이트된다.
반면 nonparametric bootstrap은 데이터 분포를 알고 있지 않는 상태에서 학습 데이터셋을 그저 sampling 한다. 데이터풀에서 N 개씩을 샘플링해 데이터셋을 생성하는데, 복원추출로 진행한다. 여기서 재밌는 점은 이 N이 충분히 크다면, 적어도 한번 데이터풀에서 데이터가 뽑힐 확률은 0.63이란 것이다. 이 말은 즉 학습에 한 번도 쓰이지 않는 데이터(0.37)가 있을 수 있단 말이다. 이 데이터들을 out-of bag(oob)라고 한다. 가방에 한 번도 들어가지 못한 데이터인 것이다.
bias-variance tradeoff
bias 와 variance를 둘 다 낮추기 힘들기 때문에 bias variance는 trade off 관계에 있다고 말한다. 여기서 variance를 우선적으로 줄이는 것이 좋다. MSELoss를 사용한다 가정했을 때 식을 아래와 같이 정리할 수 있는데, 이때 variance를 bias ** 2보다 작게 만든 다음 bias를 줄이는 형식으로 학습하는 것이 좋다.
Decision Tree (의사결정 트리)
Decision tree는 아주 간략히 요약해서 특정 피쳐에 따라 분화하는 트리를 만들어 결과를 도출하는 모델이다. 아래는 데이터 X가 있을 때 피쳐 X1, X2, X... 에 대해 각각 다른 기준(threshold)으로 데이터를 판별하는 트리 예제이다. 예를 들어 X의 키에 대해 예측하는 트리가 있다고 가정해 보자. Gender(X1), Age(X2)라는 피쳐가 주어졌을 때 성별이 남자(X1) 인 사람이 나이(X2)가 30 이하면 키가 180~190 구간에 있을 거라 생각한다면 오른쪽 그림과 같은 트리가 완성될 것이다.
1. 트리 모델의 장단점과 Ensemble(앙상블)
앙상블에 대해 논하기 전에 트리 모델의 장단점을 살펴보겠다.
장점
- 모델을 이해하기 쉽다.
- feature가 discrete하든 continuous하든 비교적 쉽게 핸들링이 가능하다.
- feature의 값이 n보다 크냐 작냐에 따라 노드가 나뉘기 때문에 데이터를 특별히 normalize할 필요가 없다.
- 자동으로 피쳐 변수를 골라준다.
- 상대적으로 outlier(이상치)에 민감하지 않다. (라고 하지만 개인적인 견해로는 중립에 가깝다.)
- 빠르게 모델이 학습된다.
- missing feature에 대해 아래와 같은 방식들로 핸들링이 가능하다.
- missing 부분에 대해서는 highly correlated feature로 채워넣을 수 있다.
- 또는 missing feature를 새로운 categorical feature로 생각해 처리한다.
단점
- 정확도가 아주 높진 않다.
- 불안정하다.
- input data가 조금만 바껴도 취약하다. 트리는 계층적으로 분화하기 때문에 중요한 데이터가 빠진다면 그에 따른 트리 분화 과정도 크게 바뀔 수 있다.
- 그래서 variance가 높다.
여기서 불안정하단 단점에 대해 조금 더 생각해 보자. 아래 그림의 c의 빨간 별표로 표기된 데이터는 원래 초록색 네모 데이터다. 이는 그림 d에는 존재하나 그림 c에는 없다. 그 결과 그림 c와 d의 클래스별 영역이 눈에 띄게 바뀐 것을 확인할 수 있다.
학습데이터에 따라 변화가 크므로 이 모델은 variance가 크다고 말할 수 있다. 앙상블 모델은 이 variance를 줄이기 위한 대안책이다. 앙상블이란 여러 모델의 결과를 평균 또는 voting을 통해 새로운 모델을 만들어내는 것을 말한다. 아래와 같이 M개의 다른 모델에 대해 앙상블 모델을 나타낼 수 있다. 각각의 모델 f_m을 통해 새로운 모델 f을 탄생시키는 것이다.
이렇게 되면 앙상블 f는 f_m들과 유사한 bias를 갖고 있으면서도 보다 낮은 variance를 갖게 된다. 앙상블하는 방법은 regression과 categorical로 나눠 설명할 수 있다. regression에서는 모든 결과(f1, f2,...fm) 의 평균을 낸다. 총 3개의 모델을 앙상블 한다 가정하고(M=3) 특정 데이터 x에 대해 f1은 30으로, f2는 27, f3은 33으로 예측했다 해보자. 그렇다면 앙상블 모델이 예측하는 x의 결과값은 (3 + 27 + 33 ) / 3 == 30이 된다.
반면 categorical 방법에선 모델 결과값들을 voting 한다. 마찬가지로 M=3이며 데이터를 개인지 고양인지 분류하는 모델을 만들어보자. 특정 데이터 x에 대해 f1는 고양이, f2는 고양이, f3은 개로 분류했다. 개가 1번, 고양이가 2번 나왔으므로 가장 많이 나온 고양이로 앙상블 모델도 예측한다.
2. stacking
앙상블은 여러개의 base model을 엮어서 평균 또는 voting을 통해 구성된다는 것을 알았다. 하지만 모델별로 조금 더 중요한 모델과 덜 보고 싶은 모델에 대해 다른 비율로 가중치를 주고 싶을 수 있다. 이렇게 모델별로 가중치를 주는 것을 stacking이라고 한다. stacking 대상 모델들은 각각 다른 데이터셋으로 학습된다.
3. bagging
bagging의 정식 명칭은 bootstrap aggregating이다. 사전지식에서 설명한 bootstrap은 데이터 복원추출을 통해 데이터셋을 샘플링해서 구성하는 방법이었다. 이렇듯 데이터 풀에서 여러 데이터셋을 생성해 각각의 모델을 학습한 후 합친(aggregation) 것이 bagging이다.
M개의 서로 다른 모델이 서로 다르게 샘플링된 데이터로 학습되었으므로 어느정도 다양성이 생겼을 거다. 이 근거는 bootstrap의 특성에서 나온다. 각 모델이 개별적인 데이터로 학습되었기 때문에, 개별의 학습 데이터에 비교적 덜 의존적인 모델이 만들어졌을 거란 가정이다. 아래 두 그림 중 (b)는 10개의 모델을, (c)는 50개의 모델을 bagging 한 결과다. 많은 decision tree를 bagging 할수록 특정 데이터에 민감한 현상이 사라진 것을 볼 수 있다.
bootstrap에서 0.37정도의 데이터는 한 번도 학습 데이터셋에 속하지 못할 것이라 했다(oob; out of bag). 이 데이터는 학습 데이터 대신 테스트 셋으로 사용할 수 있으며, 주로 cross validation 작업에 쓰인다. 참고로 이 방법을 DNN에 쓰는 건 굉장히 비추다. 딥러닝 계열의 데이터는 다다익선인데, 63%의 데이터셋만 사용하면 성능이 낮아질 수밖에 없다.
4. random forest
random forest는 bagging에서 랜덤성을 위해 한 발짝 더 나아갔다 생각하면 된다. bagging에서 랜덤한 데이터로 각각 트리를 학습했다면 random forest에선 트리가 다루는 피쳐도 랜덤으로 한다.
책에서 나온 예시를 보자. 스팸메일 데이터셋이 주어졌고, 이 데이터가 스팸인지(1) 아닌지(0)를 분류하는 모델을 만들어야 한다. 데이터의 피쳐는 총 57개(피쳐1, 피쳐2, ... 피쳐 57) 다. 이때 각 트리들이 서로 다른 피쳐셋들에 대해 트리로 구성된다. 첫번째 트리는 피쳐 1,3,5, ..로 구성되어 있고, 2번째 트리는 피쳐 2,5, 10, 13 ... 로 구성되어 있다 생각하면 된다.
랜덤포레스트의 장점은 학습 데이터도, 학습에 사용할 데이터도 랜덤인 여러개의 모델을 앙상블 했기 때문에 비교적 피쳐의 연관성이 적다는 것이다.
5. boosting
앙상블 기법인 bagging , random forest는 각각의 base model을 평균내서 사용하기 때문에 각 모델들은 병렬적으로 학습이 가능했다. boosting에선 이 base model들을 순차적으로 학습한다. base model F1, F2 가 있을 때 F2는 F1에서 학습한 정보를 누적해서 학습에 반영하는 형식이다. 아래 수식은 앙상블 boosting 모델에 대해 설명해 준다. M개의 모델을 합하는 과정은 위 다른 앙상블 기법들과 동일하다. F를 binary classifier로 취급해 학습한 결과에 가중치 β을 취하여 모든 트리 m개의 결과를 합했다.
N개의 학습 데이터에 대해 아래의 loss function을 최소화함으로써 boosting tree를 학습할 수 있다. 여기까지가 boosting의 큰 그림이다. 이제 조금 더, boosting에 쓰이는 기본 트리(F)들은 어떻게 점진적으로 학습할 수 있는지 확인해보자.
F를 점진적으로 어떻게 학습할 수 있을까? 먼저 boosting을 정의한 식에서부터 출발해 보자. f_m을 f_m-1에 대한 식으로 풀어낼 수 있다.
새로이 fm을 정의했으니 loss함수에 넣어보자. loss를 minimize함으로써 m번째 모델 F_m의 파라미터 θm와 이때의 가중치 βm은 아래와 같이 구할 수 있다.
오, m-1번째 트리까지로 구한 부스팅 모델(f m-1) 과 m번째 트리를 통해 새로운 부스팅 모델(fm)을 최적화할 수 있음을 알았다.
여기서 끝나긴 조금 아쉽다. loss 함수가 squared error loss라고 가정했을 때 부스팅 모델이 어떤 의미를 가지는지 알아보자. 아래 식에서 분홍색 하이라이트된 부분이 잔차(residual)을 나타낸다. true label y와 predicted f간의 차인 것이다.
따라서 아래 식으로 정리된다. loss함수가 <m-1번째 트리까지로 만든 부스팅 모델의 residual>과 <m번째 트리 F>의 차로 표현된다. 즉 F_m는 이전 트리(~ m-1)까지로 만든 부스팅 모델이 놓친 부분을 보완하게끔 학습이 된다는 것이다. Fm의 학습을 위해 자연스럽게 m-1번째까지의 트리 학습 정보가 담기는 것이다.
이를 그림으로 나타내면 다음과 같다. 1번째 부스팅 모델은 F1과 동일할 것이다. 두 번째 부스팅 모델은 <F1>와, <y와 F1의 잔차를 따라가게끔 학습된 두번째 트리 F2의 합>으로 나타나진다.
그림에서도 트리가 추가될 때 마다(==학습이 진행됨으로써) residual이 점점 작아지는 것을 확인할 수 있다. 트리들이 잔차를 학습하는 weak learner고, 앙상블을 옳은 방향으로 고쳐주는 것이다.
앙상블 각 개념을 정리하자면 다음과 같다.
- stacking : 앙상블할 모델들에 가중치를 주고싶어.
- bagging : 앙상블할 모델들은 각각 복원추출한 데이터셋으로 학습될 거야.
- random forest : bagging보다 더 랜덤으로! 노드에서 다룰 피쳐도 모델별로 다 랜덤이면 좋겠다.
- boosting : 앙상블 할 모델들, 순차적으로 학습시켜 놓자.
학부때 패턴인식 시간에 배웠던 내용들을 이렇게 다시 보니 감회가 새롭다.
'머신러닝 > 아맞다' 카테고리의 다른 글
Eigenvalue Decomposition (EVD)의 수식 기초 (0) | 2023.09.16 |
---|---|
GMM과 EM의 완벽한 이해 (0) | 2023.09.09 |
Fisher LDA 이론 정리 (0) | 2023.08.20 |
EM(Expectation-Maximization) 알고리즘의 완벽한 기초 (3) | 2023.08.13 |
[짧] KNN(K Nearest Neighbor) 분류모델 이론 (0) | 2023.08.06 |