AI/Machine Learning

[Machine Learning] 배깅 (Bootstrap Aggregating, Bagging)

byunghyun23 2023. 5. 31. 00:52

배깅(bootstrap aggregating, bagging) 또한 앙상블 학습(ensemble learning) 방법 중 하나입니다.
앙상블 학습은 같은 데이터를 기반으로 학습한 여러 모델을 비교 및 결합하여 개별적인 모델보다 성능이 더 나은 최종 모델을 만드는 것입니다.

 

앞서 보팅 방법과 달리 배깅은 동일한 학습 데이터를 사용하는 것이 아니라 부트스트랩(bootstrap) 샘플을 추출하여 학습하는 방법입니다.

여기서 부트스트랩이란 중복을 허용한 랜덤 샘플 추출 방법입니다.

 

또한 개별 모델은 모두 같은 머신러닝 알고리즘을 사용합니다.

가장 유명한 배깅 방법에는 랜덤 포레스트(random forest)가 있습니다.

랜덤 포레스트는 의사결정나무(decision tree)를 기반으로 예측한 결과를 평균으로 집계하여 더 나은 성능을 내는 방법입니다.

 

배깅의 장점은 같은 알고리즘으로 여러 샘플 데이터를 사용하기 때문에 노이즈가 많은 데이터 세트 내에서 분산을 낮추는 효과적입니다.

 

실습은 sklearn RandomForestClassifier, sklearn BaggingClassifier를 이용하여 와인 데이터를 분류해 보겠습니다.

배깅의 모델은 나이브 베이즈를 사용했습니다.

classification_report는 같은 결과가 나왔습니다.

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import BaggingClassifier

from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report

# 데이터 불러오기
raw_wine = datasets.load_wine()

# 피쳐, 타겟 데이터 지정
X = raw_wine.data
y = raw_wine.target

# 트레이닝/테스트 데이터 분할
X_tn, X_te, y_tn, y_te = train_test_split(X, y, random_state=0)

# 데이터 표준화
std_scale = StandardScaler()
std_scale.fit(X_tn)
X_tn_std = std_scale.transform(X_tn)
X_te_std = std_scale.transform(X_te)


# 랜덤포레스트 학습
clf_rf = RandomForestClassifier(max_depth=2,
                                random_state=0)
clf_rf.fit(X_tn_std, y_tn)

# 예측
pred_rf = clf_rf.predict(X_te_std)
print(pred_rf)

# 정확도
accuracy = accuracy_score(y_te, pred_rf)
print(accuracy)

# confusion matrix 확인
conf_matrix = confusion_matrix(y_te, pred_rf)
print(conf_matrix)

# 분류 레포트 확인
class_report = classification_report(y_te, pred_rf)
print(class_report)


# 배깅 학습
clf_bagging = BaggingClassifier(base_estimator=GaussianNB(),
                        n_estimators=10,
                        random_state=0)
clf_bagging.fit(X_tn_std, y_tn)

# 예측
pred_bagging = clf_bagging.predict(X_te_std)
print(pred_bagging)

# 정확도
accuracy = accuracy_score(y_te, pred_bagging)
print(accuracy)

# confusion matrix 확인
conf_matrix = confusion_matrix(y_te, pred_bagging)
print(conf_matrix)

# 분류 레포트 확인
class_report = classification_report(y_te, pred_bagging)
print(class_report)