ML 🐼/머신러닝 💕

[Deep한 머신러닝] Boosting 부스팅 2편(GradientBoosting Regression)

Dobby98 2022. 12. 12. 19:46

1. Boosting 부스팅 

핸즈온 머신러닝의 앙상블 (https://eumgill98.tistory.com/20)을 공부하다 보니

다른 앙상블 기법들은 이해하기 쉬웠으나 

Boosting 부스팅이 조금 더 자세히 살펴볼 필요가 있다고 생각되어서

(수식적인 이해를 할 식들이 많다) Deep한 머신러닝의첫 번째 주제로 선택하게 되었다

 

이번 글에서는 Boosting 깊이 있게 살펴 보려고 한다

포괄적인 이해를 원한다면 위의 앙상블 포스팅 링크를 참조해주기를 바란다

 

1.2.1 Gradient Boosting - Regression 

오늘 알아볼 Boosting 기법은 Gradient Boosting 그중에서도 Regression이다

Classfication과 Regression의 수식이 조금 다르기 때문에 비교적 이해하기가 쉬운 Regression을 먼저 알아보려 한다

 

참고한 동영상 강의 : https://www.youtube.com/watch?v=3CC4N4z3GJc 

 

⬆️영어 강의이지만 많은 시각자료와 친절한 설명 때문에 어느정도의 영어구사능력이면 이해할 수 있을 것이다

 

Gradient Boosting의 핵심은 잔여 오차(Residual error)를 학습하는 것이다

 

이를 쉽게 풀어서 설명하면

이전 모델이 학습을 하면  y - y' (실제값 - 예측값) = Residual error을 구할 수 있다

이렇게 만들어진 Residual error를 예측하여 새로운 y' 예측값을 구하고 

이를 통해 새로운 Residual error를 구해서 단계적으로 학습해 나가는 방법이다

 

이 글은 넓은 이해를 위한 글이 아니라

조금 더 딥하게 모델을 이해하기 위한 글이기 때문에 수식을 이용해서 설명을 해 나가겠다

(물론 이해하기 쉽게 쉬운 설명도 같이 할 것이다)

 

 

"우리에게 아래와 같은 데이터가 있다"

 

좋아하는 색 성별 y(몸무게 kg)
1.6 파랑 남자 88
1.6 녹색 여자 76
1.5 파랑 여자 56
1.8 빨강 남자 73
1.5 녹색 남자 77
1.4 파랑 여자 57

우리가 원하는 것은 y(몸무게)를 예측하는 (정말 잘 예측하는) 모델을 만드는 것이다

 

일반적인 Regression (Linear Regression)이었다면 변수의 가중치를 조정해나가면서 (경사하강법) y값을 찾으려고 했을 것이다

 

하지만 데이터가 방대해지고, 변수가 많아지면 그러한 Linear Regrssion의 계산복잡도는 증가하면 정확도도 하락한다

그래서 우리는 정확도와 성능을 위해서 앙상블 기법이라는 어썸한 방법을 공부하고 있다

 

앞에서 공부한 AdaBoost와 Gradient Boost의 가장 큰 차이점은 무엇일까?

차이점을 말하기 전에 이들의 공통점 부터 살펴 보자 

우선 AdaBoost와 Gradient Boost는 순차적 학습 모델이다 

이는 앞에 모델이 학습 되어야 뒤의 모델이 따라서 학습이 가능하단 소리이며 

병렬적으로 모델을 나누어서 처리할 수 없다는 것을 의미한다

 

또한 이들은 이전 모델의 학습 결과를 기반으로 학습을 한다

즉, 현재 학습 이전 모델의 결과가 학습에 영향을 준다

 

다음은 차이점을 살펴보자

AdaBoost는 Stump라는 아주 작은 모델을 활용한다 (깊이가 1인 의사결정나무)

반면에 Gradient Boost는 4개의 잎을 가진 나무를 기본으로한다(필요에 따라서 8~32개 까지 활용)

 

또 다른 차이점은 AdaBoost는 모델별 가중치가 다르다는 점이다

이는 앞에서 학습 한것 처럼 마지막 최종 예측을 만들때 그 모델이 데이터를 설명하는 정도에 따라서 가중치 '알파'를 다르게 주었던 것을 떠올리면 된다

반면, Gradient Boost는 모든 모델의 가중치가 같다 

즉, 같은 모델로 잔차 오차를 줄여나가는 것이다 

 

물론 가장 눈에 띄는 차이점은 AdaBoost의 경우 X의 가중치를 변화시켜 학습시킨다는 것이고

Gradient Boost는 y값의 오차를 변화시켜 학습시킨다는 것이다

 

그렇다면 Gradient Boost를 사용해서 위의 데이터의 최고의 예측 모델을 만들려면 어떻게 해야할까?

위 사진은 Gradient Boost Regression의 전체 진행과정이다 

수식을 보니 벌써 부터 어질어질 하다

하지만 천천히 단계단계로 풀어가보자

 

1. Input & Step. 1

 

우리에게는 위의 테이블 같은 데이터를 보유하고 있다

이를 수식으로 표현하면 Data{(x, y)}i=1 ~ n 이다

 

우리는 이를 통해서 Step 1의 F0(x)를 구할 수 있다

argmin 어쩌구 저쩌구 하는 식이 바로 우리가 처음 구해야할 예측 Y이다 

 

수식은 어려워 보여도 쉽게 설명하면 기존 Y값의 평균이다 

엥? 무슨 평균을 저렇게 어렵게 표현하냐고? -: 우리가 사용하는 L(yi, r)은 L(yi, F(x))를 미분한 것이다

즉, 이 식에서 쓰는 loss functional = 1/2(y - y')^2 이므로 이를 미분한 값은 실제 Y의 평균이 된다

즉 F0(x) 는 실제 Y의 평균이 된다

Step 1의 결과로 우리는 1번째 Predict를 얻었다 = 71. 2

 

ex) 위의 테이블 중 3개만 input값이라 가정하자 (계산의 편의를 위해서)

                 키          좋아하는 색        성별          y(몸무게)
input 1     1.6             파랑                 남자             88
input 2     1.6             녹색                 여자             76
input 3     1.5             파랑                 여자             56

그렇다면 이제 Step 1.의 수식을 적용해보자

1/2 * (88 - predict)^2 +
      1/2 *(76 - predict)^2 +
            1/2 * (56 - predict)^2

이를 각각 미분한다  (ex -> 2/2 * (88 - predict) * -1)
:
 -(88 - predict) +
    -(76 - predict) +
      -(56 - predict)  = 0

= 3predict = (88 + 76 + 56)
= predict = (88 + 76 +56) / 3 

이는 평균 값이다 

2. Step. 2  - (A)

 

 

이렇게 구한 예측값으로 이제 오차를 구해보자

좋아하는 색 성별 y(몸무게 kg) Residual error
1.6 파랑 남자 88 16.8
1.6 녹색 여자 76 4.8
1.5 파랑 여자 56 -15.2
1.8 빨강 남자 73 1.8
1.5 녹색 남자 77 5.8
1.4 파랑 여자 57 -14.2

 

이런 오차 - gradient에서 gradient  boost라는 이름이 나왔다

이제 우리에게 오차라는 새로운 데이터가 생겼다 이를 통해서 우리가  할것은 '잔여 오차'를 학습하는 것이다

 

3. Step. 2  - (B)

이제 우리가 가지고 있는 변수 키, 좋아하는 색, 성별로 새로운 트리를 구성할 수 있다

(B) 공식의 결과는 위와 같다 

원래의 예측모델에서는 y를 예측했다면 우리가 Gradient 모델에서 예측할 y는 '잔여 오차'Residual error이다

 

그런데 오차가 2개씩 들어가 있는 결과는 어떻게 처리할까?

위 사진에서는 2군데가 그러하다

 

4. Step. 2 - (C)

이를 해결할 수 있는 식은 (C)에 나와 있다

수식적으로 표현한 방법은 매우매우 어렵지만 

이번에도 간다하다 

포함되는 값의 평균이다 

즉, [-14.2, -15.2],[4.8],[1.8,5.8],[16.8] 로 나누어 져있는 위의 값을 예로들면

(C) 식을 통과하면 [-14.7, 4.8, 3.8, 16.8]로 변환되는 것이다

증명:

시그만 안의 L(yi, Fm-1(xi) + r)을 변환하면 다음과 같다
1/2 * (yi - (Fm-1(xi) + r))^2
어디서 본 식이 아닌가?

앞에서 1번에서 본 loss를 미분한 것과 비슷하지 않은가?
하지만 여기선 살짝 다르다
앞에서 본 식은 (맨앞) 전체의 평균이었지만

여기서 시그마가 받는 xi는 Rij에 포함된 값만 받는다(시그마 밑을 봐라)

ex) [-14.2, -15.2],[4.8],[1.8,5.8],[16.8] 

r1,1   -> yi - Fm = Residual error = (-14.2, -15.2)
= argmin [1/2(-14.2 + r)^2  + 1/2(-15.2 + r)^2] 
   = d/dr[1/2(-14.2 + r)^2  + 1/2(-15.2 + r)^2] = > 미분 
       = -14.2+r + -15.2 + r = 0
          = -29.4 = -2r
                = r = (-14.2 + -15.2) / 2
                     =평균!!

 

이렇게 하면 아래의 나무가 완성된다 

5. Step. 2 - (D)

이렇게 만들어진 나무로 이제 Fm(x)를 만들어 주자

Fm(x) = 이전 Fm-1(x) 값 + 학습률 * (오차)이다

 

ex) -> Fm(x) = 71.2 + 0.1(학습률 = 0.1로 가정) * -14.7 이다

 

이렇게 만들어진 Fm(x)들을 가지고 다시 Residual을 만들어 주고 계속해서 갱신한다

좋아하는 색 성별 y(몸무게 kg) Residual error Fm(X)
1.6 파랑 남자 88 16.8 72.9
1.6 녹색 여자 76 4.8 71.68
1.5 파랑 여자 56 -15.2 69.73
1.8 빨강 남자 73 1.8 71.58
1.5 녹색 남자 77 5.8 71.58
1.4 파랑 여자 57 -14.2 69.73

이런식으로 Fm(x)를 계속해서 갱신하면서 오차를 줄여 나가는 것이다

좋아하는 색 성별 y(몸무게 kg) Residual error Fm(X) Residual error
1.6 파랑 남자 88 16.8 72.9 15.1
1.6 녹색 여자 76 4.8 71.68 4.3
1.5 파랑 여자 56 -15.2 69.73 -13.7
1.8 빨강 남자 73 1.8 71.58 1.4
1.5 녹색 남자 77 5.8 71.58 5.4
1.4 파랑 여자 57 -14.2 69.73 -12.7

 

6. Output 

그렇다면 이제 생기는 의문이라기 보다는 당연한 질문

마지막 출력(예측값)은 어떻게 만들 수 있는가 

 

간단하다 

첫번째 데이터를 예로 들어 설명하면

71.2 + 알파(학습률) * (오차1+오차2+오차3 .... 오차n)

 

결국 각 데이터가 위의 공식에 따라서 계산되며 

새로운 test_x 값이 들어온다면 

트리가 형성되어 있기 때문에 해당하는 트리의 계산에 따라 오차들을 만들어내 최종 결과물을 만들어 낸다

 

 

오늘은 Gradient Boost regression의 공식과 계산과정을 공부해보았다

다음글은 Gradinet Boost 분류 과정과 공식을 포스팅 해보겠다!!