본문 바로가기
Study/ML

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

by hyeon827 2024. 8. 9.

Ensemble Method

  • 일련의 예측기 (즉, 분류나 회귀 모델)로부터 예측을 수집하면 가장 좋은 모델 하나보다 더 좋은 예측을 얻을 수 있음

 

7.1 투표 기반 분류기

  • 더 좋은 분류기를 만드는 매우 간단한 방법은 각 분류기의 예측을 모아서 가장 많이 선택된 클래스를 예측하는 것
  • 이렇게 다수결 투표로 정해지는 분류기를 'hard voting(직접 투표) 분류기'라고 함

 

   TIP

  • 앙상블 방법은 예측기가 가능한 한 서로 독립적일 때 최고의 성능을 발휘
  • 즉, 각기 다른 알고리즘으로 학습
  • 이렇게 하면 매우 다른 종류의 오차를 만들 가능성이 높기 때문에 앙상블 모델의 정확도를 향상시킴
  • 투표 기반 분류기가 다른 개별 분류기보다 성능이 조금 더 높음을 확인

 

  • 모든 분류기가 클래스의 확률을 예측할 수 있으면(즉, predict_proba() 메서드가 있으면), 개별 분류기의 예측을 평균 내어 확률이 가장 높은 클래스를 예측
  • 이를 soft voting (간접 투표)라고 함 => voting = "soft"
  • 이 방식은 확률이 높은 투표에 비중을 더 두기 때문에 직접 투표 방식보다 성능이 높음 (현 예재에서 91.2% 정확도)

이미지 출처 : https://ilyasbinsalih.medium.com/what-is-hard-and-soft-voting-in-machine-learning-2652676b6a32

 

 

7.2 배깅과 페이스팅

  • 다양한 분류기를 만드는 또 다른 방법은 같은 알고리즘을 사용하고 훈련 세트의 서브셋을 무작위로 구성하여 분류기를 각기 다르게 학습시키는 것
  • 훈련 세트에서 중복을 허용하여 샘플링하는 방식을 배깅(bagging)
  • 중복을 허용하지 않고 샘플링하는 방식을 페이스팅(pasting)
  • 수집 함수는 전형적으로 분류일 때는 통계적 최빈값 (즉, 직접 투표 분류기처럼 가장 많은 예측 결과)이고 회귀에 대해서는 평균을 계산
  • 일반적으로 앙상블의 결과는 원본 데이터셋으로 하나의 예측기를 훈련시킬 때와 비교해 편향은 비슷하지만 분산은 줄어듦

 

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

  • BaggingClassifier는 기반이 되는 분류기가 결정 트리 분류기처럼 predict_proba() 함수가 있으면 자동으로 간접 투표 방식을 사용 (아래 예제에서는 500개 트리를 사용한 배깅 앙상블)
  • n_jobs : 사이킷런이 훈련과 예측에 사용할 CPU 코어 수 (-1 : 모든 코어 , 기본값은 1)

 

  • 앙상블은 비슷한 편향에서 더 작은 분산을 만듦

 

  • 부트스트래핑은 각 예측기가 학습하는 서브셋에 다양성을 증가시키므로 배깅이 페이스팅보다 편향이 조금 더 높음
  • 하지만 다양성을 추가한다는 것은 예측기들의 상관관계를 줄이므로 앙상블의 분산을 감소시킴
  • 전반적으로 배깅이 더 나은 모델을 만듦

  

   7.2.2 oob 평가

  • 배깅을 사용하면 어떤 샘플은 여러 번 샘플링되고 어떤 것은 전혀 선택되지 않을 수 있음
  • 평균적으로 훈련 샘플의 63% 정도만 샘플링
  • 선택되지 않은 훈련 샘플의 나머지 37%를 oob(out-of-bag) 샘플이라고 부름
  • 예측기가 훈련되는 동안에는 oob 샘플을 사용하지 않으므로 oob 샘플을 사용해 평가
  • 앙상블의 평가는 각 예측기의 oob 평가를 평균

 

 

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

  • BaggingClassifier는 특성 샘플링도 지원
  • 샘플링은 max_features, bootstrap_features 두 매개변수로 조정
  • bootstrap_features = True / max_features는 1.0보다 작게 설정하면 전체 특성 중 일부만 선택해 학습
  • 특성 샘플링은 더 다양한 예측기를 만들며 편향을 늘리는 대신 분산을 낮춤

 

7.4 랜덤 포레스트

  • 랜덤 포레스트는 일반적으로 배깅 방법(또는 페이스팅)을 적용한 결정 트리 앙상블
  • 전형적으로 max_samples를 훈련 세트의 크기로 지정
  • Bagging Classifier에 DecisionTreeClassifier를 넣어 만드는 대신 RandomForestClassifier 사용

 

   7.4.1 엑스트라 트리

  • 최적의 임계값을 찾는 대신 후보 특성을 사용해 무작위로 분할한 다음 그중에서 최상의 분할을 선택
  • 일반적인 랜덤 포레스트보다 엑스트라 트리가 훨씬 빠름
  • 사이킷런의 ExtraTreesClassifier 사용

   TIP

  • RandomForestClassifier가 ExtraClassifier보다 더 나을지 혹은 나쁠지 예단하기 어려움
  • 일반적으로 둘 다 시도해보고 교차 검증으로 비교해보는 것이 유일한 방법

   7.4.2 특성 중요도

  • 랜덤 포레스트의 또 다른 장점은 특성의 상대적 중요도를 측정하기 쉽다는 것 (이유 : 다수의 비교 대상 트리 존재)
  • 사이킷런은 어떤 특성을 사용한 노드가 평균적으로 불순도를 얼마나 감소시키는지 확인하여 특성의 중요도를 측정

 

 

7.5 부스팅

  • 부스팅은 약한 학습기를 여러 개 연결하여 강한 학습기를 만드는 앙상블 방법
  • 부스팅 방법의 아이디어는 앞의 모델을 보완해나가면서 일련의 예측기를 학습시키는 것

   7.5.1 에이다부스트

  • 이전 예측기를 보완하는 새로운 예측기를 만드는 방법은 이전 모델이 과소적합했던 훈련 샘플의 가중치를 더 높이는 것
  • 첫 번째 분류기를 훈련 세트에서 훈련시키고 예측
  • 두 번째 분류기는 업데이트된 가중치를 사용해 훈련 세트에서 훈련하고 다시 예측
  • 그다음에 다시 가중치를 업데이트하는 식으로 계속 진

  • 경사 하강법은 비용 함수를 최소화하기 위해 한 예측기의 모델 파라미터를 조정해가는 반면 에이다부스트는 점차 더 좋아지도록 앙상블에 예측기를 추가

  • 단, 연속된 학습 기법에는 병렬화를 할 수 없다는 단점이 존재
  • 결국 배깅이나 페이스팅만큼 확장성이 높지 않음
  • 각 샘플 가중치 w(i)는 초기에 1/m으로 초기화

  • 예측기의 가중치 αj는 아래 식을 사용해 계산
  • η은 학습률 (기본값 1) 
  • 예측기가 정확할수록 가중치가 더 높아짐

  • 가중치 합이 가장 큰 클래스가 예측 결과가 됨 

 

   7.5.2 그레이디언트 부스팅

  • 에이다부스트처럼 반복마다 샘플의 가중치를 수정하는 대신 이전 예측기가 만든 잔여 오차(residual error)에 새로운 예측기를 학습시킴

 

  • 새로운 샘플에 대한 예측을 만들려면 모든 트리의 예측을 더하면 됨
  • learning_rate 매개변수가 각 트리의 기여 정도를 조절
  • 0.1처럼 낮게 설정하면 앙상블을 훈련 세트에 학습시키기 위해 많은 트리가 필요하지만 일반적으로 예측의 성능은 좋아짐

  • 왼쪽은 훈련 세트를 학습하기에는 트리가 충분하지 않은 반면 오른쪽은 트리가 너무 많아 훈련 세트에 과대적합됨

  • 훈련을 중지하는 방법으로 조기 종료 구현할 수 있음
  • warm_start=True : 사이킷런이 fit() 메서드가 호출될 때 기존 트리를 유지하고 훈련을 추가할 수 있도록 해줌

  • GradientBoostingRegressor는 각 트리가 훈련할 때 사용할 훈련 샘플의 비율을 지정할 수 있음
  • subsample=0.25라고 하면 각 트리는 무작위로 선택된 25%의 훈련 샘플로 학습
  • 아마 추측할수 있겠지만 편향이 높아지는 대신 분산이 낮아지게 됨 (+ 훈련 속도 향상)
  • 이런 기법을 확률적 그레이디언트 부스팅(stochastic gradient boosting)이라고 함
  • 최적화된 그레이디언트 부스팅 구현으로 XGBoost 파이썬 라이브러리가 유명

 

 

7.6 스태킹

  • 먼저 훈련세트를 두 개의 서브셋으로 나눔
  • 첫 번째 서브셋은 첫 번째 레이어의 예측을 훈련시키기 위해 사용

  • 그런 다음 첫 번째 레이어의 예측기를 사용해 두 번째 세트에 대한 예측 생성
  • 홀드 아웃 세트의 각 샘플에 대해 세 개의 예측값이 있음
  • 타깃값은 그대로 쓰고 앞에서 예측한 값을 입력 특성으로 사용하는 새로운 훈련 세트 생성 (3차원)
  • 블렌더가 새 훈련 세트로 훈련하여 예측 생성

 

  • 멀티 레이어 스태킹 앙상블의 예측
  • 아래 예제이서는 훈련 세트를 세 개의 서브셋으로 나눠야됨
  • 첫 번째 세트는 첫 번째 레이어를 훈련시키는 데 사용
  • 두 번째 세트는 두 번째 레이어를 훈련시키기 위한 훈련 세트를 만드는 데 사용
  • 그리고 세 번째 세트는 세 번째 레이어를 훈련시키기 위한 훈련 세트를 만드는 데 사용

 

'Study > ML' 카테고리의 다른 글

[ML] AutoML (Pycaret, AutoGluon)  (0) 2024.08.12
[핸즈온머신러닝] Chapter 4. 모델 훈련  (0) 2024.07.23