[머신러닝] 분류: 앙상블 학습(보팅중점)
앙상블 학습이란
앙상블 학습? 여러개의 분류기를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법
유형
여러개의 분류기를 통해 최종 예측 결과를 결정 : 보팅, 배깅
1) 보팅(Voting)
- 서로 다른 알고리즘을 가진 분류기를 결합
2) 배깅(Bagging)
- 각각 분류기가 모두 같은 유형의 알고리즘 기반이지만 데이터 샘플링[부트스트래핑(Bootstrapping): 개별 분류기에게 데이터를 샘플링해서 추출하는 방식]을 서로 다르게 가져가서 학습 수행
- 교차검증 시, 데이터 세트간 중첩 허용 (중복된 데이터 있음)
- 예시: 랜덤포레스트알고리즘
3) 부스팅(Boosting)
- 여러개의 분류기가 순차적으로 학습 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 가중치 부여하면서 학습과 예측을 진행
- 예시: 그래디언트 부스트, XGBoost, LightGBM
4) 스태킹
- 여러가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방식
보팅
1. 하드 보팅
- 다수결 원칙과 비슷
- 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결과값으로 선정하는 것
2. 소프트 보팅
- 분류기들 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정
일반적으로 소프트 보팅으로 적용
코드 구현
사이키런 : VotingClassifier
데이터: 위스콘신 유방암 (유방암의 악성종양, 양성종양 여부를 결정하는 이진 분류 데이터 세트)
모델: 로지스틱 회귀와 KNN 기반 보팅 분류기
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_names)
data_df.head(3)
[결과]
mean radius mean texture mean perimeter mean area mean smoothness mean compactness mean concavity mean concave points mean symmetry mean fractal dimension ... worst radius worst texture worst perimeter worst area worst smoothness worst compactness worst concavity worst concave points worst symmetry worst fractal dimension
0 17.99 10.38 122.8 1001.0 0.11840 0.27760 0.3001 0.14710 0.2419 0.07871 ... 25.38 17.33 184.6 2019.0 0.1622 0.6656 0.7119 0.2654 0.4601 0.11890
1 20.57 17.77 132.9 1326.0 0.08474 0.07864 0.0869 0.07017 0.1812 0.05667 ... 24.99 23.41 158.8 1956.0 0.1238 0.1866 0.2416 0.1860 0.2750 0.08902
2 19.69 21.25 130.0 1203.0 0.10960 0.15990 0.1974 0.12790 0.2069 0.05999 ... 23.57 25.53 152.5 1709.0 0.1444 0.4245 0.4504 0.2430 0.3613 0.08758
3 rows × 30 columns
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)
vo_clf.fit(X_train,y_train)
pred=vo_clf.predict(X_test)
print('Voting 분류기 정확도: {0:.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)
class_name=classifier.__class__.__name__
print('{0} 정확도: {1:.4f}'.format(class_name,accuracy_score(y_test,pred)))
[결과]
Voting 분류기 정확도: 0.9561
LogisticRegression 정확도: 0.9474
KNeighborsClassifier 정확도: 0.9386
보팅을 이용하니 정확도가 높아졌지만, 모든 경우가 그런 것은 아니다.
결정트리를 이용해서 배깅과 부스팅을 사용하는데 결정트리의 단점인 과적합을 많은 분류기를 결합하여 극복 가능 (편향-분산 트레이드오프의 효과)