Search

Bagging - RandomForest

배깅은 앞서 설명한 것처럼 동일한 알고리즘으로 서로 다른 샘플링을 통해 보팅을 수행하는 것이다. 대표적인 알고리즘으로 랜덤 포레스트가 있다.
랜덤포레스트의 기반 알고리즘은 결정 트리다.
서브세트의 데이터 건수는 전체 데이터 건수와 동일하지만 데이터가 중첩(부트스트래핑)되어 만들어진다.
사이킷런에서 RandomForestClassifier 클래스를 제공한다.
사용자 행동 인식 데이터 세트를 이용해서 분석하겠다.
from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score import pandas as pd import warnings warnings.filterwarnings('ignore') # 결정 트리에서 사용한 get_human_dataset()이용해 학습/테스트용 데이터프레임 반환 def get_human_dataset(): # 각 데이터 파일은 공백으로 분리되어 있으므로 read_csv에서 공백문자를 sep으로 할당 feature_name_df = pd.read_csv('human_activity/UCI HAR Dataset/features.txt',sep='\s+', header=None, names=['column_index','column_name']) # 중복된 피처명을 수정하는 get_new_feature_name_df()를 이용, 신규 피처명 데이터프레임 생성 new_feature_name_df = get_new_feature_name_df(feature_name_df) # 데이터프레임에 피처명을 칼럼으로 부여하기 위해 리스트 객체로 다시 변환 feature_name = new_feature_name_df.iloc[:,1].values.tolist() # 학습 피처 데이터세트와 테스트 피처 데이터를 데이터프레임으로 로딩. 칼럼명은 feature_name 적용 X_train = pd.read_csv('/human_activity/UCI HAR Dataset/train/X_train.txt',sep='\s+',names=feature_name) X_test = pd.read_csv('/human_activity/UCI HAR Dataset/test/X_test.txt',sep='\s+',names=feature_name) # 학습 레이블과 테스트 레이블 데이터를 데이터프레임으로 로딩하고 칼럼명은 action으로 부여 y_train = pd.read_csv('/human_activity/UCI HAR Dataset/train/y_train.txt',sep='\s+',header=None,names=['action']) y_test = pd.read_csv('/human_activity/UCI HAR Dataset/test/y_test.txt',sep='\s+',header=None, names=['action']) # 로드된 학습/테스트용 데이터프레임을 모두 반환 return X_train, X_test, y_train, y_test
Python
복사
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.9108 '''
Python
복사

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

앙상블 알고리즘의 단점을 뽑자면 하이퍼 파라미터가 너무 많아서 튜닝을 위한 시간 소요가 많이 든다는 점이다. 일단 기반 모델인 트리 모델 자체의 하이퍼 파라미터가 많고 앙상블을 위한 하이퍼 파라미터까지 추가되므로 당연히 많을 수 밖에 없다. 그나마 랜덤포레스트가 적은 편이다.( 결정트리에서 사용되는 하이퍼 파라미터와 같은 파라미터가 대부분이기때문)
n_estimators : 결정 트리의 개수 설정. 디폴트는 10개, 늘릴수록 학습 수행 시간이 늘어남.
max_features : 결정 트리에 사용된 max_features 파라미터와 같다. 디폴트는 ‘sqrt’=’auto’ 다. 예를들어 전체 피처가 16개라고 할 때 가지치기할 피처는 4개만 고려한다는 의미다.
max_depth 또는 min_samples_leaf 과 같이 결정 트리에 사용하는 하이퍼 파라미터 모두 사용가능
GirdSearchCV를 통해서 랜덤포레스트의 하이퍼 파라미터 튜닝을 진행하겠다.
1.
튜닝시간을 절약하기 위해 n_estimators는 100개
2.
cv=2로 설정
랜덤포레스트 예측 성능이 약간 떨어지더라도 빠른 학습 수행 시간을 가진다는 장점이 있기 때문에 기반 모델로써 구축하는 경우가 많다.
from sklearn.model_selection import GridSearchCV params = {'n_estimators':[100], # 일단 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) 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 '''
Python
복사
이번에는 n_estimators를 300으로 증가시키고 최적 하이퍼 파라미터로 학습시킨 뒤 이번에는 테스트 데이터 세트에서의 예측 성능을 측정해보자.
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 '''
Python
복사
마찬가지로 랜덤포레스트도 결정트리와 같게 feature_importances_ 속성을 이용해 피처들의 중요도를 알 수 있다. 막대그래프로 시각화해보겠다.
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.index,y=ftr_top20) plt.show()
Python
복사