관리 메뉴

꿈 많은 사람의 이야기

머신러닝 앙상블 부스팅(boosting) - Adaboost, Gradient Boosting 본문

machine learning(머신러닝)

머신러닝 앙상블 부스팅(boosting) - Adaboost, Gradient Boosting

이수진의 블로그 이수진의 블로그 2019. 11. 16. 09:06

이전 포스팅에서 머신러닝의 앙상블 그 중 부스팅(ensemble boosting)에 대해서 포스팅을 했었습니다.

https://lsjsj92.tistory.com/543

 

머신러닝 앙상블 부스팅이란? - ensemble boosting

머신러닝에서는 앙상블(ensemble)을 정말 많이 사용합니다. 그 효과가 매우매우 강력하기 때문인데요. 이 앙상블에는 배깅(bagging), 부스팅(boosting) 등의 종류가 나뉘어져 있습니다. 지난 포스팅 때는 ensemble..

lsjsj92.tistory.com

이번 글은 앙상블 부스팅(ensemble boosting) 중 Adaboost와 Gradient Boosting에 대해서 알아보려고 합니다.

 

ensemble boosting - Adaboost

Adaboost는 앙상블 부스팅에서 가장 대표적인 방법 중 하나입니다. 어떻게 보면 제일 단순하면서도 강력한 알고리즘이죠.

Adaboost는 Adaptive Boosting으로서 이전 분류기가 틀린 부분을 adaptive하게 바꾸어가며 잘못 분류되는 데이터에 집중하도록 하는 것입니다.

출처 : https://medium.com/diogo-menezes-borges/boosting-with-adaboost-and-gradient-boosting-9cbab2a1af81

위 그림은 Adaboost를 명확하게 설명해줍니다.

첫 번째 dataset에서 classifier가 분류를 진행합니다. 근데 + 부분이 틀린 것이 있네요. 그래서 가중치를 부여합니다.

두 번째 그림에서 + 가 커진 것을 볼 수 있습니다. 가중치가 부여된 것이죠. 그리고 또 다른 classifier가 예측을 했는데 틀린 부분에 대해서 또 가중치를 부여합니다.

Adaboost는 이런 과정을 반복합니다. 그리고 최종적으로 이것들을 합칩니다. 

합치게 되면 경계들이 복잡하게 생성되고 훨씬 더 정확한 예측을 수행할 수 있게 됩니다.

이게 Adaboost의 방법입니다.

 

gradient boosting 이란?

gradient boosting이라는 것은 Adaboost와 거의 비슷한 매커니즘을 가지고 있습니다.

즉, 일반적인 머신러닝 앙상블의 부스팅과 똑같이 약한 학습기(weak learner)를 결합하고 틀린 것에 가중치를 부여해서 보다 좋은 강력한 학습기(strong learner)를 만드는 방식을 말합니다.

하지만, 어떻게 가중치를 부여하는 것이 다른데요.

여기서는 Gradient Descent를 사용합니다.

Gradient Descent는 흔히 경사하강법이라고 불리우는 방법인데요. 손실 함수(loss function)을 정량화 해주는 역할을 합니다. 손실함수를 파라미터로 미분해서 기울기를 구하고, 이 손실(loss)값이 작아지는 방향으로 파라미터를 움직이게 하는 방법입니다.

즉, Gradient Boosting에서는 Gradient가 현재까지 학습된 classifier의 약점(weak)을 알려주고, 이후 모델이 그것을 중점으로 해서 보완을 하는 방식이라고 보시면 될 것 같습니다.

 

파이썬 사이킷런(Python scikit-learn)에서 Gradient Boosting 사용하기

파이썬 사이킷런(Python scikit learn)에서는 역시 이 Gradient Boosting을 제공해줍니다.

 

from sklearn.ensemble에서 GradientBoostingClassifier를 불러올 수 있습니다.

 

 

이 GradientBoostingClassifier 객체를 생성한 후에

다른 classifier 객체들과 마찬가지로 fit, predict를 통해 훈련, 예측을 수행합니다.

 

Python Gradient Boosting hyperparameter

앞서서 Random Forest를 소개할 때 여러 하이퍼 파라미터가 있었습니다.

Gradient Boosting 알고리즘도 하이퍼 파라미터가 있습니다.

기본적으로 Gradient Boosting hyperparmeter는 결정 트리(Decision Tree)가 가지고 있는 파라미터의 속성을 가지고 있습니다. 그 외 추가적인 속성도 있구요. 그 종류는 아래와 같습니다.

 

  • n_estimator : 결정 트리의 개수입니다. default는 10입니다. 많을 수록 좋은 성능이 나올 수도 있지만, 무조건적인 것은 아닙니다.
  • max_features : 데이터의 feature를 참조할 비율, 개수를 뜻합니다. default는 auto입니다. 
  • max_depth : 트리의 깊이를 뜻합니다.
  • min_samples_leaf : 리프노드가 되기 위한 최소한의 샘플 데이터 수입니다.
  • min_samples_split : 노드를 분할하기 위한 최소한의 데이터 수

위는 랜덤 포레스트에서 사용된 하이퍼 파라미터입니다. 기본적으로 이 하이퍼 파라미터는 random forest hyperparameter와 같기 때문에 작성하였습니다.

gradient boosting에서 사용하는 하이퍼 파라미터는 아래와 같습니다.

  • loss : gradient descent에서 사용할 비용함수입니다. 특별한 이유가 없으면 default로 갑니다.
  • learning_rate : 학습률. 값이 너무 적으면 학습이 더디고, 값이 너무 크면 튈 수도 있습니다. 적정한 값을 유지하는 것이 좋습니다. 보통 경험상 0.05 ~ 0.2 사이의 값을 가집니다.
  • subsample : weak learner가 학습에 사용하는 데이터의 샘플링 비율입니다. 기본 값은 1이며 전체 학습 데이터를 기반으로 합니다. 0.7면 70%를 뜻합니다.

 

하지만 Gradient Boosting에서부터는 grid search 등을 이용해서 hyperparameter tuning 작업을 할 때 주의사항이 있습니다.

gradient boosting 부터는 하이퍼 파라미터가 매우 많기 때문에 하이퍼 파라미터 튜닝 과정에서 시간소모가 크게 작용됩니다. 그래서 수행 시간이 오래걸릴 수 있다는 점 참고해야 합니다.

 

Python의 scikit learn에서 제공해주는 grid search를 통해 하이퍼 파라미터를 튜닝할 수 있습니다.

그러나 위에서 언급하였듯이 시간이 꽤나 걸릴 수 있다는 점! 잊지마세요

 

 

그리고 이렇게 python의 dataframe을 이용해서 rank값을 기준으로 sort하여 어떤 parameter가 제일 좋았는지 확인할 수 있습니다.

이 파라미터를 고정시켜서 Gradient Boosting 객체를 생성할 때 고정하여 생성할 수도 있습니다.

그러나 이것보다는 grid search에서 제공해주는 best_estimator_를 통해 최고의 모델을 뽑아내는 것이 좋습니다.

(편하니까요 ㅎㅎ)

 

 

이렇게 grid search에서 제공해주는 best_estimator_를 통해 최고의 모델을 뽑아냅니다.

그리고 이 return 값은 말 그대로 model이 return 되었기 때문에 predict가 가능합니다.

 

그리고 decision tree의 영향을 받아 feature_importances_를 이용할 수 있습니다.

어떤 feature가 import했는지, 그니까 어떤 feature가 중요했는지 확인할 수 있습니다.

모델을 traning하는데 어떤 feature를 중요하게 봤는지 알 수 있는 요소입니다.

 

 

model.feature_importance_ 를 통해 가져올 수 있구요

Python의 Series로 변형시킨 뒤 이렇게 시각화 할 수도 있습니다.

 

여기까지 머신러닝 앙상블 부스팅 모델 gradient boosting과 Adaboost에 대해서 알아보았습니다.

 

0 Comments
댓글쓰기 폼