본문 바로가기
Machine Learning/scikit-learn

[앙상블] 랜덤 포레스트

by ISLA! 2023. 8. 22.

 

 

랜덤 포레스트란?

 

 

  • 배깅(Bagging)같은 알고리즘으로 여러 개 분류기를 만들어 보팅으로 최종 결정하는 알고리즘
    • 배깅의 대표 알고리즘은 랜덤 포레스트
  • 랜덤 포레스트 특징
    • 높은 예측 성능을 보이며, 기반 알고리즘은 결정 트리임
    • 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행 ➡ 모든 분류기가 보팅을 통해 예측 결정
    • 개별 트리가 학습하는 데이터 세트는 전체 데이터에서 일부가 중첩되게 샘플링된 데이터 세트 ➡ 즉, 부트스트래핑 분할
      • 이렇게 뽑힌 서브세트의 데이터 건수는 전체 데이터 건수와 동일하지만, 일부 데이터가 중첩되는 것
      • n_estimator로 하이퍼 파라미터를 부여하여 데이터 서브세트 개수를 결정
      • 예를 들어 n_estimator = 3이면, 3개의 서로 다른 중첩된 데이터 세트가 만들어지고, 각각 예측을 수행
    • 부트스트래핑 샘플링 방식
      👉 아래 이미지에서와 같이 중복을 허용하여 전체 데이터 세트와 동일한 개수의 학습 데이터 셋을 만듦

부트스트래핑

  • 사이킷런의 RandomForestClassifier 클래스를 통해 랜덤 포레스트 기반 분류 수행

 


 

 

랜덤 포레스트 예제

 

 

(랜덤 포레스트와 직접 연관된 코드만 있어, 내용 파악으로 참고)

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

# 결정 트리에서 사용한 get_human_dataset() 이용해서 학습/테스트용 데이터프레임 반환
X_train, X_test, y_train, y_test = get_human_dataset()

# 랜덤 포레스트 학습
rf_clf = RandomForestClassifier(n_estimators=100, random_state = 1, max_depth = 8)
rf_clf.fit(X_train, y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)

print("정확도: ", accuracy)

결과

하이퍼 파라미터 튜닝

 

  • 결정 트리에서 사용된는 하이퍼 파라미터와 같은 파라미터가 많음
  • 아래 예시 외에도, 결정 트리에서 과적합 개선을 위해 사용되는 max_depth, min_samples_split, min_samples_leaf 등을 동일하게 적용할 수 있음
n_estimator 결정 트리의 개수 지정(디폴트 10개)
많이 설정할수록 좋은 성능을 기대할 수 있음
➡ 너무 많이 설정하면 학습 수행 시간이 오래 걸릴 수 있음
max_features 결정 트리의 경우와 동일(디폴트는 auto, sqrt)
➡ 예를 들어 전체 피처가 16개라면 분할을 위해 4개 참조

 

👀 GridSearchCV를 통한 하이퍼 파라미터 튜닝 예제

  • n_jobs= -1 로 모든 CPU 코어를 사용하는 병렬 처리 수행
  • 그럼에도 시간이 꽤 걸림 
from sklearn.model_selection import GridSearchCV
params = {
    'n_estimators' : [50, 100, 150],
    'max_depth' : [8, 16, 24],
    'min_samples_leaf' : [1, 6, 12],
    'min_samples_split' : [2, 8, 16]
}

# RandomForestClassifier 객체 생성 후, GridSearchCV
rf_clf = RandomForestClassifier(n_estimators = 100, random_state = 1, n_jobs = -1)  # 병렬처리
grid_cv = GridSearchCV(rf_clf, param_grid = params, cv = 2, n_jobs=-1) # 병렬처리
grid_cv.fit(X_train, y_train)

print('최적 하이퍼 파라미터:\n', grid_cv.best_params_)
print('최고 예측 정확도: {0:.4f}'.format(grid_cv.best_score_))

 

결과

728x90