인공지능&머신러닝

[머신러닝]앙상블(Ensemble) 원리 및 코드 예시

zzheng 2024. 6. 24. 23:51

앙상블(Ensemble)은 기계 학습에서 여러 개의 모델을 결합하여 하나의 강력한 모델을 구성하는 기법을 말합니다. 각 개별 모델의 예측을 종합함으로써 개별 모델보다 더 나은 예측 성능을 달성할 수 있습니다. 앙상블은 단일 모델보다 더욱 정확하고 안정적인 예측을 제공할 수 있습니다.

 

주요 개념

  1. 개별 모델의 다양성 확보: 앙상블은 다양한 방법을 사용하여 여러 개의 개별 모델을 생성합니다. 이들 모델은 독립적으로 학습하거나 서로 다른 학습 데이터를 사용하여 학습될 수 있습니다.
  2. 결합 방법: 개별 모델의 예측을 결합하는 방법에는 여러 가지가 있습니다. 주로 사용되는 방법으로는 평균화(Averaging), 가중 평균화(Weighted Averaging), 투표(Voting), 스태킹(Stacking) 등이 있습니다.
  3. 앙상블 종류:
    • 배깅(Bagging): 각 모델이 독립적으로 학습하도록 하기 위해 데이터를 랜덤하게 부트스트랩 샘플링하여 학습하는 방법입니다. 예시로는 Random Forest가 있습니다.
    • 부스팅(Boosting): 약한 학습기(weak learner)를 순차적으로 학습시켜 강한 학습기(strong learner)를 구성하는 방법입니다. 예시로는 AdaBoost, Gradient Boosting Machines(GBM), XGBoost가 있습니다.
    • 스태킹(Stacking): 여러 개의 다른 학습 모델의 예측 결과를 사용하여 새로운 메타 모델(meta model)을 학습시키는 방법입니다.

 

장점

  • 성능 향상: 다양한 모델의 다양성과 예측력을 결합하여 보다 정확한 예측을 제공할 수 있습니다.
  • 일반화 성능 향상: 과적합을 줄이고 일반화 성능을 개선할 수 있습니다.
  • 데이터의 다양한 특성을 잡아낼 수 있음: 다양한 방법을 사용하여 데이터의 다양한 측면을 고려할 수 있습니다.

단점

  • 계산 비용: 여러 모델을 학습하고 결합하는 과정에서 추가적인 계산 비용이 발생할 수 있습니다.
  • 해석의 어려움: 많은 모델이 결합되므로 각 모델의 기여를 해석하기 어려울 수 있습니다.

 

코드 예시

이 코드는 다양한 분류기를 사용하여 Voting Classifier를 구성하고, 각 분류기의 성능을 비교하는 예제입니다. 

from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 다양한 분류기 정의
knn_clf = KNeighborsClassifier(n_neighbors=11)
nb_clf = GaussianNB()
rndf_clf = RandomForestClassifier(n_estimators=2, random_state=0)
svm_clf = SVC(kernel='linear')
dt_clf = DecisionTreeClassifier(max_features=3, random_state=0)

# Voting Classifier 정의
voting_clf = VotingClassifier(
    estimators=[
        ('dt', dt_clf),    # Decision Tree Classifier
        ('nb', nb_clf),    # Gaussian Naive Bayes Classifier
        ('knn', knn_clf),  # K-Nearest Neighbors Classifier
        ('rndf', rndf_clf),  # Random Forest Classifier
        ('svm', svm_clf)   # Support Vector Machine Classifier
    ],
    voting='hard'  # Voting 방법: 'hard' (다수결)
)
# 분류기 리스트
clfList = [dt_clf, knn_clf, nb_clf, rndf_clf, svm_clf, voting_clf]

# 각 분류기에 대해 학습하고 성능 평가
for clf in clfList:
    clf.fit(x_train, y_train)  # 모델 학습
    pred = clf.predict(x_test)  # 예측
    print(f"{clf.__class__.__name__:23s}: {accuracy_score(y_test, pred):.3f}")  # 정확도 출력