랜덤 포레스트란?
- 배깅(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
'Machine Learning > scikit-learn' 카테고리의 다른 글
[앙상블] 파이썬 래퍼 XGBoost 개념과 예제 (0) | 2023.08.22 |
---|---|
[앙상블] GBM(Gradient Boosting Machine) (0) | 2023.08.22 |
[앙상블] 앙상블의 개념과 보팅(하드보팅 vs. 소프트 보팅) (0) | 2023.08.22 |
결정 트리 실습 - 사용자 행동 인식 데이터 분류 예제 (0) | 2023.08.21 |
[분류 알고리즘(앙상블)] 결정 트리(Decision Tree) (1) | 2023.08.21 |