본문 바로가기
Learning-driven Methodology/ML (Machine Learning)

[Machine Learning] 앙상블 (Ensemble)

by goatlab 2022. 10. 4.
728x90
반응형
SMALL

앙상블 (Ensemble)

 

여러 개의 알고리즘들이 이용하여 하나의 값을 예측하는 기법을 통칭하며, 대중적인 데이터 분석 알고리즘이다. 선형 회귀나 로지스틱 회귀는 가장 대중적인 알고리즘이고, 그 다음이 의사결정 트리와 앙상블 계열 알고리즘이다. 최근 머신/딥러닝 분야에서 딥러닝 다음으로 부스팅 (boosting) 알고리즘이 핵심적으로 사용된다. 

 

메타 분류기 (meta-classifier)라고도 부른다. 메타 (meta)는 일종의 상위 또는 추상화라는 개념이다. 여러 분류기들을 모아 하나의 분류기를 만들어 이를 메타 분류기라고 부른다. 시간이 많이 소요되지만 비교적 좋은 성능을 낸다.

 

https://towardsdatascience.com/stacking-classifiers-for-higher-predictive-performance-566f963e4840

 

하나의 데이터를 넣고 이를 여러 모델에 학습시킨다. 테스트 데이터를 각 모델에 입력하고 투표 또는 여러 가중치 기법을 적용하여 최종 선택한다.

 

앙상블 학습 유형의 주요 특징

 

• 보팅 (Voting) : “다른 알고리즘”
• 배깅 (Bagging) : “데이터 샘플링”
• 부스팅 (Boosting) : “가중치 부여”
• 스태킹 (Stacking) : “여러 가지 모델의 예측 결과값을 다른 모델로 재학습”

 

바닐라 앙상블

 

가장 기본적인 앙상블 기법이다. 바닐라라고 하면 아이스크림에서 아무것도 첨가되지 않은 맛인데, 바닐라 앙상블도 아무것도 처리하지 않은 앙상블 모델을 의미한다. 일반적으로 가중치 평균이나 투표 방식 (Voting)으로 만들어지는 앙상블 모델이다. 보팅 (Voting)은 일반적으로 서로 다른 알고리즘을 가진 여러 개의 분류기를 결합한다.

 

부스팅 (Boosting)

 

하나의 모델에서 여러 데이터를 샘플링한 다음 그 샘플링된 데이터로 각각의 모델을 만드는 기법이다.

 

배깅 (Bagging)

 

부트스 트래핑 분할 방식으로, 개별 Classifier에서 데이터를 샘플링해서 추출한다.

 

스태킹 (Stacking)

 

여러 모델의 예측 결과값을 학습 데이터로 만든 후, 다른 모델 (메타 모델)로 재학습, 결과를 예측한다.

 

보팅 (Voting)

 

http://rasbt.github.io/mlxtend/user_guide/classifier/EnsembleVoteClassifier/

 

앙상블 모델의 가장 기본이며, 다수결 분류기 (majority voting classifier)이다. Voting classifier은 여러 개의 모델을 만들어 모두 같은 데이터를 넣고 결과를 취합하여 가장 많이 선택된 결과를 취한다.

 

투표 분류기 (Voting classifier)

 

하드 보팅 (Hard Voting) 소프트 보팅 (Soft Voting)
  • 다수결
  • 다수의 분류기가 선택한 레이블 선정
  • 높은 확률
  • 각각의 분류기들의 레이블 값 결정 확률을 평균냄
  • 평균이 가장 높은 레이블 선정
  • 일반적으로 소프트 방법이 보팅 방법으로 적용됨

 

보편적으로 소프트 보팅 방법을 많이 사용한다.

 

example

 

titanic_x_train.npy
0.18MB
titanic_y_train.npy
0.01MB

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import VotingClassifier

x = np.load("./titanic_x_train.npy")
y = np.load("./titanic_y_train.npy")

x[0]
array([0.27345609, 0.01415106, 0.        , 1.        , 0.        ,
       0.125     , 0.        , 0.        , 0.        , 1.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       1.        , 0.        , 0.        , 1.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        ])
# 기초 모델 생성
clf1 = LogisticRegression(random_state = 1)
clf2 = DecisionTreeClassifier(random_state = 1, max_depth = 4)
clf3 = GaussianNB()
eclf = VotingClassifier(
    estimators = [('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting = 'hard')
# 투표 분류기의 성능과 모델별 성능 측정
from sklearn.model_selection import cross_val_score

cross_val_score(eclf, x, y, cv = 5).mean()
0.8222941661905668
cross_val_score(clf1, x, y, cv = 5).mean()
0.8290420872214816
cross_val_score(clf2, x, y, cv = 5).mean()
0.8223068621849807
# clf3 제외하면 전체 모델 성능보다 개별 모델 성능 좋음
cross_val_score(clf3, x, y, cv = 5).mean()
0.4600139655938551
# GaussianNB은 연속적인 데이터를 다루기 위한 모델로 데이터셋과 맞지 않아 해당 모델을 빼고 성능 측정
eclf = VotingClassifier(
    estimators = [('lr', clf1), ('rf', clf2)], voting = 'hard')

cross_val_score(eclf, x, y, cv = 5).mean()
# 앙상블 모델에서 반드시 많은 수의 모델 조합이 가장 최선의 결과를 내는 것은 아님
0.8301783787215135
clf1 = LogisticRegression(random_state = 1)
clf2 = DecisionTreeClassifier(random_state = 1)
eclf = VotingClassifier(estimators = [('lr', clf1), ('dt', clf2)], voting = 'hard')
# 성능이 좋았던 모델 두 개를 각각 VotingClassifer에 할당
c_params = [0.1, 5.0, 7.0, 10.0, 15.0, 20.0, 100.0]

params = {
    "lr__solver" : ['liblinear'],
    "lr__penalty" : ["l2"],
    "lr__C" : c_params,
    "dt__criterion" : ["gini", "entropy"],
    "dt__max_depth" : [10, 8, 7, 6, 5, 4, 3, 2],
    "dt__min_samples_leaf": [1, 2, 3, 4, 5, 6, 7, 8, 9]
}
# 가장 좋은 모델의 성능 확인
from sklearn.model_selection import GridSearchCV

grid = GridSearchCV(estimator = eclf, param_grid = params, cv = 5)
grid = grid.fit(x, y)
grid.best_score_
0.8425569732749316
# 가장 좋은 성능을 내는 매개변수 확인
grid.best_params_
{'dt__criterion': 'gini',
 'dt__max_depth': 10,
 'dt__min_samples_leaf': 5,
 'lr__C': 5.0,
 'lr__penalty': 'l2',
 'lr__solver': 'liblinear'}
728x90
반응형
LIST