상세 컨텐츠

본문 제목

[파이썬 완벽 가이드] 04 분류 (6) 랜덤 포레스트

학습기록

by green010809 2024. 5. 29. 11:10

본문

랜덤 포레스트의 개요 및 실습

  • 랜덤 포레스트는 배깅의 대표적인 알고리즘
  • 앙상블 알고리즘 중 비교적 수행 속도가 빠르다.
  • 기반 알고리즘은 결정 트리로, 결정 트리의 쉽고 직관적인 장점을 가지고 있다.

: 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅을 통해 예측 결정

 

출처 : Random Forest - 인코덤, 생물정보 전문위키 (incodom.kr)

 

 

부트스트랩

: 통계학에서 여러 개의 작은 데이터 세트를 임의로 만들어 개별 평균의 분포도를 측정하는 등의 목적을 위한 샘플링 방식

전체 데이터를 부트스트래핑 방식으로 만들어진 데이터 세트 = 서브세트

서브 세트의 데이터 건수는 전체 데이터 건수와 동일하지만 중첩

 

예) n_estimators = 3 으로 하이퍼 파라이터 부여 시 아래와 같은 방식으로 분할

출처 : 랜덤포레스트(Random Forest) :: BioinformaticsAndMe (tistory.com)

 

사용자 행동 인식 데이터 예측

사이킷런의 RandomForestClassifier 클래스 랜덤 포레스트 기반의 분류 지원

 

# 데이터 세트 만든 후의 코드

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

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

# 랜덤 포레스트 학습 및 별도의 테스트 셋으로 예측 성능 평가
rf_clf = RandomForestClassifier(random_state=0)
rf_clf.fit(X_train , y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_score(y_test , pred)
print('랜덤 포레스트 정확도: {0:.4f}'.format(accuracy))

 

랜덤 포레스트 정확도: 0.9253

 

랜덤 포레스트 하이퍼 파라미터 및 튜닝

트리 기반 앙상블 알고리즘의 단점

: 하이퍼 파라미터가 많아 튜닝을 위한 시간이 많이 소모됨 + 튜닝 후 예측 성능이 크게 향상 되지 X

 

하이퍼 파라미터 종류

1. 트리 기반 자체의 하이퍼 파라미터

2. 배깅, 부스팅, 학습, 정규화 등을 위한 하이퍼 파라미터

  • n_estimators : 랜덤 포레스트에서 결정 트리의 개수를 지정, 디폴트 10
  • max_features : 디폴트 'auto' = 'sqrt', 즉 전체 피쳐가 16개라면 분할을 위해 4개 참조
  • 이외 : max_depth , min_samples_leat, min_samples_split

하이퍼 파라미터 튜닝 : GridSearchCV 사용

from sklearn.model_selection import GridSearchCV

params = {
    'n_estimators':[100],
    'max_depth' : [6, 8, 10, 12], 
    'min_samples_leaf' : [8, 12, 18 ],
    'min_samples_split' : [8, 16, 20]
}
# RandomForestClassifier 객체 생성 후 GridSearchCV 수행
rf_clf = RandomForestClassifier(random_state=0, n_jobs=-1)
grid_cv = GridSearchCV(rf_clf , param_grid=params , cv=2, n_jobs=-1 )
# cv는 2, n_jobs=-1 파라미터를 추가하면 모든 CPU코어를 이용해 학습할 수 있음
grid_cv.fit(X_train , y_train)

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

 

최적 하이퍼 파라미터: {'max_depth': 10, 'min_samples_leaf': 8, 'min_samples_split': 8, 'n_estimators': 100}
최고 예측 정확도: 0.9180

 

최적 하이퍼 파라미터 출력됨, 이를 이용해 테스트 데이터의 예측 성능 측정해보자

 

별도의 테스트 데이터 세트에서 예측 성능 측정

rf_clf1 = RandomForestClassifier(n_estimators=300, max_depth=10, min_samples_leaf=8, \
                                 min_samples_split=8, random_state=0)
rf_clf1.fit(X_train , y_train)
pred = rf_clf1.predict(X_test)
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test , pred)))

 

예측 정확도: 0.9165

 

피쳐 중요도 시각화

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

ftr_importances_values = rf_clf1.feature_importances_
ftr_importances = pd.Series(ftr_importances_values,index=X_train.columns  )
ftr_top20 = ftr_importances.sort_values(ascending=False)[:20]

plt.figure(figsize=(8,6))
plt.title('Feature importances Top 20')
sns.barplot(x=ftr_top20 , y = ftr_top20.index)
fig1 = plt.gcf()
plt.show()
plt.draw()
fig1.savefig('rf_feature_importances_top20.tif', format='tif', dpi=300, bbox_inches='tight')

tGravityAcc-min()-X가 가장 높은 피처 중요도를 가지고 있다.

관련글 더보기