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와 같은 파라미터.