[머신러닝 완벽 가이드] 4장_분류 - 앙상블

이경민·2023년 1월 7일
0

📌 앙상블 학습 (Ensemble Learning)

  • 여러 개의 분류기(Classifier)를 생성하고 그 예측을 결합함으로써 보다 정확한 최종 예측을 도출하는 기법

  • 다양한 분류기의 예측 결과를 결합함으로써 단일 분류기보다 신뢰성이 높은 예측값을 얻는 것이 목표

  • 대부분의 정형 데이터 분류 시에는 앙상블이 뛰어난 성능을 나타내고 있음

  • 앙상블 학습의 유형

    • 보팅(Voting)
      여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정
      (서로 다른 알고리즘을 가진 분류기 결합)

    • 배깅(Bagging)
      여러 개의 분류기가 투표를 통해 최종 예측 결과를 결정
      (각각의 분류기가 모두 같은 유형의 알고리즘 기반,
      데이터 샘플링을 서로 다르게 가져가면서 학습을 수행)
      ex) 랜덤 포레스트

      📝 부트스트래핑(Bootstrapping)
      개별 분류기에 할당된 학습 데이터는 원본 학습 데이터를 샘플링해 추출하는데, 이렇게 개별 Classifier에게 데이터를 샘플링해서 추출하는 방식을 의미한다.
      이때, 교차 검증은 데이터 세트 간에 중첩을 허용하지 않는 것과 다르게 배깅 방식은 중첩을 허용한다.

    • 부스팅(Boosting)
      여러 개의 분류기가 순차적으로 학습을 수행하되, 앞에서 학습한 분류기가 예측이 틀린 데이터에 대해서는 올바르게 예측할 수 있도록 다음 분류기에게는 가중치(weight)를 부여하면서 학습과 예측을 진행
      ex) 그래디언트 부스트, XGBoost, LightGBM

    • 스태킹(Stacking)
      여러 가지 다른 모델의 예측 결괏값을 다시 학습 데이터로 만들어서 다른 모델(메타 모델)로 재학습시켜 결과를 예측

✅ 보팅

(1) 하드 보팅(Hard Voting)

  • 예측한 결괏값들 중 다수의 분류기가 결정한 예측값을 최종 보팅 결괏값으로 선정 (다수결 원칙)

(2) 소프트 보팅(Soft Voting)

  • 분류기들의 레이블 값 결정 확률을 모두 더하고 이를 평균해서 이들 중 확률이 가장 높은 레이블 값을 최종 보팅 결괏값으로 선정
  • 일반적으로 하드 보팅보다는 소프트 보팅이 예측 성능이 좋아서 더 많이 사용된다.

✅ 보팅 분류기

  • VotingClassifier: 보팅 방식의 앙상블을 구현한 클래스

    • estimators: 리스트 값으로 보팅에 사용될 여러 개의 Classifier 객체들을 튜플 형식으로 입력 받음

    • voting: hard / soft

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)

# 개별 모델 - 로지스틱 회귀, KNN
lr_clf = LogisticRegression() # 오류: max_iter 값 높여주기
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)))
profile
열정 가득한 공간

0개의 댓글