도찐개찐

[머신러닝] 15. 배깅(bagging) 본문

PYTHON/데이터분석

[머신러닝] 15. 배깅(bagging)

도개진 2023. 1. 3. 12:42

배깅bagging

  • boostrap aggregating
  • 보통 구축한 트리에는 랜덤성이 없는데 랜덤한 데이터를 이용해서 트리를 구성하는 방법은?
    • 훈련 데이터셋에서 중복을 허용하여 무작위 추출sampling => 배깅
  • 통계학에서 샘플데이터의 수가 적거나 샘플이 치우쳐 있는 경우에는 과적합의 문제 발생
  • 머신러닝의 경우에도 학습데이터의 양이 작거나 너무 학습데이터에 특화해서 학습하게 되면
  • 학습데이터에 대해 좋은 결과를 내지만 실제 데이터에서는 성능이 좋지 않게 나올수 있음(과적합)

부트스트래핑boostraing

  • 전체 모집단의 분포를 확실하게 알 수 없는 경우에 표본을 취한후 그 표본이 전체 집단을 대표한다는 가정하에 전체 분포를 유추하는 방법
  • 이때 표본으로부터 많은 횟수에 걸쳐 샘플을 복원추출한 후 각 샘플에 대한 분포를 구함 - 이를 통해 전체의 분포를 유추
  • 실제로 머신러닝에 많이 사용되는 방식
    • 회귀의 경우는 평균을 취해 분산을 줄이는 방식을 사용
    • 분류의 경우는 투표를 통해 빈도값이 높은 것을 취하는 방식 사용
  • 베깅을 사용하면 안되는 경우
    • 표본 데이터가 작은 경우 : 전체를 반영 못함
    • 데이터에 잡음이 많은 경우 : 왜곡된 결과 나올 가능성 존재
    • 데이터에 의존성이 있는 경우 : 다중공선성-독립적이어야 함
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import BaggingClassifier

from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, f1_score
from sklearn.metrics import recall_score, precision_score

from sklearn.metrics import roc_curve, roc_auc_score

테스트용 데이터 생성 및 분할

from sklearn.datasets import make_blobs

X, y = make_blobs(n_samples=350, centers=4,
                  random_state=0, cluster_std=1.0)
plt.scatter(X[:,0], X[:,1], c=y, s=55)
plt.show()

배깅 분류

X_train, X_test, y_train, y_test = \
    train_test_split(X, y, train_size=0.7,
                     stratify=y, random_state=2211211235)
# n_estimators : 모형 갯수 지정
# bootstrap : 부트스트랩(샘플추출시 중복허용) 여부
# n_jobs : 다중작업수 지정(cpu 사용율)
# oob_score : 베깅 평가지수 사용여부

bggclf = BaggingClassifier(DecisionTreeClassifier(),
                          n_estimators=500, bootstrap=True, n_jobs=-1, oob_score=True
                          )
bggclf.fit(X_train, y_train)
BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=500,
              n_jobs=-1, oob_score=True)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class="sk-container" hidden><div class="sk-item sk-dashed-wrapped"><div class="sk-label-container"><div class="sk-label sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-1" type="checkbox" ><label for="sk-estimator-id-1" class="sk-toggleable__label sk-toggleable__label-arrow">BaggingClassifier</label><div class="sk-toggleable__content"><pre>BaggingClassifier(base_estimator=DecisionTreeClassifier(), n_estimators=500,
              n_jobs=-1, oob_score=True)</pre></div></div></div><div class="sk-parallel"><div class="sk-parallel-item"><div class="sk-item"><div class="sk-label-container"><div class="sk-label sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-2" type="checkbox" ><label for="sk-estimator-id-2" class="sk-toggleable__label sk-toggleable__label-arrow">base_estimator: DecisionTreeClassifier</label><div class="sk-toggleable__content"><pre>DecisionTreeClassifier()</pre></div></div></div><div class="sk-serial"><div class="sk-item"><div class="sk-estimator sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-3" type="checkbox" ><label for="sk-estimator-id-3" class="sk-toggleable__label sk-toggleable__label-arrow">DecisionTreeClassifier</label><div class="sk-toggleable__content"><pre>DecisionTreeClassifier()</pre></div></div></div></div></div></div></div></div></div></div>

oob_score : out-of-bag score

  • oob는 부트스트래핑 샘플링시 선택되지 않은 표본을 의미
  • 기본적으로 중복을 허용하여 훈련데이터 크기만큼 n개(70%)의 샘플을 추출하면 나머지(30%)는 oob 샘플로 남음
  • 매번 예측할때 마다 남겨진 oob샘플은 다를것임
  • 따라서, 예측시 검증 데이터를 사용하지 않고, oob 샘플을 이용해서 평가 시행
  • 해당 평가점수는 oob_score에 저장
bggclf.oob_score_
0.9016393442622951
pred = bggclf.predict(X_test)
accuracy_score(y_test, pred)
0.9150943396226415

중복허용없이 무작위 추출 분석

bggclf2 = BaggingClassifier(DecisionTreeClassifier(),
                          n_estimators=500, bootstrap=False, n_jobs=-1, oob_score=False
                          )
bggclf2.fit(X_train, y_train)
BaggingClassifier(base_estimator=DecisionTreeClassifier(), bootstrap=False,
              n_estimators=500, n_jobs=-1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class="sk-container" hidden><div class="sk-item sk-dashed-wrapped"><div class="sk-label-container"><div class="sk-label sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-4" type="checkbox" ><label for="sk-estimator-id-4" class="sk-toggleable__label sk-toggleable__label-arrow">BaggingClassifier</label><div class="sk-toggleable__content"><pre>BaggingClassifier(base_estimator=DecisionTreeClassifier(), bootstrap=False,
              n_estimators=500, n_jobs=-1)</pre></div></div></div><div class="sk-parallel"><div class="sk-parallel-item"><div class="sk-item"><div class="sk-label-container"><div class="sk-label sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-5" type="checkbox" ><label for="sk-estimator-id-5" class="sk-toggleable__label sk-toggleable__label-arrow">base_estimator: DecisionTreeClassifier</label><div class="sk-toggleable__content"><pre>DecisionTreeClassifier()</pre></div></div></div><div class="sk-serial"><div class="sk-item"><div class="sk-estimator sk-toggleable"><input class="sk-toggleable__control sk-hidden--visually" id="sk-estimator-id-6" type="checkbox" ><label for="sk-estimator-id-6" class="sk-toggleable__label sk-toggleable__label-arrow">DecisionTreeClassifier</label><div class="sk-toggleable__content"><pre>DecisionTreeClassifier()</pre></div></div></div></div></div></div></div></div></div></div>
pred = bggclf2.predict(X_test)
accuracy_score(y_test, pred)
0.8301886792452831

결정 영역 시각화

from mlxtend.plotting import plot_decision_regions
plot_decision_regions(X_train, y_train, bggclf)

plot_decision_regions(X_train, y_train, bggclf2)

728x90

'PYTHON > 데이터분석' 카테고리의 다른 글

[머신러닝] 17. 부스팅(boosting)  (0) 2023.01.03
[머신러닝] 16. 랜덤 포레스트  (0) 2023.01.03
[머신러닝] 14. 앙상블  (0) 2023.01.03
[머신러닝] 13. SVM  (0) 2023.01.03
[머신러닝] 12. KNN  (0) 2023.01.03
Comments