핸즈 온 머신러닝 (Hands-On Machine Learning with Scikit-Learn & TensorFlow) / 오렐리앙 제론 지음 , 박해선 옮김

을 읽고, 추후 기억을 되살릴 수 있게끔 나만의 방법으로 내용을 리뷰한다. 따라서 리뷰의 내용 별 비중이 주관적일 수 있다.

 

챕터 7. 앙상블 학습과 랜덤 포레스트

여러 예측기로부터 예측을 수집하면 좋은 모델 하나보다 더 좋은 예측을 얻을 수 있다. 이를 앙상블 학습이라고 한다. 그 중, 결정 트리들의 앙상블을 랜덤 포레스트라고 한다.

 

7.1 투표 기반 분류기

여러 분류기 중 가장 많이 선택된 클래스를 예측하는 것을 직접 투표 (hard voting) 이라고 한다. 만약 훈련 결과가 모두 독립이라면 51%의 정확도를 가진 1000개의 분류기로 75% 정확도를 기대할 수 있다. 만약 모든 분류기가 클래스의 확률을 예측할 수 있으면, 확률을 기반으로 투표하는데 이를 간접 투표 (soft voting) 이라고 한다.

 

7.2 배깅과 페이스팅

같은 알고리즘을 사용하되 훈련 세트의 서브셋을 무작위로 구성하는 방법도 있다. 이 때 중복을 허용하면 bagging이라고 하며 중복을 허용하지 않으면 pasting 이라고 한다. 배깅과 페이스팅은 병렬로 학습할 수 있기 때문에 인기가 높다.

 

7.2.1 사이킷런의 배깅과 페이스팅

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html

 

sklearn.ensemble.BaggingClassifier — scikit-learn 0.22.1 documentation

 

scikit-learn.org

sklearn의 BaggingClassifier나 BaggingRegressor를 사용하면 된다. 페이스팅을 사용하려면 bootstrap=False로 지정하면 된다. 앙상블은 비슷한 편향에서 더 작은 분산을 만든다. 기존에도 설명했지만 편향은 모델과 데이터간의 거리 (예측이 정확하지 않을수록 크다)이고 분산은 예측된 값들 끼리의 거리이다. (모델이 복잡할수록 크다)


7.2.2 oob 평가

BaggingClassifier는 기본적으로 중복을 허용하여 m개 샘플을 선택하는데, 이는 각각의 예측기에 평균 63% 정도만 샘플링 된다는 뜻이다. ( (1-1/m)^m ) 따라서 남은 37%는 훈련하지 않으므로 oob (out-of-bag) 샘플을 사용해 평가할 수 있다. BaggingClassifier.oob_decision_function_ 을 통해 확인할 수 있다. 각 샘플이 oob에 속한 예측기들의 예측값 평균이다. 그러한 예측기가 없을 때에는 출력되지 않는다.


7.3 랜덤 패치와 랜덤 서브스페이스

BaggingClassifier를 통해 데이터가 아니라 특성을 샘플링할 수 있다. 데이터와 특성을 모두 샘플링하는 것을 Random Patches Method라고 부르고 특성만 샘플링 하는 것은 Random Subspaces method 라고 한다.

 

7.4 랜덤 포레스트

랜덤 포레스트는 일반적으로 Bagging을 적용한 결정 트리의 앙상블이다. 전형적으로 max_samples를 훈련 세트의 크기로 지정한다.

 

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html

 

3.2.4.3.1. sklearn.ensemble.RandomForestClassifier — scikit-learn 0.22.1 documentation

 

scikit-learn.org

 

7.4.1 엑스트라 트리

랜덤 포레스트에서 각 노드는 무작위로 특성의 서브셋을 만들어 사용하지만, 더욱 무작위하게 만들기 위해 최적의 임곗값을 찾는 대신 후보 특성을 사용해 무작위로 분할한다음 최적의 분할을 선택하는 것을 Extremely Randomized Trees 라고 부른다.

 

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html

 

3.2.4.3.3. sklearn.ensemble.ExtraTreesClassifier — scikit-learn 0.22.1 documentation

 

scikit-learn.org


7.4.2 특성 중요도

RandomForestClassifier.feature_importances_ 를 보면 각 특성의 중요도를 알 수 있다. 

 

7.5 부스팅

boosting은 약한 학습기를 여러 개 연결하여 강한 학습기를 만드는 앙상블 방벙비다.

 

7.5.1 아다부스트

이전 모델이 과소적합했던 훈련샘플들의 가중치를 높여 새로운 예측기를 만드는것이 Ada Boost 방법이다. 첫 번째 분류기가 훈련 한 후, 잘못 분류된 훈련 샘플의 가중치를 높여 두 번째 분류기를 만들고, 그렇게 n 개의 분류기를 만든다. 추후 예측을 할 때에는 각각의 분류기가 투표를 하는데, 각 샘플의 가중치에 비례하여 에러율을 정하고 에러율에 기반하여 각 분류기의 투표 가중치를 정한다.

 

사이킷런에서는 Ada Boost의 다중 클래스 버전을 사용한다. AdaBoostClassifier와 AdaBoostRegressor가 존재한다.

 

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html

 

sklearn.ensemble.AdaBoostClassifier — scikit-learn 0.22.1 documentation

 

scikit-learn.org

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostRegressor.html

 

sklearn.ensemble.AdaBoostRegressor — scikit-learn 0.22.1 documentation

 

scikit-learn.org


7.5.2 그래디언트 부스팅

또 다른 부스팅 방법은 Gradient Boosting이다. 이전 예측기가 만든 Residual Error에 새로운 예측기를 학습시킨다. 새로운 샘플에 대한 예측을 만들려면 모든 트리의 예측을 더하면 된다.

 

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html

 

3.2.4.3.5. sklearn.ensemble.GradientBoostingClassifier — scikit-learn 0.22.1 documentation

 

scikit-learn.org

 

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingRegressor.html

 

3.2.4.3.6. sklearn.ensemble.GradientBoostingRegressor — scikit-learn 0.22.1 documentation

 

scikit-learn.org

learning_rate로 각 트리의 기여 정도를 조절하는데, 낮을 수록 많은 트리가 필요하지만 성능은 좋아진다. 트리가 너무 많으면 과대적합 되므로 최적의 트리수를 찾아야 하는데 staged_predict() method를 사용하면 최적의 개수를 찾을 수 있다.

 

Gradient Boosting 과정에서 샘플을 일부만 사용할 ㅅ 있는데, 이 경우 편향이 높아지는 대신 분산이 낮아진다. 이를 Stochastic Gradient Boosting 이라고 한다.

 

7.6 스태킹

stacking은 앙상블에 속한 예측기의 예측을 가지고 투표하는 모델을 훈련시키는 것이다. 이 때 예측기의 예측을 취합하여 예측하는 최종 예측기를 blender 라고 부른다. 일반적으로 훈련 세트를 나누어, 각각의 서브셋은 한 레이어의 블렌더를 훈련시키기 위해 사용된다. Multi Layer Stacking Ensemble 모델은 마치 MLP 모델과 닮았다.

+ Recent posts