본문 바로가기

파이썬 머신러닝 완벽가이드

4.4 앙상블 학습(배깅)

728x90

이번 시간에는 앙상블 기법 중 배깅에 대하여 다뤄보도록 하겠습니다.

해당 내용은 '파이썬 머신러닝 완벽 가이드'를 정리한 내용입니다.


1. 배깅(Bagging)

 

배깅 : 같은 알고리즘으로 여러 개의 분류기를 만들어서 보팅으로 최종 결정하는 알고리즘

           가장 대표적인 알고리즘으로 랜덤 포레스트가 있음

2. 랜덤 포레스트

랜덤포레스트는 결정 트리 기반의 알고리즘으로 결정 트리의 쉽고 직관적인 장점을 그대로 갖고 있으며, 수행 속도가 비교적 빠릅니다.  하지만 트리 기반의 앙상블 기법으로 하이퍼 파라미터를 튜닝 하더라도 예측성능이 크게 향상 되지 않는다는 단점이 있습니다.

랜덤 포레스트의 개별 분류기는 학습 데이터의 샘플 데이터를 학습합니다. 이때 샘플 데이터를 부트스트래핑(bootstrapping)방식으로 분할합니다.

 

부트스트래핑 : 여러 개의 데이터 세트를 중첩되게 분리하는 것

부트스트래핑이란, 결국 위의 사진과 같이 원래 학습 데이터가 10개라면 중복을 허용하여 10개의 데이터를 뽑아 하나의 샘플 데이터를 구성하는 방식입니다. 왜 이런 방식을 사용하는걸까요? 

부트스트랩은 통계학적 지식에서 가져온 기술입니다. 예를 들어 10만개, 20만개 그 이상의 무수히 많은 데이터(모집단)가 존재한다고 가정할 때 모집단의 평균, 표준편차와 같은 매개변수를 알아내기란 쉽지 않을 것입니다. 따라서 무작위로 데이터를 추출하고 추출한 표본집단의 분포를 통해 모집단의 매개변수를 오차범위 내에서 추정하는 것입니다. 어떻게 무작위로 추출한 데이터로 원래 데이터를 추정하지 하고 의문이 들 수 있지만 이를 증명하는 수학적 모델이 아주 많이 있고 실제 많이 사용되고 있습니다.

 

자세한 내용은 아래 포스팅을 확인해주세요!

참고 : https://www.greelane.com/ko/과학-기술-수학/수학/what-is-bootstrapping-in-statistics-3126172/

 

통계에서 부트 스트래핑 기법이란 무엇입니까?

부트 스트랩 핑은 마치 마술처럼 작동하는 것처럼 보이는 통계의 리샘플링 기법입니다. 이 흥미로운 컴퓨터 과학 주제에 대해 자세히 알아보십시오.

www.greelane.com

3. 랜덤 포레스트 구현 

랜덤 포레스트는 RandomForestClassifier API를 통해 구현이 가능합니다.

 

n_estimators : 랜덤 포레스트에서 결정 트리의 개수를 지정

max_features : 참조할 최대 피처의 수(기본은  sqrt)

max_depth, min_samples_leaf 등 : 결정 트리와 동일

 

이제 앞서 다뤘던 사용자 행동 인식 데이터를 랜덤 포레스트를 사용하여 예측해보겠습니다.

 

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

# 결정 트리에서 사용한 get_human_dataset( )을 이용해 학습/테스트용 DataFrame 반환
# get_human_dataset( )에 대한 코드는 생략하도록 하겠습니다.
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

 

기본적인 세팅으로 랜덤 포레스트를 수행하였을 때 92%의 성능이 나왔습니다. 이제 하이퍼 파라미터를 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 )
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 = grid_cv.best_estimator_
pred = rf_clf1.predict(X_test)
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test , pred)))

 

예측 정확도: 0.9196

 

흠...오히려 기본 설정값이  성능이 더 좋네요...(머쓱...)이처럼 결정트리의 개수를 늘린다고 성능이 무조건 좋아지는 것은 아니랍니다~

결정 트리의 성능을 결정하는 주요 피처들은 아래와 같습니다!

 

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)
plt.show()


이상으로 배깅에 대한 정리를 마무리하도록 하겠습니다.

다음시간부터 부스팅 알고리즘에 대하여 다뤄보겠습니다.

다음 시간에 만나요!!

반응형