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 함수로 비슷하게 보팅을 진행할 수 있습니다.
'Python > Sklearn' 카테고리의 다른 글
파이썬 SMOTE 알고리즘 데이터 불균형 해결 예제 (0) | 2022.12.05 |
---|---|
[Sklearn] 파이썬 feature selection 함수 RFE, RFECV 예제 (1) | 2022.09.24 |
[Sklearn] 파이썬 ROC 커브, AUC 면적 구하기 예제 (0) | 2022.09.16 |