본문 바로가기

DL_general

XGBoost

Boosting이란?

m1~m3 모델이 있을 때 m1에서는 x에서 샘플링된 데이터를 넣는다. 

m1에서 나온 결과 중 예측이 잘못된 값들에 가중치를 반영해서 다음 모델인 m2에 넣는다. 

(올바르게 예측한 샘플에 대해서는 가중치를 감소시킨다) 

마찬가지로 y2 결과에서 예측이 잘못된 값들에 가중치를 반영해서 m3에 넣는다. 

각 모델 성능이 다르므로 각 모델에 가중치 W를 반영한다. 

 

>> 새로운 모델이 추가될 때마다 오류 최소화를 목표로 학습되고, 실제 값과 예측 값 사이의 오류가 줄어들게 된다.  

 

 

Boosting을 사용하는 대표적인 모델은 Adaboost, Gradient Boosting 등이 있고, XGBoost는 그 중 gradient를 이용하여 boosting하는 gradient boosting을 사용해서 모델링을 한다. 

 

Gradient boosting을 알려면 adaboost를, 

adaboost를 알려면 random forest를, 

random forest를 알려면 decision tree를 알아야 한다. 

순서대로 알아보자. 

 

Decision Tree

데이터를 가장 잘 구분할 수 있는 질문을 기준으로 나눈다. 

지나치게 많이 구분하면 오버피팅이 되므로 이를 막기 위해 가지치기(pruning)를 한다. 

최대 깊이 / 터미널 노드의 최대 개수 / 한 노드가 분할하기 위한 최소 데이터 수를 제한한다. 

 

어떤 트리가 좋은 트리일까?에 대한 기준

entropy = 불순도를 수치로 나타낸 것. 0 = 최소, 1 = 최대 

information gain = entropy(parent) - [weighted average]entropy(children) 

>> entropy(parent) = 분기 이전 엔트로피 / entropy(children) = 분기 이후 엔트로피 

 

Decision tree는 information gain을 최대화하는 방향으로 학습이 진행된다. 

어느 feature의 어느 분기점에서 정보 획득이 최대화되는지 판단을해서 분기가 진행된다. 

 

장점)

- inference time이 빠르다 

- interpretable 

단점)

- 큰 나무는 overfitting이 잘된다 

- low level에서 data가 매우 부족 

 

Random Forest

Decision tree가 모여 random forest를 구성한다. 

트리0~4 = decision tree, 오른쪽 아래 사진이 트리0~4를 합친 random forest

Feature이 N개 있을 때 그 중 랜덤하게 n개만 선택해서 decision tree를 만들고, 

또 N개 중 랜덤하게 n개만 선택해서 또다른 decision tree를 만들고.. 이를 반복하여 여러 개의 decision tree를 만든다. 

각 decision tree의 예측값들 중 가장 많이 나온 값을  최종 예측값으로 (hard voting) 정한다. 

각각의 decision tree는 동등한 가중치를 가지고 있다. 

 

즉, 하나의 거대하고 overfitting된 decision tree를 만들기보다 여러 개의 작은 decision tree를 만드는 것.

 

AdaBoost

노드 하나에 두 개의 리프를 가진 트리 = stump

AdaBoost는 여러 개의 stump로 구성되어 있다. 

Forest of stumps

stump는 단 하나의 질문으로 데이터를 분류해야하므로 정확한 분류를 못한다. 즉, weak learner이다. 

더 큰 stump는 가중치가 더 큼을 의미한다.

AdaBoost에서는 특정 stump의 가중치가 더 높다. 

AdaBoost에서는 가중치가 높다는 것을 Amount of Say가 높다고 표현한다.

 

첫번째 stump에서 발생한 에러는 두번째 stump의 결과에, 

두번째 stump에서 발생한 에러는 세번째 stump의 결과에 ... 마지막 stump까지 영향을 준다. 

 

example)

더보기

각 feature가 target value = heart disease에 미치는 영향에 대해 AdaBoost 방식으로 알아보자.

 

chest pain이 yes일 때 heart disease도 yes인 것 3 (correct) 

chest pain이 yes일 때 heart disease는 no인 것 2 (incorrect)

chest pain이 no일 때 heart disease도 no인 것 2 (correct)

chest pain이 no일 때 heart disease는 yes인 것 1 (incorrect) 

같은 방법으로 blocked arteries에 대해서 분류 

 

1) 몸무게를 오름차순으로 정렬한 뒤,

2) 인접한 몸무게의 평균을 구한 다음, (ex. 205 -- 192.5 -- 180)

3) 각 평균 값마다 지니 불순도를 계산 

4) 가장 작은 지니 불순도를 갖는 인접 몸무게 평균값을 분기 기준으로 잡음 = 176 

지니계수 = 지니불순도

 

지니 계수는 어떤 샘플을 뽑았을 때 그 샘플이 잘못 분류될 확률을 의미한다. 

그러므로 지니 계수가 0에 가까울수록 잘못 분류될 확률이 적은 것.

위 표에서 지니 계수 = 1 - (prob of 'yes')^2 - (prob of 'no')^2 

 

이렇게 각 stump에 대해서 계산한 다음에 각 stump의 지니 계수를 계산한다. 

마지막 stump의 지니 계수가 가장 작기 때문에 마지막 stump를 forest의 첫 stump로 지정한다. 

이 stump가 최종 결과 예측에 얼만큼 중요한지 알아보자.

 

 

X축은 total error, Y축은 Amount of Say. 

total error = 0 이면 항상 올바른 분류를 한다는 뜻이고, 1이면 항상 반대로 분류를 한다는 뜻이다. 

total error = 0.5일 때는 amount of say가 0이다. 

위 stump에서 incorrect는 총 8개 중 1개이므로 total error = 1/8 

= 0.97

 

하나의 stump가 잘못 분류한 sample에 대해서 다음 stump로 넘겨줄 때 가중치를 더 높여서 넘겨준다.

맨 처음 stump에서 빨간 네모 sample을 잘못 분류했으므로 해당 sample의 weight를 1/8보다 크게하고, 나머지 sample의 weight는 1/8보다 작게 해서 다음 stump로 넘겨준다. 

new sample weight = (1/8) x e ^ 0.97 = (1/8) x 2.64 = 0.33

기존의 weight = 1/8 = 0.125보다 높아졌다. 

 

잘 분류한 sample들의 weight들을 계산하려면 amount of say에 -부호만 붙이면 된다. 

new sample weight = (1/8) x e ^ (-0.97) = (1/8) x 0.38 = 0.05 

기존의 weight = 1/8 = 0.125보다 작아졌다. 

new sample weight를 update하고, 다 더했을 때 1이 되도록 normalize해준다. 

 

테이블을 샘플링한다.

0~1 사이 숫자를 무작위로 뽑아서 범위에 따라서 i번째 샘플을 선택한다. 

ex. 0~0.07 / 0.07~0.14 / 0.14~0.21 / 0.21~0.70 / 0.70~0.77 / ... >> weight값에 따라 범위가 다르다 

범위가 큰 네번째 샘플이 뽑힐 확률이 크므로 중복적으로 뽑힌 것을 확인할 수 있다. 

 

샘플링한 테이블에, sample weight을 다시 1/8으로 통일한다. 

중복된 데이터는 4개가 있으므로 4/8의 weight을 가지는 것과 동일한 효과를 갖는다. 

이는 처음에 잘못 분류를 했기 때문에 weight를 높여서 제대로 분류하기 위함이다. 

weight가 높아졌으므로 해당 sample에 가중치를 더 두고 분류를 할 것이다. 

 

다시 처음으로 돌아가서 진행한다. 

 

 

위는 AdaBoost를 여러 차례 진행한 결과. 

왼쪽은 heart disease가 있다고 판단한 stump, 오른쪽은 없다고 판단한 stump.

각 stump의 amount of say를 더해서 total amount of say를 계산할 수 있는데, 왼쪽이 더 큰 것을 확인할 수 있다. 

따라서 최종적으로 heart disease가 있다고 분류를 할 수 있다. 

 

Gradient Boosting

AdaBoost는 하나의 stump에서 발생한 error가 다음 stump에 순차적으로 영향을 주어 최종 결과를 도출한다.

반면, Gradient boosting는 single leaf에서 시작하고, leaf가 8~32개로 구성된 tree로 구성되어 있다. 

Leaf는 타겟 값에 대한 초기 추정 값을 나타내는데, 보통은 평균으로 정한다. 

그 다음은 AdaBoost와 동일하게 이전 tree의 error는 다음 tree에 영향을 준다.

 

example)

더보기

키, 좋아하는 색, 성별로 몸무게를 예측하는 Gradient Boost 모델을 만들어보자. 

Single leaf는 타겟의 평균이므로 (88 + 76 + 56 + 73 + 77 + 57) / 6 = 71.2이다. 

이제 single leaf에서 예측한 값과 실제 값의 차이 (=pseudo residual)를 반영한 새로운 트리를 만들어야 한다.

모든 행의 pseudo residual을 정리하면 다음과 같다.

이제 실제 몸무게가 아니라 residual을 맞춰야한다. 

위와 같이 모델을 만들었다. 

여자면 왼쪽, 남자면 오른쪽 / 1.6 미만이면 왼쪽, 이상이면 오른쪽 / 파란색이 아니면 왼쪽, 파란색이면 오른

그런데 두 개의 residual 값이 있는 경우가 있다. 그러면 두 값의 평균으로 치환해준다. 

single leaf를 첫번째 트리라고 하고, 이후에 만든 트리를 두번째 트리라고 하자. 

두번째 트리는 남자고, 파란색을 좋아하는 사람의 residual weight가 16.8이라고 예측했다. 

이를 첫번째 트리와 더하게되면 88인데, 이 값은 실제 몸무게와 정확히 일치한다. 

 

이는 훈련데이터에 overfitting되었다는 의미이다. 

이를 조절하기 위해서 residual을 예측하는 모델(두번째모델)에 learning rate를 곱해준다. 

 

실제값 88보다는 멀어졌지만 첫 모델이 예측한 71.2보다는 88에 더 가까워진 것을 알 수 있다. 

Gradient Boost 모델은 이런식으로 실제 값에 조금씩 가까워지는 방향으로 학습을 한다. 

 

Pseudo residual을 다시 구해보자. 

Pseudo residual = (실제값 - (예측값 + 학습률 * 이전 residual))

초기에 평균값으로만 구했던 residual보다 값이 작아졌다. 

Residual이 작아졌다 = 실제 값과 예측 값의 차이가 작아졌다 = 조금씩 실제 값으로 다가가고 있다 

 

세번째 트리까지 만들고난 뒤 남자이고 좋아하는 색이 파란색인 사람의 몸무게를 예측한 결과이다. 

조금 더 88에 가까워지고 있다. 

Iteration을 돌릴수록 residual도 조금씩 감소한다. 즉, 예측 정확도가 더 높아진다. 

이 과정을 미리 정해둔 iteration 횟수에 도달하거나 더이상 residual이 작아지지 않을 때까지 반복한다. 

 

XGBoost

Extreme Gradient Boosting의 약자이다. Gradient Boosting을 병렬적으로 실행한 것이다. 

Regression과 classification 문제를 모두 지원한다. 

 

장점)

- 병렬 처리로 학습, 분류 속도가 빠르다 

- 과적합 규제 기능으로 강한 내구성을 지닌다 

- 분류와 회귀 영역에서 뛰어난 예측 성능 

- early stopping 기능이 있다

- customizing이 용이하다 

 

학습과정은 Gradient Boosting과 비슷한데, 'calculate predicted probability' 단계가 추가되었다. 

 

example) 

더보기

약 복용량에 따라서 약이 효과적일지 아닐지 구분하는 데이터이다. 이진 분류를 하려고 한다. 

 

1. Single leaf(=첫번째모델)로 시작한다. 

    leaft의 값은 drug가 효과적일지 아닐지를 맞추는 확률값이다. Default값은 0.5이다. 

 

2. Pseudo residual을 계산한다. 

3. 다음 트리를 만든다. 

 

3-1. similarity score를 계산한다. 

        lambda는 regularization term으로 overfitting을 방지해준다. 

        모든 data point를 넣으면 similarity=0이 나온다. 

      가장 오른쪽 두 point의 평균인 15를 기준점으로 잡아서 데이터를 나누고 similarity를 다시 계산하면 위와 같다.

 3-2. Gain을 계산한다. 

       Gain이 가장 큰 조건(이 예제에서는 dosage)이 분기 조건이 된다. 

       Dosage < 15 일 때의 gain = 0.33 + 1 - 0 = 1.33이고, 이 때의 gain이 다른 조건들과 비교했을 때 가장 크다. 

3-3. limitation of depth 조건을 만족하는 최적의 트리를 완성하기 

     

      위 예제에서는 limitation of depth=2로 설정되어 있었다. 

      같은 방법으로 최대 gain 조건을 찾아 분기를 하여 tree를 완성한다. 

3-4. Prune 

       

      gamma는 미리 정해두는 hyperparameter. 

      만약 gain - gamma가 negative면 가지치기로 삭제 

3-5. Representative value 계산 

    각 leaf에 대해서 representative value = output value를 계산한다. 

4. Predicted probability 계산 

       first leaf의 값을 log(odds)로 변환해준다. 

 

      모델의 leaf의 output value에 learning rate를 곱하고 first leaf의 log(odds)값과 더한다.

      이 문제에서 learning rate는 0.3이다.  

     이 값을 logistic function에 넣으면 predicted probability를 구할 수 있다. 

 

      0.35는 첫번째 트리에서 예측한 0.5보다 ground truth 값에 가까워졌다. 

      모든 output value에 대해서 이 과정을 수행하여 모든 data point에 대한 predicted probability를 구한다. 

      구한 residual로 새로운 tree를 만든다. 

5. Repeat 2-4

    maximum number of tree에 도달하거나, residual이 지정한 threshold 이하로 떨어질 때까지 반복한다. 

6. Test 

 

더보기

https://bcho.tistory.com/1354

 

XGBoost 개념 이해

XGBoost 알고리즘의 개념 이해 조대협 (http://bcho.tistory.com) XGBoost는 Gradient Boosting 알고리즘을 분산환경에서도 실행할 수 있도록 구현해놓은 라이브러리이다. Regression, Classification 문제를 모두 지원

bcho.tistory.com

https://webnautes.tistory.com/1643

 

XGBoost 개념 정리

XGBoost 관련 개념을 정리한 문서입니다. 논문을 보고 진행했어야 했는데 인터넷 자료를 바탕으로 작성하게 되었네요. 수식은 이해안되는 부분이 아직은 많아서 제외시켰습니다. 추후 논문을 확

webnautes.tistory.com

https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-4-%EA%B2%B0%EC%A0%95-%ED%8A%B8%EB%A6%ACDecision-Tree

 

머신러닝 - 4. 결정 트리(Decision Tree)

결정 트리(Decision Tree, 의사결정트리, 의사결정나무라고도 함)는 분류(Classification)와 회귀(Regression) 모두 가능한 지도 학습 모델 중 하나입니다. 결정 트리는 스무고개 하듯이 예/아니오 질문을 이

bkshin.tistory.com

https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-5-%EB%9E%9C%EB%8D%A4-%ED%8F%AC%EB%A0%88%EC%8A%A4%ED%8A%B8Random-Forest%EC%99%80-%EC%95%99%EC%83%81%EB%B8%94Ensemble?category=1057680 

 

머신러닝 - 5. 랜덤 포레스트(Random Forest)

이전 포스트에서 결정 트리(Decision Tree)에 대해 알아봤습니다. 랜덤 포레스트를 배우기 위해서는 우선 결정 트리부터 알아야 합니다. 결정 트리에 대해 잘 모른다면 이전 포스트를 먼저 보고 오

bkshin.tistory.com

https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-14-AdaBoost

 

머신러닝 - 14. 에이다 부스트(AdaBoost)

본 챕터에서는 부스팅 기법 중 가장 기본이 되는 AdaBoost에 대해 알아보겠습니다. 부스팅에 대해서 잘 모르신다면 '머신러닝 - 11. 앙상블 학습 (Ensemble Learning): 배깅(Bagging)과 부스팅(Boosting)'을 참

bkshin.tistory.com

https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-15-Gradient-Boost

 

머신러닝 - 15. 그레디언트 부스트(Gradient Boost)

앙상블 방법론에는 부스팅과 배깅이 있습니다. (머신러닝 - 11. 앙상블 학습 (Ensemble Learning): 배깅(Bagging)과 부스팅(Boosting)) 배깅의 대표적인 모델은 랜덤 포레스트가 있고, 부스팅의 대표적인 모

bkshin.tistory.com

https://wooono.tistory.com/97

 

[ML] XGBoost 개념 이해

Boosting 이란? 여러 개의 약한 Decision Tree를 조합해서 사용하는 Ensemble 기법 중 하나이다. 즉, 약한 예측 모형들의 학습 에러에 가중치를 두고, 순차적으로 다음 학습 모델에 반영하여 강한 예측모

wooono.tistory.com

https://tyami.github.io/machine%20learning/ensemble-7-boosting-XGBoost-classification/

 

부스팅 앙상블 (Boosting Ensemble) 3-2: XGBoost for Classification

Boosting 모델 중 하나인 XGBoost의 Classification 알고리즘을 정리해봅시다

tyami.github.io

https://www.youtube.com/watch?v=8b1JEDvenQU 

https://towardsdatascience.com/decision-trees-explained-entropy-information-gain-gini-index-ccp-pruning-4d78070db36c

 

Decision Trees Explained — Entropy, Information Gain, Gini Index, CCP Pruning..

Though Decision Trees look simple and intuitive, there is nothing very simple about how the algorithm goes about the process deciding on…

towardsdatascience.com

 

 

'DL_general' 카테고리의 다른 글

학습 중 GPU를 100% 쓰지 않는 이유, GPU util을 올리려면?  (0) 2023.03.23
localization  (0) 2023.03.15
YOLO  (0) 2023.03.13
cosine similarity  (0) 2023.03.08
auto encoder  (0) 2023.03.07