ML_guide/Ensemble
Ensemble
Ensemble
Votting
- 보팅은 공통된 데이터 세트에 여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식이다.
- 한 데이터 세트에 여러 알고리즘을 가진 분류기를 결합한다.
-
보팅은 하드 보팅과 소프트 보팅이 있는데, 주로 소프트 보팅을 이용한다.
(하드 보팅은 각각의 분류간의 다수결로 결정. 소프트 보팅은 확률의 평균값으로 결정) -
VotingClassifier 클래스를 이용하여 보팅 분류기 실행
[코드]
lr_clf = LogisticRegression()
knn_clf = KNeighborsClassifier(n_neighbors = 8)
vo_clf = VotingClassifier(estimators = [('LR',lr_clf),('KNN',knn_clf)], voting = 'soft')
- 보팅후의 정확도와 각각 개별 모델의 정확도 비교
[코드]
vo_clf.fit(X_train, y_train)
pred = vo_clf.predict(X_test)
print('Voting 분류기 정확도 : {:.4f}'.format(accuracy_score(y_test,pred)))
classifiers = [lr_clf,knn_clf]
for classifier in classifiers:
classifier.fit(X_train, y_train)
pred = classifier.predict(X_test)
print("{0} 분류기 정확도 : {1:.4f}".format(classifier.__class__.__name__,accuracy_score(y_test,pred)))
[결과]
Voting 분류기 정확도 : 0.9474
LogisticRegression 분류기 정확도 : 0.9386
KNeighborsClassifier 분류기 정확도 : 0.9386
- 보팅 분류기의 정확도가 높게 나왔다.
- 무조건적으로 보팅 분류기가 높지는 않다.
- 하지만 편향-분산 트레이드오프의 문제로 인하여 다양한 분류기로 극복하기 위해 앙상블 학습을 한다.
bagging(random forest)
- 배깅은 나눠진 데이터 세트를 하나의 알고리즘으로 여러 분류기를 만들어 보팅으로 최종 결정하는 방식이다.
- 그 중 배깅의 가장 대표적인 알고리즘이 random forest이다.
- 하나의 데이터 세트를 일부가 중첩되게끔 부트스트래핑(bootstrapping) 분할 방식으로 분리한다.
- 나눠진 데이터 세트에 결정 트리 분류기를 각각 적용하는 것을 랜덤 포레스트라고 한다.
- 사용자 행동 인식 데이터 세트에 랜덤 포레스트를 적용해본다.(uci데이터)
[코드]
rt_clf = RandomForestClassifier(random_state = 0)
rt_clf.fit(X_train, y_train)
pred = rt_clf.predict(X_test)
print('랜덤 포레스트 정확도 : {:.4f}'.format(accuracy_score(y_test, pred)))
[결과]
랜덤 포레스트 정확도 : 0.9053
- 최적의 정확도를 찾기 위해 하이퍼 파라미터를 튜닝한다.
- 그 다음 서브세트의 개수를 늘려서 다시 정확도를 구한다.
[코드]
rt_clf = RandomForestClassifier(random_state=0, n_jobs=-1)
grid_cv = GridSearchCV(rt_clf, param_grid=params, cv=2, n_jobs=-1)
grid_cv.fit(X_train, y_train)
print('최적 하이퍼 파라미터 : \n', grid_cv.best_params_)
print('최고 예측 정확도 : {:.4f}'.format(grid_cv.best_score_))
rt_clf = RandomForestClassifier(n_estimators= 300, max_depth = 10, min_samples_leaf=8, min_samples_split=8, random_state=0)
rt_clf.fit(X_train,y_train)
pred= rt_clf.predict(X_test)
print('예측정확도 : {:.4f}'.format(accuracy_score(y_test,pred)))
[결과]
최적 하이퍼 파라미터 :
{'max_depth': 10, 'min_samples_leaf': 8, 'min_samples_split': 8, 'n_estimators': 100}
최고 예측 정확도 : 0.9180
예측정확도 : 0.9165
- 최적 하이퍼 파라미터로 인해 정확도가 올라간 것을 확인할 수 있다.
GBM(Gradient Boosting Machine)
- 부스팅 알고리즘은 여러 개의 약한 학습기를 순차적으로 학습시키며 잘못 예측한 데이터에 가중치를 부여해서 오류를 개선해 나가는 방법이다.
- random forest로 학습한 사용자 행동 데이터세트를 GBM으로 학습한 후, 비교해 본다.
[코드]
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 정확도 : {:.4f}'.format(gb_accuracy))
print("GBM 수행 시간 : {:.1f}".format(time.time() - start_time))
[결과]
GBM 정확도 : 0.9382
GBM 수행 시간 : 562.4
- 앞선 random forest의 예측 정확도보다 높은 것을 확인할 수 있다.
- 하지만 수행시간이 오래 걸리고, 하이퍼 파라미터 튜닝까지 한다면, 더 오랜 시간이 걸린다.
GBM-XGBoost
- GBM의 느린 수행 시간 및 과적합 규제 부재등의 문제를 해결한 알고리즘이다.
주요 하이퍼 파라미터
learning_rate : 부스팅 스텝을 반복적으로 수행할 때 업데이트 되는 학습률 값.
n_estimators : weak learner의 개수.
subsample : weak learner가 학습에 사용하는 데이터의 샘플링 비율. 과적합이 염려되면 1보다 작은 값으로 설정.
과적합 문제가 심할떄의 파라미터 조정
learning_rate의 값을 낮춘다.(n_estimators는 높여줘야 한다.)
max_depth의 값을 낮춘다.(트리 전체 깊이 조정)
- xgboost는 조기중단 기능으로 수행 속도를 더욱 높일 수 있다.
- 조기 중단 파라미터를 설정하고 그 횟수안에 예측 오류가 줄어들지 않으면 부스팅을 종료한다.
조기 중단 유무에 따른 xgboost의 정확도 차이
[코드]
xgb_wrapper = XGBClassifier(n_estimators = 400, learning_rate = 0.1, max_depth=3)
xgb_wrapper.fit(X_train, y_train)
w_preds = xgb_wrapper.predict(X_test)
w_pred_proba = xgb_wrapper.predict_proba(X_test)[:,1]
get_clf_eval(y_test, w_preds, w_pred_proba)
#조기 중단 파라미터 100으로 설정
xgb_wrapper = XGBClassifier(n_estimators=400, learning_rate=0.1, max_depth=3)
evals = [(X_test, y_test)]
xgb_wrapper.fit(X_train, y_train, early_stopping_rounds=100, eval_metric="logloss", eval_set=evals, verbose=True)
ws100_preds = xgb_wrapper.predict(X_test)
ws100_pred_proba = xgb_wrapper.predict_proba(X_test)[:,1]
get_clf_eval(y_test, ws100_preds, ws100_pred_proba)
[결과]
#조기중단 x xgboost
오차 행렬
[[35 2]
[ 1 76]]
정확도 0.9737, 정밀도 0.9744, 재현율 : 0.9870, F1 : 0.9806, AUC : 0.9951
# 조기중단 o xgboost 학습
[0] validation_0-logloss:0.61352
Will train until validation_0-logloss hasn't improved in 100 rounds.
[1] validation_0-logloss:0.547842
[2] validation_0-logloss:0.494247
[3] validation_0-logloss:0.447986
[4] validation_0-logloss:0.409109
[5] validation_0-logloss:0.374977
[6] validation_0-logloss:0.345714
[7] validation_0-logloss:0.320529
[8] validation_0-logloss:0.29721
[9] validation_0-logloss:0.277991
[10] validation_0-logloss:0.260302
[11] validation_0-logloss:0.246037
[12] validation_0-logloss:0.231556
[13] validation_0-logloss:0.22005
[14] validation_0-logloss:0.208572
[15] validation_0-logloss:0.199993
[16] validation_0-logloss:0.190118
[17] validation_0-logloss:0.181818
[18] validation_0-logloss:0.174729
[19] validation_0-logloss:0.167657
[20] validation_0-logloss:0.158202
.
.
.
.
[299] validation_0-logloss:0.086131
[300] validation_0-logloss:0.086179
[301] validation_0-logloss:0.086052
[302] validation_0-logloss:0.086016
[303] validation_0-logloss:0.086101
[304] validation_0-logloss:0.085977
[305] validation_0-logloss:0.086059
[306] validation_0-logloss:0.085971
[307] validation_0-logloss:0.085998
[308] validation_0-logloss:0.085999
[309] validation_0-logloss:0.085877
[310] validation_0-logloss:0.085923
[311] validation_0-logloss:0.085948
Stopping. Best iteration:
[211] validation_0-logloss:0.085593
#조기중단 o xgboost
오차 행렬
[[34 3]
[ 1 76]]
정확도 0.9649, 정밀도 0.9620, 재현율 : 0.9870, F1 : 0.9744, AUC : 0.9954
- 조기중단 x 정확도 : 0.9737
- 조기중단 o 정확도 : 0.9649
- 정확도가 떨어졌지만, 처리속도를 위해서 감수할 만큼의 크기라고 생각한다.
- 단, 조기 중단 파라미터를 너무 적게 설정하면 예측 오류의 개선 여지가 있음에도 종료할 수 있으므로 주의한다.
lightGBM
- XGBoost보다 학습에 걸리는 시간이 적은 알고리즘(메모리 사용량도 적다.)
- 일반 GBM의 트리 분할 방법과 다른 리프 중심 트리 분할 방식을 사용한다.
주요 하이퍼 파라미터
num_iterations : 반복 수행하려는 트리의 개수
learning_rate : 부스팅 스텝을 반복적으로 수행할 때 업데이트되는 학습률 값
min_data_in_leaf(min_child_samples) : 결정 트리의 min_samples_leaf와 같은 파라미터.