Python/Sklearn

[Sklearn] 파이썬 모델 앙상블 : 배깅 / 부스팅 / 보팅 함수 정리

jimmy_AI 2022. 9. 25. 15:02
반응형

Python Model Ensemble(Bagging, Boosting, Voting)

파이썬에서 여러 머신러닝 모델의 앙상블을 진행하는

배깅, 부스팅 그리고 보팅과 관련된 사이킷런의 함수들을 간단한 예제를 통하여

이해하기 쉽도록 비교 정리해보도록 하겠습니다.

 

 

데이터셋 로드 및 전처리

우선, 이번 글에서는 사이킷런에서 제공하는 iris 데이터셋을 활용하겠습니다.

데이터셋을 불러오고 train / test 셋으로 분리하는 간단한 전처리 코드는 다음과 같습니다.

from sklearn.datasets import load_iris
import pandas as pd
import numpy as np 
from sklearn.model_selection import train_test_split

# 데이터셋 로드
iris = load_iris()
df = pd.DataFrame(data= np.c_[iris.data, iris.target] , 
                  columns= ['sepal length', 'sepal width', 'petal length', 'petal width', 'target'])

# train, test 데이터셋 분리
X = df[df.columns[:-1]]
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 68)

이제 등장할 예제들에서는 위의 코드에서 전치리한 데이터를 활용한 것으로 봐주시면 됩니다.

 

 

파이썬 배깅 함수 : BaggingClassifier (또는 Regressor)

사이킷런의 BaggingClassifier 함수를 통하여 배깅을 진행할 수 있습니다.

 

아래는 SVM 분류 모델을 5번 앙상블하는 배깅 모델을 학습하는 예시입니다.

from sklearn.svm import SVC
from sklearn.ensemble import BaggingClassifier

estimator = SVC()
model = BaggingClassifier(base_estimator = estimator, n_estimators = 5, random_state = 45)
model.fit(X_train, y_train)

여러 종류의 인자를 제공하지만 대표적인 인자 몇 가지를 나열해보면 다음과 같습니다.

(자세한 내용은 sklearn 공식 문서를 참고해주세요.)

 

base_estimator : 앙상블할 모델, 지정 안할 경우 의사결정나무로 지정

n_estimators : 앙상블할 모델의 수, 기본 값은 10

max_samples : 앙상블된 각 모델에서 샘플링해 사용할 데이터의 비율, 기본 값은 1

max_features : 앙상블된 각 모델에서 샘플링해 사용할 feature의 비율, 기본 값은 1

random_state : 특정 정수로 지정 시 실행마다 결과 고정

 

분류가 아닌 회귀의 경우에는 BaggingRegressor 함수로 마찬가지 사용이 가능합니다.

 

 

파이썬 부스팅 함수 1 : AdaBoostClassifier (또는 Regressor)

부스팅 함수는 여러 종류가 있는데, 여기서는 대표적인 부스팅 함수인 AdaBoost와

GradientBoost 함수를 소개하도록 하겠습니다.

 

먼저, AdaBoost 분류 모델을 사용한 예시는 다음과 같습니다.

from sklearn.ensemble import AdaBoostClassifier

estimator = SVC()
model = AdaBoostClassifier(base_estimator = estimator, n_estimators = 5, learning_rate = 0.5, algorithm='SAMME')
model.fit(X_train, y_train)

base_estimator, n_estimators, random_state 등의 파라미터는 위의 배깅 모델과

거의 동일합니다.

 

다만, 학습률 learning_rate 및 'SAMME', 'SAMME.R' 중에서 알고리즘을 선택하는

algorithm 인자 등이 추가로 있는 것이 특징입니다.

마찬가지로, 회귀 모델에서 사용 가능한 AdaBoostRegressor 함수도 지원합니다.

 

반응형

 

파이썬 부스팅 함수 2 : GradientBoostingClassifier (또는 Regressor)

decision tree 분류 모델들을 gradient descent 알고리즘을 통하여

부스팅을 진행하는 GradientBoostingClassifier 함수도 사이킷런에서 제공하고 있습니다.

 

여기서는 의사결정나무로 모델이 고정되어 base_estimator의 종류를 지정할 수는 없지만,

의사결정나무에서 활용 가능한 매우 다양한 파라미터의 종류들을 설정하여 학습할 수 있습니다.

from sklearn.ensemble import GradientBoostingClassifier

model = GradientBoostingClassifier(n_estimators = 5, learning_rate = 0.5, max_depth = 3, min_samples_leaf = 1)
model.fit(X_train, y_train)

의사결정나무 관련 인자 이외에도 learning_rate, loss 함수 종류 등 다양한 종류의 인자 설정이

추가로 가능하니 필요하신 분들은 사이킷런 공식 문서를 참고해주세요.

 

회귀인 경우도 GradientBoostingRegressor 함수로 유사하게 진행이 가능합니다.

 

 

파이썬 보팅 함수 : VotingClassifier (또는 Regressor)

서로 다른 종류의 모델을 앙상블 할 때 유용한 Voting 기능도

scikit-learn에서 VotingClassifier 함수로 제공하고 있습니다.

 

예시로, SVM과 랜덤포레스트를 보팅으로 앙상블하는 코드는 다음과 같이 구현이 가능합니다.

from sklearn.ensemble import RandomForestClassifier, VotingClassifier

estimator1 = SVC()
estimator2 = RandomForestClassifier(n_estimators = 50)

# 각 모델을 불러낼 이름도 같이 지정
model = VotingClassifier(estimators=[('SVM', estimator1), ('RF', estimator2)], voting='hard')

model.fit(X_train, y_train)

대표적인 인자 종류는 다음과 같습니다.

 

estimators : 투표를 수행할 모델들을 (명칭, 모델) 형태로 나열한 리스트로 지정

voting : 투표 방식 설정, 'hard'는 예측 라벨 다수결, 'soft'는 예측 확률값들을 더해서 argmax

weights : [0.6, 0.4]처럼 모델들의 가중치를 지정

 

기본적으로 predict 수행 시에는 전체 앙상블된 모델로 예측한 라벨들의 결과를 받을 수 있으며,

estimators 인자에서 지정한 명칭으로 각 모델만을 불러내어 예측을 진행하는 것도 가능합니다.

model.predict(X_test) # 전체 앙상블 모델로 라벨 예측

model.named_estimators_.SVM.predict(X_test) # SVM으로만 라벨 예측

model.named_estimators_.RF.predict(X_test) # 랜덤포레스트로만 라벨 예측

마찬가지로, 회귀의 경우에는 VotingRegressor 함수로 비슷하게 보팅을 진행할 수 있습니다.