본문 바로가기

통계 톺아보기/01. 분류모델

[02_02_05] Boosting (AdaBoost)

Boosting 모델 중에서 가장 기초 모델인 Adaboost 모델 먼저 살펴보려고 한다.

Adaboost의 개념, 장/단점 그리고 알고리즘에 대해서 자세히 알아가보겠습니다~ 

 

1. AdaBoost 란?

  • AdaBoost 는 Adaptive Boosting 약자
  • Ensenble-based classifier 일종
  • 이진 분류 문제에서 의사결정나무(Decision Tree)의 성능을 향상시키는데 가장 많이 사용됨

2. AdaBoost 개요

- 하나의 node에 두개의 leaf를 지닌 트리를 그루터기(stump) 라고 함 

 

출처 : StatQuest (1)

 

- AdaBoost는 아래 그림과 같이 여러 개의 stump로 구성되어 있고, Forest of stumps라 함

출처 : StatQuest(2)

- Tree와 비슷하지만 Leaf만 가지는 트리를 여러개 만든다.

- Stump는 한개의 node에 대한 두개의 leaf로 이루어져있기 때문에 트리와 다르게 정확한 분류를 하지 못함

   한 개의 질문으로 데이터를 분류하기 때문에, stump = week learner

 

- (3) 그림은 랜덤 포레스트의 예시라고 생각하면, 동일한 가중치가 부여되어 있음

 

출처 : StatQuest (3)

- (4) 그림은 특정 Stump가 다른 Stump보다 크기가 크거나 작고, 즉 가중치 차이가 존재함

   가중치가 높다는 것은 Amount of say가 높다고 표현하며, 영향도가 큼

출처 : StatQuest (4)

AdaBoost의 간략한 프로세스를 살펴보자.

 

- D1 에서 2/5 지점에서 횡단하는 구분선으로 데이터를 나눔. 위쪽 +가 잘못 분류 되었고, 아래쪽의 가 잘못 분류 됨.

  이에 따라 잘못 분류된 값들의 가중치를 높이고 잘 분류된 값의 가중치를 낮춤

- D2 의 그림을 보면, D1 에서 잘 분류된 데이터의 크기는 작아졌고 (가중치 낮춤) 잘못 분류된 데이터는 커짐

  (가중치 높임). 가중치 조절하는 이유는 다음 모델에서 더 집중해 분류하기 위해서임

- D3 에서 세개의 이 가중치가 커짐. D1에서 가중치를 부여했던 데이터들은 D2에서 잘 분류되어 가중치가 다시 작아짐

  • D1, D2, D3 의 분류기(Classifier)를 합쳐 최종 Classifier 구할 수 있음

AdaBoost 개요를 통한 특징을 요약 하면,

(1) Stump 형태의 약한 학습기 (Week Learner)로 구성되어 있음

(2) Stump마다 다른 가중치를 가짐

(3) 각 Stump의 error는 다음 Stump 결과에 영향을 줌

 

 

 

3. AdaBoost Algorithm 원리

sample 데이터 예제를 통해 이해해보도록 하자.

 

- 데이터 설명 : Chest Pain, Blocked Arteries, Patient Weight에 따른 Heart Disease 여부에 대한 데이터

 

3.1 Sample Weight

초기 Weight는 8개의 관측치 모두 동일하게 1/(total number of samples) = 1/8로 가중치가 동일함

 

3.2 최초 Stump 선택

다음으로 각각의 Feature 들이 target value(Heart Disease)에 미치는 영향을 알아보자.

 

Step1)

   Chest Pain과 Heart Disease를 보면,  Chest Pain = yes 일 때, Heart Disease = yes 인지 판별하는 Stump이다.

   Chest Pain = yes 이면서 Heart Disease = no 라고 잘못 판단한 것은 2개,

   Chest Pain = no 이면서 Heart Disease = yes 라고 잘못 판단한 것은 1개 이다.

 

출처 : StatQuest (6)

Step2)

   Blocked Arteries = yes 일 때, Heart Disease = yes 인지 판별하는 Stump 이다.

   Blocked Arteries = yes 일 때, Heart Disease = no 라고 잘못 판단한 것은 3개,

   Blocked Artesies = no 일 때, Heart Disease = yes 라고 잘못 판단한 것은 1개 이다.

출처 : StatQuest (7)

Step3)

   Patient Weight는 연속형이기 때문에 176 기점으로 분류하기로 하자.

   Patient Weight > 176 일 때, Heart Disease = yes 인지 판별하는 Stump이다.

   Patient Weight > 176 이면서 Heart Disease = no 라고 잘못 판단한 것은 0개,

   Patient Weight < 176 이면서 Heart Disease = yes 라고 잘못 판단한 것은 1개 이다.

출처 : StatQuest (8)

각 Step1, 2, 3의 Stump의 지니계수를 산출하자

Gini Index

Chest Pain : Yes = 1-(3/5)^2-(2/5)^2 = 0.48

                No = 1-(2/3)^2 -(1/3)^2 = 0.519

                Gini of Chest Pain = (5/8)*0.48 + (3/8)*0.159 = 0.49

Chest Pain과 같은 방법으로 구하면 각각 아래와 같은 그림의 지니계수 산출할 수 있음

마지막 Patient Weight의 Stump의 지니계수가 가장 작기 때문의 첫 Stump로 지정

출처 : StatQuest (9)

 

3.3 Weight 업데이트

최초 stump가 선택되고, 선택된 stump로부터 잘 예측하지 못한 값에 초점을 맞춰보도록 하자

 

 

1) Total Error

(9)번 그림을 보면, 선택된 stump에서 오류난 관측치 수를 확인할 수 있다. 

 

Patient Weight < 176 이면서 Heart Disease = yes 라고 잘못 판단한 것은 1개

이 1개에 대해 오류를 수치하기 위해 " Total Error " 정의하게 됨

 

Total Error for stump = sum of sample weight of error datas (error 들의 총 합)

첫번째 stump에서 total error는 1/8 이다.

 

2) Amount of Say

Error는 Total Error 를 통해 수치화 했다면, Stump를 통해 오류가 아닌 정보량을 수치화하기 위해

" Amount of Say " 라는 개념을 이용함

Sample Weight는 0~1 사이의 값이었으므로, Total Error 역시 0~1사이의 값이고,

Total Error가 커지면 Amount of Say 정보량의 값이 작아지고, 반대의 경우는 정보량이 커지게 된다.

 

첫번째 Stump의 Total Error=1/8 이었으므로,  Amount of Say를 계산하면 0.97 이므로 잘 예측함을 수치적으로 알 수 있다.

 

3) Weight Update

위에서 구한 값들을 이용하여 오류로 판단된 관측치와 나머지 관측치 데이터들의 Sample Weight를 업데이트해보자.

 

우선, 먼저 오류를 일으킨 데이터를 업데이트 해보자.

Amount of Say = 0.97 였고, 그 값을 이용하여 New sample Weight를 계산하면 0.33이 된다.

최초 Weight는 1/8 로 0.125 에서 0.33으로 업데이트 됨

 

이제, 정확하게 잘 분류되었던 데이터를 업데이트 해보자.

 

e의 지수 부분을 error 와 다르게 음수형태로 계산하게 된다.

잘 분류되었던 관측치의 Weight는 0.125 에서 0.05로 Weight 값이 달라짐

이렇게 새로 업데이트된 Weight를 정리하면 아래 그림과 같다.

Weight의 합이 1이어야 하는데, 위의 New Weight들을 합하면 0.68이 되므로 Normalized 해줘서 사용하게 됨

Normalized 해주면, 0.05 -> 0.07 이 되고, 0.33 -> 0.49가 되고, 이 값들로 Sample Weight 업데이트 함

 

3.4 Next Stump에 사용 될 Dataset 생성

AdaBoost는 Stump를 비교하면서 더 잘 예측하는 모델을 만드는데,

새로 업데이트 된 Sample Weight를 이용하여 새로운 DataSet을 생성한다.

 

예시)

1. 0~1에서 임의의 값을 하나 뽑는다. 

2. 예를 들어, 뽑힌 값이 0.06 인 경우, 첫번째 데이터의 누적 Sample Weight가 0.07 이었고,

   0.06은 0.07보다 작으므로 기존 Dataset 에서 첫 번째 데이터를 새로운 Dataset에 넣는다. 

3. 1번을 반복하여 뽑은 값이 0.13 였다. 두번째 데이터의 누적 Sample Weight는 0.14(0.07+0.07) 이고,

   0.13은 0.07과 0.14 사이이므로 그럼 기존 Dataset 에서 두 번째 데이터를 새로운 Dataset에 넣는다. 

4. 1번을 반복하여 뽑은 값이 0.20 였다. 위와 같은 방식으로 기존 Dataset 에서 세 번째 데이터를 새로운 Dataset에 넣는다. 

5. 1번을 반복하여 뽑은 값이 0.31 였다. 그럼 기존 Dataset 에서 세 번째 데이터를 새로운 Dataset에 넣는다. 

6. ... 이러한 과정을 새로운 Dataset 이 기존 Dataset 크기가 될 때까지 반복한다.

위의 데이터는 데이터가 8개이므로 이런 방식으로 새로운 Dataset을 만들게 된다.

이렇게 하면 Sample Weight가 큰 데이터들이 새로운 Dataset에 더 잘 들어가게 되고,

첫번째 Stump에서 오류가 났던 데이터들이 새로운 Dataset에 더 많이 들어가게 됨

따라서 오류난 데이터에 대해 더 잘 fitting 된 모델이 된다.

 

이렇게 새롭게 생성된 데이터셋의 Sample Weight들은 다시 동일하게 1/8로 주어지게 됨

 

새롭게 생성한 Dataset에 대해 위에서 한 작업을 반복하게 된다.

 

4. 최종

이렇게 여러번 반복하면 각각의 Stump 마다 Amount of Say를 구할 수 있다.

종료조건

  1) 미리 정한 max n_estimator 초과한 경우 

  2) Amount of Say가 0이 될 경우

예측의 경우, Amount of Say 합이 가장 큰 class로 분류

 

약한 분류기들이 상호보완적(adaptive)으로 학습해나가고, 이러한 약한 분류기들을 조합하여 하나의 분류기를 만들기 때문에 boosting이 된다. 

H(x) : 최종 강한 분류기

h : 약한 분류기

α : 약한 분류기의 가중치

t : 반복 횟수

 

5. 마무리

1) Dataset에 값들에 동일한 Weight를 적용

2) Dataset의 Feature 수 만큼, Stump를 생성하여, 각각의 Gini계수를 산출하고, 가장 낮은 Stump 선택

3) 선택된 Stump에 대해서 잘못 분류된 값에 대해서 Sample Weight를 업데이트

4) 새로운 데이터셋 생성

5) 위의 과정을 반복하며, 잘못 분류된 데이터에 대해 예측력을 점점 높여가게 된다.

 

 

 

 

 

 

 

 

[ Reference ]

1) https://soobarkbar.tistory.com/42
2) https://bkshin.tistory.com/entry/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-14-AdaBoost?category=1057680
3) https://velog.io/@sangyeop/AdaBoost-%ED%95%9C-%EB%88%88%EC%97%90-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0

 

4) https://dailyheumsi.tistory.com/115
5) blog.naver.com/dic1224/220989033563
6) https://www.youtube.com/watch?v=LsK-xG1cLYA 

 

'통계 톺아보기 > 01. 분류모델' 카테고리의 다른 글

02_01_01. 의사결정나무 Decision Tree  (0) 2021.05.26
[02_02_03] Bagging  (0) 2020.10.04
[02_02_02] Bootstrap  (0) 2020.09.30
[02_02_04] Boosting  (0) 2020.08.23
[02_02_01] Ensenble (앙상블) 이란?  (0) 2020.08.23