3. 배깅과 랜덤 포레스트

- 다중 모델의 평균을 취하는 방식(혹은 다수결 투표), 다른 말로 앙상블 모델은 단일 모델을 사용하는 것보다 더 나은 성능을 보인다.

용어 의미
앙상블(ensemble) 여러 모델의 집합을 이용해서 하나의 예측을 이끌어내는 방식
배깅(bagging) 데이터를 부트스트래핑해서 여러 모델을 만드는 일반적인 방법
랜덤 포레스트(random forest) 의사 결정 트리 모델에 기반을 둔 배깅 추정 모델
변수 중요도(variable importance) 모델 성능에 미치는 예측변수의 중요도

 

< 앙상블 방법의 가장 간단한 버전 >

  1. 주어진 데이터에 대해 예측 모델을 만들고 예측 결과를 기록한다.
  2. 같은 데이터에 대해 여러 모델을 만들고 결과를 기록한다.
  3. 각 레코드에 대해 예측된 결과들의 평균(또는 가중평균, 다수결 투표)을 구한다.

-> 앙상블 기법은 상대적으로 적은 노력만으로도 좋은 예측모델을 만들 수 있다는 점에서 정말 파워풀하다.

 

1) 배깅

- 배깅이란 '부트스트랩 종합(bootstrap aggregation)'의 줄임말로 다양한 모델들을 정확히 같은 데이터에 대해 구하는 대신, 매번 부트스트랩 재표본에 대해 새로운 모델을 만든다.

 

< 배깅 알고리즘 >

- 응답변수 $Y$와 $P$개의 예측변수 $X=X_1, X_2, \cdot\cdot\cdot,X_P$로 이루어진 $N$개의 레코드가 있다고 가정하자.

  1. 만들 모델의 개수 $M$과 모델을 만드는데 사용할 레코드의 개수 $n$($n<N$)의 값을 초기화한다. 반복 변수 $m$=1로 놓는다.
  2. 훈련 데이터로부터 복원추출 방법으로 $n$개의 부분데이터 $Y_m$과$X_m$을 부트스트랩 재표본 추출한다.
  3. 의사 결정 규칙 $\hat{f_m}(X)$를 얻기 위해, $Y_m$과 $X_m$을 이용해 모델을 학습한다.
  4. $m=m+1$로 모델 개수를 늘린다.$m\leq M$이면 다시 1단계로 간다.

$\hat{f_m}$이 $Y=1$인 경우의 확률을 예측한다고 했을 때, 배깅 추정치는 다음과 같이 정의할 수 있다.

 

$\hat{f}=\frac{1}{M}(\hat{f_1}(X)+\hat{f_2}(X)+\cdot\cdot\cdot+\hat{f_M}(X))$

 

2) 랜덤 포레스트

- 랜덤 포레스트는 의사 결정 트리 모델에 한 가지 중요한 요소가 추가된 배깅 방법을 적용한 모델로써, 레코드를 표폰추출할 때, 변수 역시 샘플링 하는 것이다.

- 랜덤 포레스트에서는 알고리즘의 각 단계마다, 고를 수 있는 변수가 랜덤하게 결정된 전체 변수들의 부분집합에 한정된다.

 

< 랜덤 포레스트 알고리즘 >

  1. 전체 데이터로부터 부트스트랩 샘플링(복원추출)을 한다.
  2. 첫 분할을 위해 비복원 랜덤표본추출로 $p(p<P)$개의 변수를 샘플링한다.
  3. 샘플링된 변수 $X_{j(1)}, X_{j(2)},\cdot\cdot\cdot,X_{j(p)}$에 대해 분할 알고리즘을 적용한다.
    1. $X_{j(k)}$의 각 변수 $s_{j(k)}$에 대해
      1. 파티션 $A$에 있는 레코드들을 $X_{j(k)}<s_{j(k)}$인 하위 영역과 $X_{j(k)}\geq s_{j(k)}$인 하위 영역으로 나눈다.
      2. $A$의 각 하위 영역 내부의 클래스의 동질성을 측정한다.
    2. 분할 영역 내부의 클래스 동질성을 최대로하는 $s_{j(k)}$의 값을 선택한다.
  4. 분할 영역 내부의 클래스 동질성을 최대로 하는 $X_{j(k)}$와 $s_{j(k)}$ 값을 선택한다.
  5. 다음 분할을 진행하기 위해, 2단계부터 시작해 이전 단계들을 반복한다.
  6. 트리가 모두 자랄 때까지 위와 같은 분할 과정을 반복한다.
  7. 1단계로 돌아가 또 다른 부트스트랩 표본을 추출해 같은 과정을 반복한다.

- 보통은 각 단계마다 전체 변수의 개수가 $P$개 일 때, $\sqrt{P}$개의 변수를 샘플링한다.

- R에서는 랜덤 포레스트를 구현해놓은 randomForest 패키지가 있다.

 

* 주머니 외부(OOD; out-of-bag) 추정 에러는 트리 모델을 만들 때 사용했던 학습 데이터에 속하지 않는 데이터를 사용해 구한 학습된 모델의 오차율을 말한다.

 

- 랜덤 포레스트는 일종의 '블랙박스' 모델이다. 단순한 단일 트리보다 훨씬 정확한 예측 성능을 보이지만 간단한 트리를 통해 얻을 수 있는 직관적인 해석은 불가능하다.

 

3) 변수 중요도

- 랜덤 포레스트는 피처와 레코드의 개수가 많은 데이터에 대해 예측 모델을 만들 때 장점을 발휘한다.

 

< 변수 중요도를 측정하는 방법 >

  • 변수의 값을 랜덤하게 섞었다면, 모델의 정확도가 감소하는 정도를 측정한다(type=1). 변수를 랜덤하게 섞는다는 것은 해당 변수가 예측에 미치는 모든 영향력을 제거하는 것을 의미한다. 정확도는 OOB 데이터로부터 얻는다(결국 교차타당성검사와 같은 효과를 갖는다).
  • 특정 변수를 기준으로 분할이 일어난 모든 노드에서 불순도 점수의 평균 감소량을 측정한다(type=2). 이 지표는 해당 변수가 노드의 순도를 개선하는 데 얼마나 기여했는지를 나타낸다. 물론 이 지표는 학습 데이터를 기반으로 측정되기 때문에, OOB 데이터를 가지고 계산한 것에 비해 믿을 만하지 않다.

4) 하이퍼파라미터

- 다른 여러 머신러닝 알고리즘과 마찬가지로 랜덤 포레스트는 성능을 조절할 수 있는 손잡이가 달린 일종의 블랙박스 알고리즘이라고 할 수 있다. 이러한 손잡이를 하이퍼파라미터(hyperparameter)라고 부른다.

- 랜덤 포레스트에서 하이퍼파라미터는 좀 더 결정적인 영향을 미치는 중요한 요소이다. 특히 오버피팅을 피하기 위해 매우 중요하다.

 

< 랜덤 포레스트의 하이퍼파라미터 >

  • nodesize : 말단 노드의 크기를 의미한다. 분류 문제를 위한 기본 설정은 1이며, 회귀문제에서는 5이다.
  • maxnodes : 각 결정 트리에서 전체 노드의 최대 개수를 의미한다. 기본적으로는 제한이 없고 다만 nodesize 제한 설정에 따라 가장 큰 트리의 크기가 결정된다.

-> nodesize와 maxnodes를 크게 하면 더 작은 트리를 얻게 되고 거짓 예측 규칙들을 만드는 것을 피할 수 있게 된다.

 

· 앙상블 모델은 많은 모델로부터 얻은 결과를 서로 결합해 모델 정확도를 높인다.
· 배깅은 앙상블 모델 가운데 하나의 형태로, 부트스트랩 샘플을 이용해 많은 모델들을 생성하고 이 모델들을 평균화한다.
· 랜덤 포레스트는 배깅 기법을 의사 결정 트리 알고리즘에 적용한 특별한 형태이다. 랜덤 포레스트에서는 데이터를 재표본추출하는 동시에 트리를 분할할 때 예측변수 또한 샘플링한다.
· 랜덤 포레스트로부터 나오는 출력 중 유용한 것은 예측변수들이 모델 정확도에 미치는 영향력을 의미하는 변수 중요도이다.
· 랜덤 포레스트에서는 오버피팅을 피하기 위해 교차타당성검사를 통해 조정된 하이퍼파라미터를 사용한다.

4. 부스팅

- 배깅은 상대적으로 튜닝이 거의 필요 없지만 부스팅은 적용하고자 하는 문제에 따라 주의가 필요하다.

- 선형회귀 모델에서는 피팅이 더 개선될 수 있는지 알아보기 위해 잔차를 종종 사용했다. 부스팅은 이러한 개념을 더 발전시켜, 이전 모델이 갖는 오차를 줄이는 방향으로 다음 모델을 연속적으로 생성한다.

- 에이다부스트, 그레이디언트 부스팅, 확률적 그레이디언트 부스팅은 가장 자주 사용되는 변형된 형태의 부스팅 알고리즘이다.

용어 의미
앙상블(ensemblee) 여러 모델들의 집합을 통해 예측 결과를 만들어내는 것
부스팅(boosting) 연속된 라운드마다 잔차가 큰 레코드들에 가중치를 높여 일련의 모델들을 생성하는 일반적인 기법
에이다부스트(AdaBoost) 잔차에 따라 데이터의 가중치를 조절하는 부스팅의 초기 버전
그레이디언트 부스팅
(hradient boosting)
비용함수(cost function)를 최소화하는 방향으로 부스팅을 활용하는 좀 더 일반적인 형태
확률적 그레이디언트 부스팅(stochastic gradient boosting) 각 라운드마다 레코드와 열을 재표본추출하는 것을 포함하는 부스팅의 가장 일반적인 형태
정규화(regularization) 비용함수에 모델의 파라미터 개수에 해당하는 벌점 항을 추가해 오버피팅을 피하는 방법
하이퍼파라미터(hyperparameters) 알고리즘을 피팅하기 전에 미리 세팅해야 하는 파라미터

1) 부스팅 알고리즘

- 다양한 부스팅 알고리즘의 바탕에 깔려 있는 기본 아이디어는 모두 같다.

 

< 에이다부스트 알고리즘 >

  1. 먼저 피팅할 모델의 개수 $M$을 설정한다. 그리고 반복 횟수를 의미하는 $m=1$로 초기화한다. $w_i=\frac{1}{N}$으로 초기화한다($i=1,2,\cdot\cdot\cdot,N$). 앙상블 모델을 $\hat{F_0}=0$으로 초기화한다.
  2. 관측 가중치 $w_1,w_2,\cdot\cdot\cdot,w_N$을 이용해 모델 \hat{f_m}을 학습한다. 이때 잘못 분류된 관측치에 대해 가중치를 적용한 합을 의미하는 가중 오차 $e_m$이 최소화되도록 학습한다.
  3. 앙상블 모델에 다음 모델을 추가한다. $\hat{F_m}=\hat{F_{m-1}}+\alpha_{m}\hat{f_m}$ 여기서 $\alpha_m=\frac{log{1}-e_m}{e_m}$이다.
  4. 잘못 분류된 입력 데이터에 대한 가중치를 증가하는 방향으로 가중치 $w_1, W-2, \cdot\cdot\cdot,w_N$을 업데이트한다. $\alpha_m$에 따라 증가 폭이 결정되며, $\alpha_m$이 클수록 가중치가 더 커진다.
  5. 모델 반복 횟수를 $m=m+1$으로 증가시키고 $m \leq M$이면 다시 1단계로 돌아간다.

이 과정을 통해 얻은 부스팅 추정치는 다음과 같다.

$\hat{F}=\alpha_1\hat{f_1}+\alpha\hat{f_2}+\cdot\cdot\cdot+\alpha_M\hat{f_M}$

 

- $\alpha_m$ 값을 이용해 모델의 오차가 낮을수록 더 큰 가중치를 부여한다.

 

< 그레이디언트 부스팅 >

- 에이다부스팅과 거의 비슷하지만, 비용함수를 최적화하는 접근법을 사용했다는 점에서 차이가 있다.

- 가중치를 조정하는 대신에 모델이 유사잔차(pesudo-residual)를 학습하도록 한다. 이는 잔차가 큰 데이터를 더 집중적으로 학습하는 효과를 가져온다.

 

< 확률적 그레이디언트 부스팅 >

- 렌덤 포레스트에서와 유사하게, 매 단계마다 데이터와 예측변수를 샘플링하는 식으로 그레이디언트 부스팅에 랜덤한 효과를 추가한다.

 

2) XG부스트

- 부스팅 방법 가운데 대중적으로 가장 많이 사용되는 오픈소스 소프트웨이이다.

- R에서도 xgboost 패키지를 이용해 XG부스트를 사용할 수 있다.

 

< XG 부스트 중요 파라미터 >

  • subsample : 각 반복 구간마다 샘플링할 입력 데이터의 비율을 조정한다.
  • eta : 부스팅 알고리즘에서 $\alpha_m$에 적용되는 축소 비율을 결정한다.

3) 정규화: 오버피팅 구하기

- xgboost 함수를 무작정 사용할 경우, 학습 데이터에 오버피팅되는 불안정한 모델을 얻을 수 있다.

 

< 오버피팅의 문제점 >

  • 학습 데이터에 없는 새로운 데이터에 대한 모델의 정확도가 떨어진다.
  • 모델의 예측 결과에 변동이 매우 심하고 불안정한 결과를 보인다.

- 모델의 복잡도에 따라 벌점을 추가하는 형태로 비용함수를 변경하는 방법인 정규화(regularization) 방법을 통해 오버피팅을 방지할 수 있다.

-xgboost의 alpha와 lambda는 각각 맨하탄 거리와 유클리드 거리를 의미한다. 이 파라미터들을 크게 하면, 모델이 복잡해질수록 더 많은 벌점을 부여하게 되고 결과적으로 얻어지는 트리의 크기가 작아지게 된다.

 

< 능형회귀와 라소 회귀 >

- 능형회귀(ridge regression)은 잔차제곱합에 회귀계수의 개수와 크기에 따라 벌점을 추가한 값을 최소화한다. $\lambda$는 계수에 대해 어느 정도 벌점을 부여할 것인가를 결정한다. 이 값이 클수록 모델이 데이터에 오버피팅할 가능성이 낮아진다.

$\sum_{i=1}^n(Y_i-\hat{b_0}-\hat{b_1}X_i-\cdot\cdot\cdot-\hat{bX_p})^2+\lambda(\hat{b_1}^2+\cdot\cdot\cdot+\hat{b_p}^2)$

- 라소(Lasso) 회귀는 벌점 항에 유클리드 거리 대신 맨하탄 거리를 이용한다.

$\sum_{i=1}^n(Y_i-\hat{b_0}-\hat{b_1}X_i-\cdot\cdot\cdot-\hat{bX_p})^2+\alpha(\mid{\hat{b_1}}\mid+\cdot\cdot\cdot+\mid\hat{b_p}\mid)$

- xgboost 함수의 파라미터 lambda와 alpha가 이 같은 방식으로 작동한다.

 

4) 하이퍼파라미터와 교차타당성검사

- 동시에 설정하는 파라미터 수가 많아진다면 어떤 기준을 가지고 이 파라미터들을 골라야 할까?

-> 교차타당성검사를 활용한다.

 

< 교차타당성검사 >

  1. 데이터를 $K$개의 서로 다른 그룹(폴드)으로 랜덤하게 나눈다.
  2. 각 폴드마다 해당 폴드에 속한 데이터를 제외한 나머지 데이터를 가지고 모델을 학습한 후, 폴드에 속한 데이터를 이용해 모델을 평가한다.-> 표본 밖 데이터에 대한 모델의 성능을 보여준다.
  3. 설정한 하이퍼파라미터 조합마다 폴드에 대한 오차의 평균을 계산해서 전체적으로 가장 낮은 평균 오차를 갖는 최적의 하이퍼파라미터 조합을 찾는다.

< XG부스트의 하이퍼 파라미터 >

  • eta : 부스팅 알고리즘에서 $\alpha$에 적용되는 0과 1 사이의 축소인자(shrinkage factor). 기본값은 0.3이지만, 노이즈가 있는 데이터에 대해서는 더 작은 값을 추천한다.
  • nrounds : 부스팅 라운드 횟수. eta가 작은 값이라면 알고리즘의 학습 속도가 늦춰지기 때문에 라운드 횟수를 늘려야 한다. 오버피팅을 방지하는 파라미터 설정이 포함된 경우, 라운드 횟수를 좀 더 늘려도 괜찮다.
  • max_depth : 트리의 최대 깊이(기본값은 6). 깊이가 아주 깊은 트리를 만드는 랜덤 포레스트와는 반대로 부스팅 트리는 깊이가 얕다. 이는 노이즈가 많은 데이터에 대해 모델이 복잡한 거짓 상호작용을 회피하는 데 도움이 된다.
  • subsample 및 colsample_bytree : 전체 데이터에서 일부 데이터를 비복원 샘플링하는 비율 및 예측변수 중 일부 변수를 샘플링하는 비율. 이는 랜덤 포레스트에서 오버피팅을 피하기 위해 사용했던 것들과 유사하다.
  • lambda 및 alpha : 오버피팅을 조절하기 위해 사용되는 정규화(regularization) 파라미터들.
· 부스팅 방법은 일련의 모델들을 피팅할 때 이전 라운드에서 오차가 컸던 레코드들에 가중치를 더하는 방식을 사용하는 앙상블 모델의 한 부류이다.
· 확률적 그레이디언트 부스팅은 부스팅 가운데에서 가장 일반적으로 사용되며 가장 좋은 성능을 보인다. 확률적 그레이디언트 부스팅의 가장 일반적인 형태는 트리 모델을 사용한다.
· XG부스트는 확률적 그레이디언트 부스팅을 사용하기 위한 가장 유명한 소프트웨어 패키지이다. 데이터 과학에서 활용되는 거의 대부분의 언어를 지원한다.
· 부스팅은 데이터에 오버피팅되기 쉽다. 이를 피하기 위해 하이퍼파라미터를 잘 설정해야 한다.
· 정규화는 파라미터 개수에 관한 벌점 항목을 모델링에 포함하여 오버피팅을 피하는 방법이다.
· 부스팅에서 여러개의 하이퍼파라미터들의 조합을 찾아야 할 때, 교차타당성검사는 아주 중요하다.

 

< 참고자료 >
1. Peter Brucs & Andrew Brucs(2018). 데이터 과학을 위한 통계. 한빛미디어. 이용준 옮김.

'공부 > 데이터 과학을 위한 통계(한빛미디어)' 카테고리의 다른 글

18. 비지도학습(2)  (0) 2021.02.01
17. 비지도 학습(1)  (0) 2021.01.26
15. 통계적 머신러닝(1)  (0) 2021.01.07
14. 분류(2)  (0) 2021.01.05
13. 분류(1)  (0) 2021.01.01

+ Recent posts