앙상블 학습
비정형 데이터의 분류는 딥러닝이 뛰어난 성능을 보이지만, 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 보임
앙상블 학습의 전통적 유형 : 보팅, 배깅, 부스팅
보팅, 배깅 : 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식
보팅 : 일반적으로 서로 다른 알고리즘을 가진 분류기를 결합
배깅 : 각각의 분류기가 모두 같은 유형의 알고리즘 기반이지만, 데이터 샘플링은 서로 다르게 가져가면서 학습을 수행하며 보팅을 수행하는 것
부스팅 : 여러개의 분류기가 순차적으로 학습을 수행하되, 앞에서 핛브한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에 가중치를 부여하면서 학습과 예측을 진행
+스태킹 : 여러가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방법
보팅 유형 - 하드보팅과 소프트 보팅
하드보팅 : 다수결 원칙과 비슷
소프트보팅 : 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정, 일반적으로 많이 사용됨
#보팅 방식의 앙상블을 이용해 위스콘신 유방암 데이터 세트 예측 분석
사이킷런은 보팅 방식의 앙상블을 구현한 VotingClassifier 클래스를 제공
import pandas as pd
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
cancer = load_breast_cancer()
data_df = pd.DataFrame(cancer.data, columns=cancer.feature_nanmes)
data_df.head(3)
#개별 모델은 로지스틱 회귀와 KNN
lr_clf = LogisticRegression(solver='liblinear')
knn_clf = KNeighborsClassifier(n_neighbors=8)
#개별 모델을 소프트 보팅 기반의 앙상블 모델로 구현한 분류기
vo_clf = VotingClassifier(estimators=[('LR', lr_clf), ('KNN', knn_clf)], voting='soft')
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.2, random_state=156)
#VotingClassifier 학습/예측/평가
vo_clf.fit(X_train, y_train)
pred = vo_clf.predict(X_test)
print('Voting 분류기 정확도: {0:.4f}'.format(accuracy_score(y_test, pred)))
보팅으로 여러 개의 기반 분류기를 결합한다고 해서 무조건 기반 분류기보다 예측 성능이 향상되지는 않는다
랜덤 포레스트
같은 알고리즘으로 여러 개의 분류기를 만들어서 보팅으로 최종 결정하는 알고리즘, 대표적인 알고리즘 : 랜덤 포레스트
랜덤포레스트는 여러 개의 결정 트리 분류기가 전체 데이터에서 배깅 방식으로 각자의 데이터를 샘플링해 개별적으로 학습을 수행한 뒤 최종적으로 모든 분류기가 보팅을 통해 예측 결정을 하게 됨
부트스트래핑 : 여러 개의 데이터 세트를 중첩되게 분리하는 것
# 사용자 행동 인섹 데이터 세트를 RandomForestClassifier를 이용해 예측
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
X_train, X_test, y_train, y_test = get_human_dataset()
#랜덤 포레스트 학습 및 별도의 테스트 세트로 예측 성능 평가
rf_clf = RandomForestClassifier(random_state=0, max_depth=8)
rf_clf.fit(X_train, y_train)
pred = rf_clf.predict(X_test)
accuracy = accuracy_scre(y_test, pred)
print('랜덤 포레스트 정확도: {0:.4f}'.format(accuracy))
- n_estimators : 랜덤 포레스트에서 결정 트리의 개수를 지정, 디폴트는 10개/ 많이 설정할수록 좋은 성능을 기대할 수 있지만 계속 증가시킨다고 성능이 무조건 향상되는 것은 아니며 학습 수행 시간이 오래 걸리는 것을 감안해야함
from sklearn.model_selection import GridSearchCV
params = {
'max_depth' : [8,16,24],
'min_samples_leaf' : [1,6,12],
'min_samples_split' : [2,8,16]
}
#RandomForestClassifier 객체 생성 후 GridSearchCV 수행
rf_clf = RandomForestClassifier(n_estimators=100, 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, min_samples_leaf=6, max_depth=16, min_samples_split=2, 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)))
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 Top20')
sns.barplot(x=ftr_top20, y=ftr_top20.index)
plt.show()
GBM(Gradient Boosting Machine)
부스팅 알고리즘 : 여러 개의 약한 학습기를 순차적으로 학습-예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식
과적합에도 강한 뛰어난 예측 성능을 가진 알고리즘이지만 수행 시간이 오래 걸린다는 단점
XGBoost(eXtra Gradient Boost)
트리 기반의 앙상블 학습에서 가장 각광받고 있는 알고리즘
GBM에 기반하고 있지만, GBM의 단점인 느린 수행 시간 및 과적합 규제 부재 등의 문제를 해결하여 매우 각광받음
병렬 CPU 환경에서 병렬 학습이 가능해 기존 GBM보다 빠르게 학습 완료
- 파이썬 래퍼 XGBoost 적용
- 사이킷런 래퍼 XGBoost 적용
XGBoost는 XGBoost만의 전용 데이터 객체인 DMatrix를 사용
LightGBM
XGBoost보다 학습에 걸리는 시간이 훨씬 적고 메모리 사용량도 상대적으로 적다, 기능의 다양성도 약간 더 많음
단점으로는 과적합이 발생하기 쉽다
일반 GBM 계열의 트리 분할 방법과 다르게 리프 중심 트리 분할(Leaf Wise)방식을 사용
트리의 균형을 맞추지 않고, 최대 손실 값을 가지는 리프 노드를 지속적으로 분할하면서 트리의 깊이가 깊어지고 비대칭적인 규칙 트리가 생성됨
카테고리형 피처의 자동 변환과 최적 분할
베이지안 최적화 기반의 HyperOpt를 이용한 하이퍼 파라미터 튜닝
GridSearch 방식은 튜닝해야 할 하이퍼 파라미터 개수가 많을 경우 최적화 수행 시간이 오래 걸린다는 단점 존재
베이지안 최적화는 목적 함수 식을 제대로 알 수 없는 블랙 박스 형태의 함수에서 최대 또는 최소 함수 반환 값을 만드는 최적 입력값을 가능한 적은 시도를 통해 빠르고 효과적으로 찾아주는 방식
두 가지 중요 요소
- 대체 모델(Surrogate Model) : 획득 함수로부터 최적 함수를 예측할 수 있는 입력값을 추천 받은 뒤 이를 기반으로 최적 함수 모델을 개선
- 획득 함수(Acquisition Function) : 개선된 대체 모델을 기반으로 최적 입력값을 계산
종류 : HyperOpt, Bayesian Optimization, Optuna