Terry Cho 2019. 9. 17. 23:31

XGBoost 알고리즘의 개념 이해


조대협 (http://bcho.tistory.com)


XGBoost는 Gradient Boosting 알고리즘을 분산환경에서도 실행할 수 있도록 구현해놓은 라이브러리이다. Regression, Classification 문제를 모두 지원하며, 성능과 자원 효율이 좋아서, 인기 있게 사용되는 알고리즘이다.


XGBoost는 여러개의 Decision Tree를 조합해서 사용하는 Ensemble 알고리즘이다.

먼저 Decision Tree에 대한 개념을 보면 다음과 같다. 여러개의 이진 노드를 겹쳐서 피쳐별로 판단을 해서 최종 값을 뽑아내는 형태가 된다. 


<그림. Decision tree>


Ensemble은 여러개의 모델을 조합해서 그 결과를 뽑아 내는 방법이다. 정확도가 높은 강한 모델을 하나 사용하는 것보다, 정확도가 낮은 약한 모델을 여러개 조합 하는 방식이 정확도가 높다는 방법에 기반한 방법인데, 


Ensemble은 방식에 따라서 Bagging과 Boosting 으로 분류된다.

Bagging

Bagging은 여러 모델을 사용할때, 각 모델에서 나온 값을 계산하여, 최종 결과값을 내는 방식이다.

예를 들어 아래 그림과 같이 모델 m1,m2,m3 3개의 모델이 있을때, 입력 데이터 X를 모델 m1~3에 넣고, 그 결과값을 받아서 합산 (또는 평균등 여러가지 방법이 있음)해서, 최종 결과를 취하는 방식이다. 

모델 m1~m3 로 데이터를 넣을때는 원본 데이타 x에서 매번 다시 샘플링을 해서 다른 샘플 데이터를 각각 모델에 넣는 방식이 된다. 



<그림 bagging 개념도>

Boosting

Boosting은 원리가 다른데 먼저 m1~3 모델이 있을때, m1에는 x에서 샘플링된 데이터를 넣는다. 그리고, 나온 결과중에서, 예측이 잘못된 x중의 값들에 가중치를 반영해서 다음 모델인 m2에 넣는다.  마찬가지로 y2 결과에서 예측이 잘못된 x’에 값들에 가중치를 반영해서 m3에 넣는다. 

그리고, 각 모델의 성능이 다르기 때문에, 각 모델에 가중치 W를 반영한다. 이를 개념적으로 표현하면 다음과 같은 그림이 된다. 



<그림 Boosting 개념도>


이를 이론적으로 다시 표현해보면

y=m1(x)+error(x) 모델 m1이 x에 대해서 제대로 예측할 확률이 y라고 하고, 이 정확도를 높이려면

error(x)를 작게 하는 모델을 적용하면 되는데, error(x) = m2(x) + error2(x)라고 볼 수 있다. 마찬가지로 error(x)를 작게 하려면 error2(x)를 작게 하면 되는데, 그러기 위해서는 여기에 다른 모델을 적용하면 된다. 즉 error2(x) = m3(x)+error3(x)가 되고, 이를 식으로 합치면


y= m1(x)+m2(x)+m3(x)+error3(x)


가 된다.

이렇게 하면 m1,m2,m3 모델의 가중치가 같기 때문에, 서로 모델이 간섭을 하여, 좋은 결과를 내기 어렵다. 그래서, 각 모델에 가중치를 반영한다.


y = W1m1(x)+W2m2(x)+W3m3(x)+error3(x)


와 같은 식이 된다. 정확한 수식은 아니지만 전체적인 개념을 이해하는 용도 정도로 이해하기 바란다. 

Boosting 기법을 이용하여 구현한 알고리즘은 Gradient Boost 가 대표적인데, 이 알고리즘을 병렬  학습이 지원되도록 구현한 라이브러리가 XGBoost 이다.

성능이 좋고, 컴퓨팅 자원 활용률이 좋아서 근래에 많이 사용되고 있고, 특히 Kaggle 상위 랭커들이 많이 사용하면서 더 유명해지고 있다.