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보다 작은 값으로 설정
'머신러닝' 카테고리의 다른 글
ML_Overview (0) | 2024.04.14 |
---|---|
[4장] 파이썬 머신러닝 완벽 가이드_분류_3 (0) | 2023.06.02 |
[4장] 파이썬 머신러닝 완벽 가이드_분류_1 (0) | 2023.05.20 |
[3장] 파이썬 머신러닝 완벽 가이드_평가_2 (0) | 2023.05.13 |
[3장] 파이썬 머신러닝 완벽가이드_평가_1 (1) | 2023.05.05 |