세로형
Recent Posts
Recent Comments
Link
03-19 01:17
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

꿈 많은 사람의 이야기

머신러닝 앙상블(ensemble) xgboost란? - Python 예제와 함께 살펴보기 본문

machine learning(머신러닝)

머신러닝 앙상블(ensemble) xgboost란? - Python 예제와 함께 살펴보기

이수진의 블로그 2019. 11. 21. 07:21

머신러닝에서는 앙상블(ensemble) 모델을 빼놓을 수가 없습니다.

이 앙상블에는 배깅(bagging)과 부스팅(boosting) 그리고 보팅(voting) 방법이 있습니다. 크게 보면 말이죠

이 중 ensemble bagging에 대해서는 지난 포스팅에서 random forest(랜덤 포레스트)로 설명을 했습니다.

그리고 ensemble boosting 또한 지난 포스팅에서 Gradient Boosting Machine와 Adaboost를 예시로 들면서 포스팅을 올렸습니다.

 

하지만 이런 GBM에는 문제점이 있습니다.

 

Gradient Boosting의 문제점

머신러닝에서 앙상블 모델 중 부스팅(boosting)은 정말 강력합니다. 하지만 단점이 없는 것은 아닙니다.

특히 gradient boosting에는 여러 문제점이 있었는데요. 이 앙상블 부스팅 알고리즘의 문제점은 아래와 같습니다.

  • 느리다
  • 과적합(overfitting)의 이슈가 있다.

 

이러한 이슈가 있어서 나름 강력한 ensemble boosting 알고리즘이지만 사용할 때 고민하게 되는 이슈가 있었습니다.

 

machine learning ensemble boosting model XGBoost란?

그래서 이러한 앙상블 부스팅 모델에서 더 성능을 좋게 만들어진 여러 모델이 나오게 되었습니다.

머신러닝 부스팅 알고리즘 XGBoost 모델도 그렇게 해서 탄생하게 됩니다.

gradient boosting 알고리즘의 단점을 보완해주기 위해 나왔습니다.

반응형

 

xgboost의 특징

이 xgboost의 특징은 아래와 같습니다.

  • gbm보다는 빠르다. (gbm보다 빠른 것입니다.)
  • 과적합(overfitting) 방지가 가능한 규제가 포함되어 있다.
  • CART(Classification And Regression Tree)를 기반으로 한다.
    • 즉, 분류와 회귀가 둘 다 가능하다
  • 조기 종료(early stopping)을 제공한다.
  • 결국 Gradient Boost을 기반으로 한다.
    • 즉, 앙상블 부스팅(ensemble boosting)의 특징인 가중치 부여를 경사하강법(gradient descent)으로 한다.

 

이것의 수식은 아래와 같은데요.

일반적인 Gradient Boosting과 다른 점은 먼저 규제(regularization)이 있다는 것입니다. 이러한 규제는 모델의 overfitting을 방지하는데 사용되는 매우매우 유용한 방법입니다.

 

여기까지가 전반적인 앙상블 xgboost 모델의 전반적인 내용이었습니다.

만약, 더 자세한 내용을 알고 싶으시면 아래를 참조하세요.

https://towardsdatascience.com/xgboost-mathematics-explained-58262530904a

 

Python에서 XGBoost 사용하기

본문에 나와있는 코드는 아래 github에서 확인할 수 있습니다.

github.com/lsjsj92/machine_learning_basic

 

lsjsj92/machine_learning_basic

Repo for everyone who wants a machine learning basic - lsjsj92/machine_learning_basic

github.com

 

파이썬 사이킷런(Python scikit learn)에서는 기본적으로 xgboost를 제공하지 않습니다.

그래서 따로 설치를 해주어야 하는데요. xgboost를 설치하는 방법은 이전 포스팅에 업로드 하였습니다.

https://lsjsj92.tistory.com/546

 

윈도우10에 xgboost 설치하기 - ensemble xgboost install

xgboost는 앙상블(ensemble) 부스팅(boosting)에서 많이 사용하는 알고리즘 중 하나입니다. 이 xgboost는 파이썬 사이킷런(python scikit learn)에서 그냥 제공되지는 않는데요. 즉, 따로 설치를 해주어야 합니다...

lsjsj92.tistory.com

환경은 윈도우 환경에서 xgboost를 설치하는 과정이니 참고 바랍니다.

 

설치가 되었으면 아래와 같이 사용하면 됩니다.

 

마찬가지로 fit과 predict를 통해 훈련을 할 수 있습니다.

파이썬에서는 boosting ensemble 모델인 xgboost를 굉장히 단순하게 제공해주고 있습니다.

하지만, xgboost에는 엄청나게 많은 하이퍼 파라미터들이 있습니다.

 

결정트리 -> 랜덤 포레스트 -> gradient boosting -> 쭉쭉 오면서 모델 성능은 더 고도화 되고 좋아졌지만 그 만큼 하이퍼 파라미터(hyperparameter)도 더 많아졌습니다.

 

xgboost의 하이퍼파라미터(xgboost hyperparameter)

일단 xgboost는 기본적으로 결정 트리(decision tree), 랜덤 포레스트(결국 랜덤 포레스트도 결정 트리 기반) 등의 기반을 가지고 있습니다. 그래서 결정트리, 랜덤 포레스트, GBM와 하이퍼 파라미터가 겹치는 것도 있습니다.

  • n_estimators(혹은 num_boost_round) : 결정 트리의 개수
  • max_depth : 트리의 깊이
  • colsample_bytree : 컬럼의 샘플링 비율(random forest의 max_features와 비슷)
  • subsample : weak learner가 학습에 사용하는 데이터 샘플링 비율
  • learning_rete : 학습률
  • min_split_loss :  리프 노드를 추가적으로 나눌지 결정하는 값
  • reg_lambda : L2 규제
  • reg_alpha : L1 규제

등등 xgboost는 정말 많은 하이퍼파라미터를 가지고 있습니다.

더 궁금하신 것이 있으시면 아래 링크를 참조하세요.

https://xgboost.readthedocs.io/en/latest/parameter.html

 

그래서 xgboost는 마찬가지로 scikit learn의 grid search를 활용해서 하이퍼파라미터 튜닝(hyperparameter tuning)을 할 수 있습니다.

 

300x250

모델이 무겁고 시간이 오래걸리므로 xgboost의 hyperparameter 튜닝은 적게 진행하겠습니다.

Python scikit learn에서 제공해주는 gridsearchcv를 이용하면 됩니다.

 

 

또한, best_score_를 통해서 최고의 정확도를 뽑아낼 수 있습니다.

그리고 best_params_ 으로 가장 좋은 파라미터 정보를 뽑아낼 수 있습니다.

저는 이것을 주로 dataframe으로 만들어서 보는 것을 좋아하는데요.

pd.DataFrame으로 cv_results_ 결과를 넣어주면 그 결과값을 Python dataframe의 구조로 볼 수 있습니다.

 

xgboost의 조기 종료(early stopping)와 특성 중요도(feature importance)

 

그리고 앞서 말씀드렸듯이 xgboost는 조기 종료(early stopping) 기능을 제공해줍니다.

조기 종료는, 예를 들어 30으로 지정했으면 30번 동안 성능이 좋아지지 않으면 해당 30번 전 즉, 평가 기준이 되는 모델을 사용하도록 하고 모델 training을 일찍 종료하는 것입니다.

즉, 성능이 좋아지지도 않는데 계속 모델을 불필요하게 training 하는 시간낭비를 하지 않도록 도와주고 최고의 모델을 뽑을 수 있게 도와줍니다.

 

 

위 처럼 fit할 때 early_stopping_rounds의 값을 100으로 맞추었습니다.

그리고 조기 종료를 할때 어떤 데이터를 보고 평가를 할 것인지 eval set도 맞추었습니다.

저렇게 진행을 하면 위 사진의 아래 처럼 epochs에 따라서 loss의 상황을 보여주게 됩니다.

 

 

그리고 위 사진을 보면 171번째에 training이 멈추었는데요. 

stopping. Best Iteration을 보여주면서 71번째가 best라고 보여줍니다.

즉, 얘는 71번째 모델이 가장 좋았고, 100번을 더 실행했는데 더 안좋아지니 멈추었다.

그래서 모델은 71번째 모델로 사용한다! 라는 뜻입니다.

 

하지만, 이 early stopping 값은 잘 설정해야합니다.

왜냐하면 너무 적은 값을 선택하면 더 좋은 모델을 찾기 전에 머신러닝 모델 training 과정이 stop되기 때문입니다.

 

 

위를 보면 early_stopping_rounds를 3으로 했습니다.

그러면 어떻게 될까요?

 

 

아까는 71번째가 best 모델이었지만 이번에는 34번 모델이 가장 좋다고 나옵니다.

즉, 가장 best 모델에 다다르기 전에 이미 모델이 종료되어 버립니다.

이러한 문제점이 있기 때문에 early stopping 값을 잘 선택해주어야 합니다.

 

그리고 xgboost는 feature importance를 제공해줍니다.

앞에서 결정 트리(decision tree)와 gradient boost은 feature_importance_ 값을 가져와서 Pandas Series로 바꾸고 이거를 시각화했는데요.

xgboost는 이 과정이 간단해졌습니다.

애시당초 xgboost에서는 plot_importance라는 함수를 제공해줍니다.

xgboost plot_importance라는 함수에 xgboost 모델 객채와 plt 설정 값을 넣어주면

 

 

위와 같이 어떤 특성이 중요한지 잘 나오게 됩니다.

여기까지 머신러닝 앙상블 부스팅 모델(machine learning ensemble boosting) xgboost 내용이었습니다.

 

반응형
그리드형
Comments