랜덤 포레스트는 앙상블 배깅 방법의 대표적인 알고리즘이다. 배깅은 바로 이전 글에서 정리한 보팅과는 다르게 여러 개의 분류기를 만들어서 최종 예측을 하는 알고리즘이다. 해당 글에서는 랜덤 포레스트에 대해 정리한다.
Random Forest (랜덤 포레스트)
랜덤 포레스트는 결정 트리를 기반으로 하기 때문에 쉽고 직관적인 장점이 있다. 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링 (부스스트래핑 Bootstrapping 분할 방식, 데이터 중첩 허용) 하여 개별적으로 학습한 뒤 최종적으로 모든 분류기가 보팅 (soft, hard) 을 통해 예측 결정을 하게 된다.
랜덤 포레스트 프로세스
전체 학습 데이터 중 데이터 샘플링 수행 (부스스트래핑 분할 방식 이용, 서브 데이터셋의 수는 전체 데이터 수와 동일, 중첩 허용)
같은 여러 개의 알고리즘을 이용하여 개별적인 학습 수행
보팅 (예 - 소프트 보팅) 을 통한 최종 예측 결정
사이킷런의 RandomForestClassifier 클래스를 이용하여 구현할 수 있다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
rf_clf = RandomForestClassifier(random_state=0, max_depth=8)
rf_clf.fit(X_train, y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_score(y_test, pred)
GridSearchCV는 교차 검증과 최적 하이퍼 파라미터 튜닝을 한 번에 할 수 있도록 도와주는 API이며, 이전에 정리한 바 있다. 간단하게 정리하면,
1) cross_validation을 위한 학습/테스트 세트 자동 분할 (단, cv = 교차 검증을 위해 분할되는 폴드 수)
2) 하이퍼 파라미터 그리드에 기술된 모든 파라미터 순차적으로 적용
3) 최적의 파라미터 찾음
from sklearn.model_selection import GridSearchCV
params = {
'n_estimators':[100], ## 하이퍼 파라미터 n_estimators, 100개의 서브 데이터셋 (100개의 분류기 생성)
'max_depth':[6, 8, 10, 12], ## 하이퍼 파라미터 max_depth, 트리 깊이 제한, 과적합 방지
'min_samples_leaf':[8, 12, 18 ], ## 하이퍼 파라미터 min_samples_leaf
'min_samples_split':[8, 16, 20] ## 하이퍼 파라미터 min_samples_split
}
## RandomForestClassifier 객체 생성 후 GridSearchCV 수행
## cv = 교차 검증을 위해 분할되는 폴드 수
## n_jobs = RFClassfier과 GridSearchCV에 -1 파라미터 값을 추가하여 모든 CPU 코어를 이용한 학습 수행
rf_clf = RandomForestClassifier(random_state=0, 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_))
RandomForestClassifer도 결정 트리와 마찬가지로 피처 중요도를 확인할 수 있다.
참고 - 피처 중요도 시각화
랜덤 포레스트는 배깅의 대표적인 알고리즘이다. 부스스트래핑 분할 방식을 이용하여 샘플링을 한 후, 여러 개의 분류기를 학습시켜 보팅을 통한 최종 예측을 반환한다. n_estimators, max_depth 등의 하이퍼 파라미터가 있으며 GridSearchCV를 이용하여 튜닝이 가능하다.
파이썬 머신러닝 완벽 가이드 교재