본문 바로가기

Data Science/Machine Learning

[핸즈온 머신러닝 2/E] 7장. 앙상블 학습과 랜덤 포레스트

이번 장에서는 앙상블 학습에 대해서 정리해보도록 하겠다.

 

그 중에서도 특히 많이 사용되는 랜덤 포레스트에 대해서도 다뤄보겠다.

 

 

▶ 앙상블 학습이란?

  • 여러 개의 분류기를 생성하고, 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법이다.
  • 각 분류기가 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_ 변수에서 확인 가능하다.
      • 이 결정 함수는 각 훈련 샘플의 클래스 확률을 반환한다.

oob 평가(왼쪽)와 oob 샘플에 대한 결정 함수(오른쪽)

 

 

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

  • 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)과 유사하다.
  • 하지만 가장 큰 차이점은 개별 알고리즘으로 예측한 데이터를 기반으로 다시 예측을 수행한다는 점이다.
    1. 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만든다.
    2. 별도의 머신러닝 알고리즘으로 최종 학습을 수행한다.
    3. 테스트 데이터를 기반으로 다시 최종 예측(메타 모델을 사용)을 수행한다.
  • 정리해보면, 스태킹 모델두 종류의 모델이 필요하다.
    • 개별적인 기반 모델 (스태킹을 적용할 때는 많은 개별 모델들이 필요함)
    • 개별 기반 모델의 예측 데이터를 학습 데이터로 만들어서 학습하는 최종 메타 모델
  • 따라서 스태킹 모델의 핵심여러 개별 모델의 예측 데이터를 각각 스태킹 형태로 결합해, 최종 메타 모델의 학습용 피처 데이터 세트와 테스트용 피처 데이터 세트를 만드는 것이다.
  • 스태킹 모델은 일반적으로 성능이 비슷한 모델을 결합해서, 좀 더 나은 성능 향상을 도출하기 위해 사용된다.

스태킹 앙상블 모델 설명

<참고>

  • 사이킷런에서는 스태킹을 직접 지원하지 않는다.
  • 구현 방법은 "머신러닝 완벽 가이드" 교재에 자세히 나와있으니 참고하자!!

 

여기까지 해서 "7장. 앙상블 학습과 랜덤 포레스트"에 대한 정리를 마치도록 하겠다.

 

다음 챕터에서는 "차원 축소"에 대해서 다뤄볼 예정이다.

 

★ 참고 자료

- 핸즈온 머신러닝 2/E 교재

- 파이썬 머신러닝 완벽 가이드 교재