머신러닝

[4장] 파이썬 머신러닝 완벽 가이드_분류_2

zsun 2023. 5. 24. 20:55

04. 랜덤 포레스트

 

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

  • 배깅의 대표적인 알고리즘
  • 랜덤 포레스트의 기반 알고리즘은 결정 트리로, 결정 트리의 쉽고 직관적인 장점 가짐 
  • 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행 후, 최종적으로 모든 분류기가 보팅을 통해 예측 결정

 

  • 개별 트리가 학습하는 데이터셋은 전체 데이터에서 일부가 중첩되게 샘플링된 데이터셋 
  • 여러개의 데이터셋을 중첩되게 분리하는 것을 부트스트래핑 (Bootstrapping) 이라고 함
  • Bagging = bootstrap aggregating
  • 서브셋의 데이터 건수는 전체 데이터 건수와 동일하지만, 개별 데이터가 중첩되어 만들어짐
  • 이처럼 데이터가 중첩된 개별 데이터셋에 결정 트리 분류기를 각각 사용하는 것이 랜덤 포레스트
  • 사이킷런은 RandomForestClassifier() 클래스 통해 지원

 

 

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

  • 트리 기반 앙상블 알고리즘의 단점 : 하이퍼 파라미터 너무 많아 튜닝을 위한 시간이 많이 소모됨
  • n_estimators : 랜덤 포레스트에서 결정 트리의 개수 지정, 디폴트는 100개, 무조건 많다고 성능 향상되는 것 아님
  • max_features : 결정 트리에 사용된 max_features 파라미터와 같음
  • 랜덤포레스트 max_features의 기본 max_feature는 'None'이 아니라 'auto'='sqrt'
  • 랜덤 포레스트의 트리를 분할하는 피처를 참조할때 전체 피처가 아닌 제곱근
  • max_depth나 min_samples_leaf, min_samples_split과 같이 결정 트리에서 과적합을 개선하기 위해
    사용되는 파라미터가 랜덤 포레스트에도 똑같이 적용될 수 있음

 

# GridSearchCV를 이용하여 랜덤 포레스트의 하이퍼 파라미터 튜닝

# n_estimator = 100, CV=2
# n_jobs=-1 를 이용해 모든 CPU 코어를 이용해 학습

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_))

 

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

rf_clf1 = RandomForestClassifier(n_estimators=100, 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.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)
fig1 = plt.gcf()
plt.show()
plt.draw()
fig1.savefig('rf_feature_importances_top20.tif', format='tif', dpi=300, bbox_inches='tight')

 

 

05. GBM(Gradient Boosting Machine)

 

GBM의 개요 및 실습

 

- 부스팅 알고리즘

: 여러개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류 개선해나가면서 학습
- 부스팅의 대표적인 구현은 AdaBoost(Adaptive Boosting)과 그래디언트 부스트가 있음
- 에이다 부스트 : 오류 데이터에 가중치를 부여하면서 부스팅을 수행

 


- GBM도 에이타부스트와 유사하지만, 가중치 업데이트를 *경사하강법을 사용하는 것이 큰 차이
  (*경사하강법 : 반복 수행을 통해 오류를 최소화할 수 있도록 가중치의 업데이트 값을 도출)
- GBM은 분류, 회귀 둘다 가능
- 사이킷런은 GBM 분류를 위해 GradientBoostingClassifier 제공

 

# GBM을 이용해 사용자 행동 데이터셋 예측

from sklearn.ensemble import GradientBoostingClassifier
import time
import warnings
warnings.filterwarnings('ignore')

X_train, X_test, y_train, y_test = get_human_dataset()

# GBM 수행 시간 측정을 위함. 시작 시간 설정.
start_time = time.time()

gb_clf = GradientBoostingClassifier(random_state=0)
gb_clf.fit(X_train , y_train)
gb_pred = gb_clf.predict(X_test)
gb_accuracy = accuracy_score(y_test, gb_pred)

print('GBM 정확도: {0:.4f}'.format(gb_accuracy))
print("GBM 수행 시간: {0:.1f} 초 ".format(time.time() - start_time))
GBM 정확도: 0.9393
GBM 수행 시간: 541.9 초 

 

GBM 하이퍼 파라미터 소개

 

- n_estimator, max_depth, max_feature : 설명 생략

 

- loss : 경사 하강법에서 사용할 비용 함수 지정, 특별한 경우가 아니면 기본값인'deviance' 그대로 적용

 

- learning_rate

: GBM이 학습을 진행할 때마다 적용하는 학습률

: weak learner가 순차적으로 오류 값을 보정해 나가는데 적용하는 계수
: 0-1 사이의 값을 지정할 수 있고, 기본값은 0.1
: 너무 작은 값을 적용하면 업데이트 되는 값이 작아져서 최소 오류 값을 찾아 예측 성능이 높아질 가능성이 높지만

: 많은 weak learner는 순차적인 반복이 필요해서 수행시간이 오래걸림

: 큰 값을 적용하면 최소 오류 값을 찾지 못하고 그냥 지나쳐버려서 예측 성능이 떨어질 가능성이 높지만 빠름

 

따라서,

learning_rate는 n_estimators와 상호 보완적으로 조합해 사용
learning_rate 는 작게, n_estimators 를 크게 하면 예측 성능이 어느정도 좋아질 수 있지만 오래걸림

- n_estimators : weak_learner 의 개수, 많을수록 어느 수준까지는 성능이 좋아질 수 있으나 오래 걸림, 기본값 : 100

 

- subsample : weak_learner가 학습에 사용하는 데이터의 샘플링 비율, 

                           기본값은 1 (= 전체 학습데이터를 기반으로 학습), 과적합이 걱정되면 1보다 작은 값으로 설정