다음 출력 결과에서 볼 수 있듯이 각 분류기의 예측 성능은 거의 비슷합니다.
10-겹 교차 검증:
ROC AUC: 0.92 (+/- 0.15) [Logistic regression]
ROC AUC: 0.87 (+/- 0.18) [Decision tree]
ROC AUC: 0.85 (+/- 0.13) [KNN]
로지스틱 회귀와 k-최근접 이웃 분류기는 왜 파이프라인으로 훈련시켰는지 궁금할 수 있습니다. 3장에서 이야기한 것처럼 로지스틱 회귀와 (유클리디안 거리를 사용하는) k-최근접 이웃 알고리즘은 결정 트리와는 달리 스케일에 민감합니다. 붓꽃 데이터셋의 특성이 모두 같은 스케일(cm)로 측정되었지만 특성을 표준화 전처리하는 것은 좋은 습관입니다.
이제 진짜 재미있는 부분으로 넘어가죠. 다수결 투표 앙상블을 위해 MajorityVoteClassifier 클래스로 각 분류기를 하나로 연결하겠습니다.
>>> mv_clf = MajorityVoteClassifier(
... classifiers=[pipe1, clf2, pipe3])
>>> clf_labels += ['Majority voting']
>>> all_clf = [pipe1, clf2, pipe3, mv_clf]
>>> for clf, label in zip(all_clf, clf_labels):
... scores = cross_val_score(estimator=clf,
... X=X_train,
... y=y_train,
... cv=10,
... scoring='roc_auc')
... print("ROC AUC: %0.2f (+/- %0.2f) [%s]"
... % (scores.mean(), scores.std(), label))
ROC AUC: 0.87 (+/- 0.15) [Logistic regression]
ROC AUC: 0.89 (+/- 0.18) [Decision tree]
ROC AUC: 0.88 (+/- 0.13) [KNN]
ROC AUC: 0.94 (+/- 0.05) [Majority voting]
결과에서 보듯이 10-겹 교차 검증으로 평가했을 때 MajorityVoteClassifier의 성능이 개별 분류기보다 뛰어납니다.