매일공부

[sklearn] 앙상블학습 > 랜덤 포레스트 본문

IT/ML

[sklearn] 앙상블학습 > 랜덤 포레스트

aram 2022. 11. 7. 09:28

 

앙상블 학습 Ensemble Learning

여러 개의 분류기(Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법
- 여러 개의 기본 모델 (weak learner, classifier, base learner, single learner)을 활용하여 하나의 새로운 모델을 만들어 내는 개념
- 다양한 분류기의 예측 결과 결합 >>> 단일 분류기보다 신뢰성이 높은 예측값을 얻을 수 있습니다.
- 정형 데이터 분류 >> 앙상블이 뛰어난 성능을 보임

 

출처 https://wooono.tistory.com/98

앙상블 학습의 유형

보팅 - 여러 종류의 알고리즘을 사용한 각각의 결과에 대해 투표를 통해 최종 결과를 예측하는 방식
 하드보팅 - 다수결의 원칙과 비슷(다수의 분류기가 결정한 예측값을 최종 보팅 결과값으로 선정)
 소프트보팅 - 각 알고리즘이 레이블 값 결정 확률을 예측해서, 이것을 평균하여 이들 중 확률이 가장 높은 레이블 값을 최종 값으로 예측
  > 실습 참고 : https://continuous-development.tistory.com/m/179

부트스트래핑(Bootstrapping) - 개별 Classifier에게 데이터를 샘플링해서 추출하는 방식

배깅(Bagging) 앙상블 방식동일한 알고리즘여러 분류기부트스트래핑 방식으로 샘플링된 데이터 세트에 대해서 학습을 통해 개별적인 예측을 수행한 결과를 보팅을 통해서 최종 예측 결과를 선정하는 방식(같은 알고리즘, 다른 샘플 데이터)
   >> 배깅의 대표적인 방식 : Random Forest

부스팅(Boosting) - 여러 개의 알고리즘이 순차적으로 학습을 하되, 앞에 학습한 알고리즘 예측이 틀린 데이터에 대해 올바르게 예측할 수 있도록, 그 다음번 알고리즘에 가중치를 부여하여 학습 예측을 진행하는 방식 
  >> 그래디언트 부스트: 순차 학습 > 경사하강법 사용(완전 탐색형, 최적해를 찾지 못할 수 있음)
   >> 이를 보완 =
XGBoost(eXtra Gradient Boost), LightGBM(Light Gradient Boost)

스태킹 (Stacking) - 여러 가지 다른 모델의 예측 결과값다시 학습 데이터로 만들어 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방법

 


배깅 진행 방식

(1) 동일한 알고리즘을 사용하는 일정 수의 분류기 생성 
(2) 각각의 분류기는 부트스트래핑(Bootstrapping)방식으로 생성된 샘플데이터를 학습 
(3) 최종적으로 모든 분류기가 보팅을 통해 예측 결정

※ 부트스트래핑 샘플링은 전체 데이터에서 일부 데이터의 중첩을 허용하는 방식

 

랜덤포레스트(RandomForest)

장점

- 결정 트리의 쉽고 직관적인 장점을 그대로 가지고 있음
- 앙상블 알고리즘 중 비교적 빠른 수행 속도를 가지고 있음
- 다양한 분야에서 좋은 성능을 나타냄

단점

- 하이퍼 파라미터가 많아 튜닝을 위한 시간 많이 소요

 

하이퍼 파라미터

  • n_estimators : 트리 개수 지정(클수록 성능good 시간long)
  • min_samples_split : 분할을 끝낼 node의 최소 샘플 데이터 수(클수록 과적합 방지, 너무 크면 제대로 분할x)
  • min_samples_leaf : leaf node의 최소 sample 개수(과적합 제어 용도)
  • max_features(default = 'auto') : 최적 분할을 위한 최대 feature 개수 
  • max_depth(default = None) : 트리 최대 깊이
  • max_leaf_nodes : 리프노드의 최대 개수
  • bootstrap : 중복을 허용한 샘플링 여부 

 

RandomForestRegressor 모델 

class sklearn.ensemble.RandomForestRegressor(n_estimators=100, *, criterion='squared_error', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=1.0, max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)

  • criterion 'gini', 'entropy' 중 선택 가능, 기본값은 'gini', 의사결정 나무를 학습하는 과정에서 기준 설정

 

RandomForestClassifier 모델 

class sklearn.ensemble.RandomForestClassifier(n_estimators=100, *, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='sqrt', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)

  • criterion 'gini', 'entropy' 중 선택 가능, 기본값은 'gini', 의사결정 나무를 학습하는 과정에서 기준 설정

 

#Random Forest Classifier 하이퍼파라미터

  • n_estimators: int, default=100
  • max_features: {“auto”, “sqrt”, “log2”}, int or float, default=”auto”
  • criterion: {“gini”, “entropy”}, default=”gini”
  • max_depth: int, default=None
  • min_samples_split: int or float, default=2
  • min_samples_leaf: int or float, default=1

예시코드]  

from sklearn.ensemble import RandomForestClassifier
hyperparameters = {
    'n_estimators'      : list(range(10, 50, 10)),
    'max_features'      : ['auto', 'sqrt', 'log2'],
    'criterion'         : ['gini', 'entropy'],
    'max_depth'         : [None, 1, 2, 3, 4, 5],
    'min_samples_split' : list(range(2,5)),
    'min_samples_leaf'  : list(range(1,5))
}

model.feature_importances_ 속성

  • RandomForest 학습 결과 모델로부터 특성들의 상대적인 분류 중요도 확인 
  • 값이 클수록 더 중요한 특성
  • 특성 중요도 전체 합 = 1

 

RandomForest 중요 특성 선택

  • 모델의 분산 감소 or 가장 중요한 특성만 사용 > 모델을 이해하기 쉽게 만들어야 하는 경우 : 모델 특성 개수 감소
  • sklearn에서는 두 단계의 워크플로를 사용하여 줄어든 특성으로 모델을 만들 수 있음
    1. 모든 특성을 사용해 랜덤 포레스트 모델 훈련
    2. 중요한 특성만 포함된 새로운 특성 행렬 생성
      (SelectFromModel 클래스를 사용해 threshold(임계값)보다 중요도가 크거나 같은 특성만 포함된 특성 행렬 생성)
    3. 중요한 특성만을 사용한 새로운 모델 훈련
  • 단점
    1. 원-핫 인코딩된 순서가 없는 범주형 특성의 중요도 = 여러 개의 이진 특성으로 희석
    2. 상관관계가 높은 특성의 중요도 = 한 특성에 집중
from sklearn.ensemble import RandomForestClassifier 
from sklearn import datasets 
from sklearn.feature_selection import SelectFromModel
#데이터로드

# 랜덤 포레스트 분류기 객체 생성
randomforest = RandomForestClassifier(random_state=0, n_jobs=-1) 
# 특성 중요도가 임계값보다 크거나 같은 특성으로 객체생성
selector = SelectFromModel(randomforest, threshold=0.3) 
# selector를 사용하여 새로운 특성 행렬을 만듭니다.
features_important = selector.fit_transform(features, target)
# 가장 중요한 특성을 사용하여 랜덤 포레스트 모델을 훈련합니다.
model = randomforest.fit(features_important, target)

 

RandomForestClassifier 불균형한 클래스 다루기

  • 불균형한 클래스 > 모델의 성능 감소 요인
  • 불균형한 클래스 교정 class_weight 매개변수 사용
  • class_weight{“balanced”, “balanced_subsample”}, dict or list of dicts, default=None
    > “balanced” : 데이터에 등장한 비율의 역수로 클래스 가중치 자동 부여

 

* 내용참고&출처 : 태그의 수업을 복습 목적으로 정리한 내용입니다.

728x90
Comments