PL/Python

Ensemble learning 2: 배깅 Bagging, 랜덤 포레스트

PIYA 2022. 12. 16.

Introduction

지난 시간에는 앙상블 학습의 개념과 보팅Voting에 대해 다뤘다.

이번에는 배깅Bagging이 무엇인지 알아보고,

랜덤 포레스트 분류기를 실습해보자.

 

 

배깅(Bagging)

용어부터 정리하자.

배깅은 Bootstrap Aggregating을 줄인 말로,

부트스트래핑 방식으로 Aggregation(집계)하였다는 의미가 된다.

 

부트스트래핑은 통계학에서 유용하게 사용되는 방식으로,

간단히 말하면 모집단의 샘플 갯수만큼 복원추출해 데이터셋을 구성하는 방법을 말한다.

 

모집단이 1부터 10까지의 정수일때, 3개의 부트스트랩 분할을 한다고 하면

아래와 같이 3개의 서브 데이터셋이 구성된다.

 

Bootstrap Aggregating

 

out-of-bag dataset

줄여서 oob.

부트스트래핑 방식으로 서브셋을 나눴을 때, 해당 서브셋에 뽑히지 않은 데이터셋을 말한다.

어려운 개념은 아니므로 아래 위키피디아 그림으로 설명을 대신한다.

 

out-of-bag dataset

 

 

 

랜덤 포레스트 (Random Forest)

배깅 bagging 방식의 대표적인 알고리즘이 랜덤 포레스트다.

약한 학습기(weak-learner)인 결정트리 알고리즘을 기반으로 작동한다.

랜덤 포레스트는 결정트리의 단점인 과적합 (over-fitting) 문제를 수천개의 많은 분류기를 결합해 보완한다.

학습속도가 비교적 빠르고 예측성능이 좋아 다양한 영역에서 활용된다.

결정트리(나무)가 매우 많고, 부트스트랩 추출이 랜덤이기때문에 랜덤 포레스트라 이름지어졌다.

 

아래는 개념이해를 돕기위한 그림이다.

N개의 부트스트랩 데이터셋에 N개의 결정 트리를 적용한다.

각 결정트리의 결과값을 소프트보팅해 최종 클래스 예측값을 산출한다.

 

설명이 부족한 것 같아, 다시 설명하자.

여러 개의 decision tree estimators들이 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링한다.

개별적으로 학습을 수행하고, 최종적으로 모든 분류기가 소프트 보팅을 통해 예측값을 결정한다.

Random Forest

 

 

하이퍼파라미터

랜덤포레스트의 하이퍼파라미터를 간단히 정리하자.

 

n_estimators

결정트리의 개수를 지정한다.

현재버전 기준 디폴트로 100개를 사용한다.

많이 사용하면 좋은 성능이 나올 확률이 높지만 학습시간이 길어지고,

너무 많아지면 과적합의 위험도 늘어난다.

1000개~2000개 정도면 일반적으로 충분하다고 본다.

 

max_features

결정트리에 사용된 max_features 파라미터와 같다.

하지만 차이점은 디폴트값이 None이 아니라 sqrt 다.

너무 많은 트리를 사용하기 때문에 과적합을 방지하기 위함이다.

 

총 피쳐가 4개이고 각 피쳐를 A,B,C,D라 하자.

설정값을 건드리지 않는다면 max_features=sqrt(n_features) = 2 가 된다.

 

이 때, 각 결정트리마다 사용할 2개의 피쳐셋 조합은 다를 수 있다.

샘플 데이터셋 1번은 피쳐 A와 B가 사용되고, 샘플 데이터셋 2번은 피쳐 B와 C가 사용될 수 있다.

 

max_depth, min_samples_split, min_samples_leaf

결정 트리에서와 마찬가지로 과적합을 개선하기 위해 사용한다.

 

 

예제코드 연습

간단한 랜덤포레스트를 간단하게 돌려보자.

복잡한건 하나도 없고, 그냥 해본다는거에 의의를 두는 정도ㅎㅎ

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import f1_score

# 위스콘신 유방암 데이터 로드, train_test_split으로 데이터 나누기
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.2)

# 기본설정 랜덤포레스트 돌려보기. 디폴트 n_estimators=100
rf = RandomForestClassifier(n_jobs=-1) # 모든 코어 사용
rf.fit(X_train, y_train)
pred = rf.predict(X_test)
f1 = f1_score(y_test, pred)
print('랜덤 포레스트 f1스코어: {0:.4f}'.format(f1))
print('\n', rf.get_params())

 

 

 

Conclusion

보팅과 랜덤포레스트에 대해 공부하고, 간단한 코드를 작성했다.

 

보팅과 배깅의 차이점

일반적으로, 보팅은 서로 다른 알고리즘을 가진 분류기들을 결합하고

배깅은 같은 알고리즘을 기반으로한 학습기들을 '데이터 샘플링을 다르게'하여 학습시켜 결합한다.

 

 

댓글