이번 장에서는 앙상블 학습에 대해서 정리해보도록 하겠다.
그 중에서도 특히 많이 사용되는 랜덤 포레스트에 대해서도 다뤄보겠다.
▶ 앙상블 학습이란?
- 여러 개의 분류기를 생성하고, 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법이다.
- 각 분류기가 weak learner(약한 학습기)일지라도, 충분하게 많고 다양하다면 앙상블은 strong learner(강한 학습기)가 될 수 있다.
- 위처럼 말할 수 있는 근거가 바로 그 유명한 "대수의 법칙"이다.
- 앙상블 방법은 모든 분류기가 완벽하게 독립적이고, 오차에 상관관계가 없어야 최고의 성능을 발휘한다.
- 따라서 다양한 분류기를 얻는 한 가지 방법은 각기 다른 알고리즘으로 학습시키는 것이다.
- 대표적인 앙상블 모델로는 랜덤 포레스트(결정 트리의 앙상블)가 있다.
- 앙상블 학습의 유형은 전통적으로 보팅(Voting), 배깅(Bagging), 부스팅(Boosting)의 세 가지로 나뉜다.
▶ 보팅(Voting) 기반 분류기
- 더 좋은 분류기를 만드는 방법은 각 분류기의 예측을 모아서, 가장 많이 선택된 클래스를 예측하는 것이다.
- 사이킷런의 VotingClassifier 클래스를 사용하면 된다.
1. Hard Voting 분류기
- 다수결의 원칙과 유사하다. 즉, 다수결 투표로 정해지는 분류기이다.
2. Soft Voting 분류기
- 분류기들의 클래스 값 결정 확률을 모두 더하고 이를 평균해서, 이들 중 확률이 가장 높은 클래스 값을 최종 voting 결과값으로 선정하는 분류기이다.
- 일반적으로 Hard Voting 방법보다 Soft Voting 방법을 더 많이 사용한다.
▶ 배깅(Bagging)과 페이스팅(Pasting)
- 사이킷런의 BaggingClassifier 또는 BaggingRegressor 클래스를 사용하면 된다.
1. 배깅(Bagging) = 부트스트래핑 분할(Bootstrapping Aggregating)
- 같은 알고리즘으로 여러 개의 분류기를 만들어서 Soft Voting으로 최종 결정하는 알고리즘이다.
- 즉, 훈련 세트의 subset을 무작위로 구성하여 분류기를 각기 다르게 학습시키는 것이다.
- 훈련 세트에서 중복을 허용하여 샘플링하는 방식이다.
- 배깅의 대표적인 알고리즘은 랜덤 포레스트이다.
2. 페이스팅(Pasting)
- 배깅과 유사하나, 훈련 세트에서 중복을 허용하지 않고 샘플링하는 점이 다르다.
- 앙상블은 비슷한 편향에서 더 작은 분산을 만든다.
- 즉, 일반적으로 앙상블의 결과는 원본 데이터 셋으로 하나의 예측기를 훈련시킬 떄와 비교해, 편향은 비슷하지만 분산은 줄어든다.
<참고>
- 통계학에서는 중복을 허용한 리샘플링(resampling)을 부트스트래핑(Bootstrapping)이라고 한다.
- 즉, 여러 개의 작은 데이터 세트를 임의로 만들어, 개별 평균의 분포도를 측정하는 등의 목적을 위한 샘플링 방식을 지칭한다.
◆ oob 평가
- 배깅(Bagging)을 사용하면 어떤 샘플은 여러 번 샘플링되고, 어떤 샘플은 전혀 선택되지 않을 수 있다.
- 이처럼 선택되지 않는 훈련 샘플을 oob(out-of-bag) 샘플이라고 부른다.
- 예측기가 훈련되는 동안에는 oob 샘플을 사용하지 않으므로, 별도의 검증 세트를 사용하지 않고 obb 샘플을 사용해서 모델을 평가할 수 있다.
- 앙상블의 평가는 각 예측기의 oob 평가를 평균해서 얻는다.
- BaggingClassifier 클래스를 만들 때, oob_score = True로 지정하면 훈련이 끝난 후 자동으로 oob 평가를 수행한다.
- oob 샘플에 대한 결정 함수의 값도 oob_decision_function_ 변수에서 확인 가능하다.
- 이 결정 함수는 각 훈련 샘플의 클래스 확률을 반환한다.
▶ 랜덤 패치와 랜덤 서브스페이스
- BaggingClassifier 클래스는 특성 샘플링도 지원한다.
- 샘플링은 max_features, bootstrap_features 두 매개변수로 조절된다.
- 특성 샘플링은 더 다양한 예측기를 만들며, 편향을 늘리는 대신 분산을 낮춘다.
- 이 기법은 (이미지와 같은) 고차원의 데이터 셋을 다룰 때 유용하다.
1. 랜덤 패치 방식
- 훈련과 샘플을 모두 샘플링하는 것
2. 랜덤 서브스페이스 방식
- 훈련 샘플을 모두 사용하고, 특성은 샘플링하는 것
▶ 랜덤 포레스트 → 매우 중요!!
- 랜덤 포레스트는 일반적으로 배깅 방법(또는 페이스팅 방법)을 적용한 결정 트리의 앙상블이다.
- 전형적으로 max_samples를 훈련 세트의 크기로 지정한다.
- 사이킷런의 RandomForestClassifier 또는 RandomForestRegressor 클래스를 사용하면 된다.
- 랜덤 포레스트 알고리즘은 트리의 노드를 분할할 때, 전체 특성 중에서 최적의 특성을 찾는 대신, 무작위로 선택한 특성 후보 중에서 최적의 특성을 찾는 방식이다.
- 즉, 무작위성을 더 주입한다.
- 이 과정에서 트리를 더욱 다양하게 만들고, 편향을 늘리는 대신 분산을 낮추어 전체적으로 더 훌륭한 모델을 만들어낸다.
◆ 엑스트라 트리(또는 익스트림 랜덤 트리)
- 트리를 더욱 무작위하게 만들기 위해, 최적의 임계값을 찾는 대신 후보 특성을 사용해 무작위로 분할한 다음, 그중에서 최상의 분할을 선택하는 방식을 엑스트라 트리 또는 익스트림 랜덤 트리라고 한다.
- 마찬가지로 편향은 늘어나지만 분산은 낮춘다.
- 일반적인 랜덤 포레스트보다 엑스트라 트리가 훨씬 빠르다.
- 모든 노드에서 특성마다 가장 최적의 임계값을 찾을 필요가 없기 때문에!!
- 사이킷런의 ExtraTreesClassifier 클래스를 사용하면 된다. (사용법은 RandomForestClassifier와 동일)
◆ 특성 중요도(Feature Importance)
- 랜덤 포레스트의 장점 중 하나는 특성의 상대적 중요도를 측정하기 쉽다는 것이다.
- 사이킷런은 어떤 특성을 사용한 노드가 평균적으로 불순도를 얼마나 감소시키는지 확인하여 특성의 중요도를 측정한다.
- 사이킷런은 훈련이 끝난 뒤 특성마다 자동으로 이 점수를 계산하고, 특성 중요도의 전체 합이 1이 되도록 결과값을 정규화한다.
- 해당 결과값은 feature_importances_ 변수에 저장되어 있다.
- 랜덤 포레스트는 Feature Selection 작업을 수행할 때, 어떤 특성이 중요한지 빠르게 확인할 수 있다.
<참고>
- 결정 트리를 기반으로 하는 모델은 모두 특성 중요도를 제공한다.
- DecisionTreeClassifier의 특성 중요도는 일부 특성을 완전히 배제시키지만, 무작위성이 주입된 RandomForestClassifier는 거의 모든 특성에 대해 평가할 기회를 가진다.
- 랜덤 포레스트의 특성 중요도는 각 결정 트리의 특성 중요도를 모두 계산하여 더한 후, 트리 수로 나눈 것이다.
▶ 부스팅(Boosting)
- 여러 개의 약한 학습기(weak learner)를 연결하여 강한 학습기를 만드는 앙상블 방법이다.
- 즉, 약한 학습기 여러 개를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치를 부여하고, 오류를 개선해 나가는 학습 방식이다.
- 부스팅의 대표적인 방법으로는 에이다부스트(AdaBoost)와 그레디언트 부스팅(Gradient Boosting)이 있다.
◆ 에이다부스트(AdaBoost)
- 이전 모델이 과소적합했던 훈련 샘플의 가중치를 업데이트하면서 순차적으로 학습하는 방식이다.
- 사이킷런의 AdaBoostClassifier 또는 AdaBoostRegressor 클래스를 사용하면 된다.
◆ 그레디언트 부스팅(Gradient Boosting)
- 마찬가지로 앙상블의 이전까지의 오차를 보정하도록 예측기를 순차적으로 추가하는 방식이다.
- 하지만 에이다부스트(AdaBoost)처럼 매 반복마다 샘플의 가중치를 수정하지 않고, 이전 예측기가 만든 잔여 오차(residual error)에 새로운 예측기를 학습시킨다.
- 아래의 그림을 보면 알 수 있듯이, 트리가 앙상블에 추가될수록 앙상블의 예측이 점점 좋아지는 것을 확인할 수 있다.
- 이 때 learning_rate(학습률) 매개변수가 각 트리의 기여 정도를 조절한다.
- 학습률을 0.1처럼 낮게 설정하면, 앙상블을 훈련 세트에 학습시키기 위해 많은 트리가 필요하지만 예측 성능은 좋아진다.
- 이는 축소(Shrinkage)라고 부르는 규제 방법이다.
- 최적의 트리 수를 찾기 위해서 조기 종료 기법을 사용할 수 있다.
- staged_predict( ) 매소드를 사용하면 된다.
- 각 트리가 훈련할 때 사용할 훈련 샘플의 비율을 지정할 수도 있다.
- subsample 매개변수를 조절하면 된다.
- 이와 같은 기법을 확률적 그레디언트 부스팅(Stochastic Gradient Boosting)이라고 한다.
◆ XGBoost(Extreme Gradient Boosting) → 굉장히 hot한 기법!!
- XGBoost는 매우 빠른 속도와 확장성, 그리고 이식성을 갖추고 있다.
- 머신러닝 경연 대회에서 많은 우승자들이 사용하는 기법 중 하나이다. (그만큼 뛰어난 기법이라는 뜻...)
- XGBoost는 자동 조기 종료와 같은 여러 좋은 기능들도 제공한다.
- early_stopping_rounds 매개변수를 지정하면 된다.
<참고>
- 핸즈온 머신러닝 교재에는 XGBoost에 대한 자세한 설명이 나와있지는 않다. 따라서 "머신러닝 완벽 가이드" 교재를 참고해서 공부하면 좋을 듯 싶다!!
▶ 스태킹(Stacking)
- 스태킹은 개별적인 여러 알고리즘을 서로 결합해 예측 결과를 도출한다는 점에서 배깅(Bagging) 및 부스팅(Boosting)과 유사하다.
- 하지만 가장 큰 차이점은 개별 알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행한다는 점이다.
- 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만든다.
- 별도의 머신러닝 알고리즘으로 최종 학습을 수행한다.
- 테스트 데이터를 기반으로 다시 최종 예측(메타 모델을 사용)을 수행한다.
- 정리해보면, 스태킹 모델은 두 종류의 모델이 필요하다.
- 개별적인 기반 모델 (스태킹을 적용할 때는 많은 개별 모델들이 필요함)
- 개별 기반 모델의 예측 데이터를 학습 데이터로 만들어서 학습하는 최종 메타 모델
- 따라서 스태킹 모델의 핵심은 여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합해, 최종 메타 모델의 학습용 피처 데이터 세트와 테스트용 피처 데이터 세트를 만드는 것이다.
- 스태킹 모델은 일반적으로 성능이 비슷한 모델을 결합해서, 좀 더 나은 성능 향상을 도출하기 위해 사용된다.
<참고>
- 사이킷런에서는 스태킹을 직접 지원하지 않는다.
- 구현 방법은 "머신러닝 완벽 가이드" 교재에 자세히 나와있으니 참고하자!!
여기까지 해서 "7장. 앙상블 학습과 랜덤 포레스트"에 대한 정리를 마치도록 하겠다.
다음 챕터에서는 "차원 축소"에 대해서 다뤄볼 예정이다.
★ 참고 자료
- 핸즈온 머신러닝 2/E 교재
- 파이썬 머신러닝 완벽 가이드 교재
'Data Science > Machine Learning' 카테고리의 다른 글
[핸즈온 머신러닝 2/E] 9장. 비지도 학습 (0) | 2020.08.06 |
---|---|
[핸즈온 머신러닝 2/E] 8장. 차원 축소 (0) | 2020.07.29 |
[핸즈온 머신러닝 2/E] 6장. 결정 트리 (6) | 2020.07.18 |
[핸즈온 머신러닝 2/E] 5장. 서포트 벡터 머신 (0) | 2020.07.08 |
[핸즈온 머신러닝 2/E] 4장. 모델 훈련 (0) | 2020.06.27 |