관리 메뉴

꿈 많은 사람의 이야기

머신러닝 bagging 앙상블 랜덤 포레스트(random forest)란? 본문

machine learning(머신러닝)

머신러닝 bagging 앙상블 랜덤 포레스트(random forest)란?

이수진의 블로그 이수진의 블로그 2019. 11. 15. 12:40

머신러닝 앙상블에는 배깅(bagging), 보팅(voting), 부스팅(boosting)이 있습니다.

그 중 앙상블 bagging에 속한 랜덤 포레스트를 이번 포스팅에서 소개할까합니다.

이 random forest는 빠른 속도와 높은 예측 성능을 보이는 알고리즘입니다.

 

랜덤 포레스트(random forest)란? 

출처 : https://medium.com/@williamkoehrsen/random-forest-simple-explanation-377895a60d2d

 

랜덤 포레스트(random forest)는 결정 트리(decision tree)를 기반하여 만들어졌습니다. 

랜덤 포레스트는 여러 개의 결정 트리 classifier가 생성됩니다. 그리고 각자의 방식으로 데이터를 sampling하여 개별적으로 학습합니다.

그리고 최종적으로 voting을 통해 데이터에 대한 예측을 수행합니다. 

위 그림과 같이 말이죠!

 

그럼 여기서 하나의 wording이 있는데요. 각자의 방식으로 데이터를 sampling한다.

이게 무슨 뜻일까요?

아래 그림을 보시죠

위 그림을 보시면 original data에서 bootstrap을 해서 데이터를 가져온 것이 보이실겁니다.

즉, 랜덤 포레스트는 각각의 classifier를 가지고 훈련을 하지만 각 학습하는 dataset은 original dataset에서 sampling하여 가지고 옵니다.

이 과정을 부트스트래핑(bootstraping)이라고 합니다.

bootstraping 과정은 각 bootstrap은 데이터가 중복될 수 있으며 또한, 내부적으로도 데이터가 중복이 될 수 있습니다.

 

파이썬 scikit learn에서 random forest 사용법

랜덤 포레스트에 대해서 전반적인 내용을 보았습니다.

그럼 파이썬에서 랜덤 포레스트를 어떻게 사용할까요?

python sciki learn패키지에는 random forest가 있습니다. 즉, python에서 random forest를 사용하는 방법은

scikit learn을 이용하면 되고, scikit learn의 ensemble 패키지에 속해 있습니다.

 

자, 이렇게 from sklearn.ensemble에서 import RandomForestClassifier를 가지고 오면 됩니다.

결정 트리는 단순히 tree 알고리즘 이기 때문에 sklearn.tree에 속해있는 것을 볼 수 있습니다.

간단한 예제를 살펴보죠. 

kaggle의 타이타닉 데이터를 이용합니다.

(https://www.kaggle.com/lsjsj92/simple-titanic-kernel-82-for-beginner-like-me)

 

 

타이타닉 데이터를 불러와서 X, y로 나눕니다.

또한, 그 X,y를 X_train, X_test, y_train, y_test로 나누고 RandomForestClassifier 객체를 생성해 fit, predict 합니다.

사용법은 굉장히 간단합니다.

하지만 여기에는 하이퍼 파라미터(hyperparameter)가 있습니다. 이 값들을 어떻게 튜닝(tuning)하느냐에 따라 성능이 달라질 것입니다.

 

랜덤 포레스트의 하이퍼 파라미터 - random forest hyperparameter

랜덤 포레스트의 하이퍼 파라미터는 아래와 같습니다.

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

(참고 : https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)

 

등등의 하이퍼 파라미터가 있습니다.

이 값들을 어떻게 튜닝하느냐에 따라 모델의 성능이 달라질 수 있습니다.

 

grid search와 random forest

그럼 random forest의 하이퍼 파라미터 튜닝을 위해서 scikit learn의 grid search를 활용해보겠습니다.

grid search는 key, value 쌍의 데이터를 입력 받아 key값에 해당하는 파라미터의 값을 튜닝시켜줍니다.

 

위 사진에서 rf_param_grid라는 값의 dictionary를 만들었습니다.

이 딕셔너리에서  key에가다 파라미터 이름을 넣고 value에는 값을 list로 넣습니다.

이제 이 parameter를 gridserachcv에 넣어주면 됩니다.

gridsearchcv(classifier, param_grid, scoring 방식.. ) 등을 넣고 훈련해줍니다.

그럼 파라미터 조합에 따라 모델을 만들고 어떤 파라미터가 제일 best한지 뽑아낼 수 있습니다.

 

 

최고의 평균 정확도는 gridsearchcv의 best_score_를 통해 볼 수 있습니다.

그리고 최고의 파라미터는 gridsearchcv의 best_params_를 통해 볼 수 있습니다.

그리고 이 훈련하는 과정에서 parameter에 따른 성능을 보고 싶으면 아래처럼 dataframe으로 변형시켜 볼 수 있습니다.

 

 

 

또한, 랜덤 포레스트에서는 어떤 파라미터가 제일 중요한지 뽑아낼 수 있습니다.

바로 feature_importances_를 이용하면 되는데요.

훈련시킨 model에 model.feature_importances_를 통해 뽑아낼 수 있습니다.

 

이렇게말이죠!

여기까지 머신러닝 앙상블 랜덤 포레스트였습니다.

0 Comments
댓글쓰기 폼