안 쓰던 블로그
앙상블 개요, 보팅 본문
앙상블 학습
-여러 개의 분류기Classifier를 생성, 그 예측을 결합하므로써 보다 정확한 최종 예측을 도출하는 기법(집단지성처럼)
-넓은 의미로는 서로 다른 모델을 결합한 것을 지칭
-단일 모델의 약점을 다수의 모델들을 결합하여 보안하기 때문에, 성능이 떨어지더라도 서로 다른 유형의 모델을 섞는 것이 전체 성능에 도움될 수 있음
-보팅(Voting), 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking) 등의 기법이 있음
-대표적인 배깅-랜덤 포레스트
-대표적인 부스팅-에이다 부스팅, 그래디언트 부스팅, XGBoost, LightGBM 등
-보팅, 배깅: 아래에 자세한 설명
-부스팅: 여러 개의 알고리즘이 순차적으로 학습을 하되, 앞에 학습한 알고리즘 예측이 틀린 데이터에 대해 그 다음번에는 올바르게 예측할 수 있도록 알고리즘에 가중치를 부여하여 학습과 예측을 진행하는 방식
-스태킹: 여러 가지 다른 모델의 예측 결과값을 다시 학습 데이터로 만들어 다른 모델(메타 모델)로 재학습시켜 결과를 예측하는 방식
보팅과 배깅
여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정하는 방식
보팅: 서로 다른 알고리즘을 가진 분류기를 결합, 각각의 결과에 대해 투표로 최종 결과 예측
배깅: 분류기의 알고리즘이 모두 같은 유형이지만 데이터 샘플링을 서로 다르게 학습하고 보팅을 수행
-보팅에는 하드 보팅과 소프트 보팅이 있으며, 일반적으로 소프트 보팅을 주로 사용한다. 사이킷런에서 VotingClassifier 클래스를 통해 보팅을 지원한다
하드 보팅: 다수결의 원칙
소프트 보팅: 각 알고리즘이 레이블값 결정 확률을 예측한 결과를 평균내어 확률이 가장 높은 레이블값을 최종 값으로 예측
-데이터 샘플은 중첩이 허용되므로 중복된 데이터가 있을 수 있다
보팅 분류기 Voting Classifier
사이킷런에서 제공하는 위스콘신 유방암 데이터 세트를 이용하여 보팅 방식의 앙상블을 적용한다
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)
# 개별 모델은 로지스틱 회귀와 KNN 임.
lr_clf = LogisticRegression()
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)))
# 개별 모델의 학습/예측/평가.
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)))
로지스틱 회귀와 KNN을 먼저 하는데, 아직 이 개념에 대해 다룬 적 없으므로 이렇게 한다고만 알고 넘어간다
estimators에 리스트로 값을 넣는데 lr_clf는 LR이라는 이름으로, knn_clf는 KNN라는 이름으로 하고, 보팅 방식은 soft로 지정한다
fit으로 학습을 하면 개별 모델을 학습한다
predict로 예측하고 값을 출력한다
보팅 모델 말고도 개별 모델을 학습/예측/평가한 값을 출력해 본다
여기서는 보팅 분류기의 정확도가 각 개별 모델의 정확도보다 좀 더 높게 나왔지만, 여러 알고리즘을 결합한다고 항상 성능이 향상되지는 않는다
'머신러닝 > 머신러닝' 카테고리의 다른 글
부스팅 알고리즘 (0) | 2021.02.07 |
---|---|
배깅, 랜덤 포레스트 (0) | 2021.02.07 |
결정 트리 과적합, 결정 트리 실습 (0) | 2021.01.31 |
분류와 결정트리, 결정트리 시각화 (0) | 2021.01.31 |
[평가] kaggle - Pima 인디언 당뇨병 예측 (0) | 2021.01.25 |