지난 시간에는 앙상블의 개념과 투표 방식의 앙상블 학습에 대해 알아보았었다.
이번 시간에는 앙상블 중에서도배깅과 페이스팅 방식에 대해 알아보도록 하자.
배깅? 페이스팅이란?
배깅(Bagging)과 페이스팅(Pasting)이 무엇인지 바로 알아보기 전에 앙상블 학습에 대해 다시 살펴볼 필요가 있다.
저번 시간에 앙상블 학습에서 서로 독립적이며 다양한 분류기를 사용할수록 정확도가 높아진다는 사실을 배웠었다.
그렇다면 어떻게 다양한 분류기를 만들 수 있을까? 다른 알고리즘을 사용하는 분류기를 만들면 된다.
하지만 데이터에는 변화를 줄수 없을까? 에서 고안된 방법이 바로 배깅과 페이스팅이다.
훈련 데이터에서 무작위로 중복을 허용해서 뽑아 사용하는 것을 배깅이라고 하며 중복을 허용하지 않는다면 페이스팅이다.
말만으로 이해가 잘 되지 않는다면 아래 [그림 1]을 참고해 보자.
이처럼 배깅은 중복을 허용하며 훈련 데이터셋에서 데이터를 임의로 추출하며
페이스팅은 중복을 허용하지 않으면서 훈련 데이터셋에서 데이터를 임의로 추출한다.
즉, 배깅과 페이스팅은 데이터에 변화를 주는 것이라고 이해하면 된다.
배깅의 경우, 중복을 허용하기에 데이터의 다양성을 증가시키므로 성능이 좋다고 한다.
또한 배깅은 중복을 허용하기에 평균적으로 약 30%의 데이터는 선택되지 않는데 이를 검증에 사용할 수도 있다.(oob 점수)
배깅과 페이스팅 사용법
배깅과 페이스팅을 사용하고자 한다면, 사이킷런을 사용하는 것이 유리하다.
사이킷런에서는 배깅과 페이스팅을 위한 BaggingClassifier()을 제공하기 때문이다.
BaggingClassifier() 파라미터
base_estimator | 배깅에 사용할 분류기. |
bootstrap | 데이터에서 중복을 허용할지 여부. 기본은 True |
max_samples | 뽑아낼 샘플의 개수. 정수 혹은 실수가 올 수 있다. 정수인 경우 샘플 갯수, 실수인 경우 전체 데이터수*실수가 된다. 기본은 1.0 |
n_estimators | 앙상블에서 사용할 분류기의 개수. 기본은 10 |
oob_score | boostrap=True로 배깅일경우, 사용되지 않은 데이터에 대한 평가 시행 여부. 기본은 False 점수는 .oob_score_에 저장된다. |
++BaggingClassifier()은 또한 특성 샘플링 또한 지원한다! 더 알고 싶다면 아래 접은글을 참조하자.
BaggingClassifier()은 max_features, bootstrap_features 를 통해 특성 샘플링을 지원한다.
이는 고차원의 데이터셋을 다룰때 유용하게 사용가능하다.
훈련샘플과 특성을 모두 샘플링(bootstrap)을하는 것(배깅+특성샘플링)을 랜덤 패치 방식(Random Patches Method)이라고한다.
특성만을 샘플링 하는 것을 랜덤 서브스페이스 방식(Random Subspaces Method) 이라고 한다.
max_fefatures | 뽑아낼 최대 특성 개수. 정수 혹은 실수가 올 수 있다. 정수인 경우 특성 갯수, 실수인 경우 전체 특성수*실수가 된다. 기본은 1.0 |
bootstrap_features | 특성을 뽑을때 중복을 허용할지 여부. 기본은 False |
아래 예시에서는 [그림 1]의 make_moons()를 통해 만든 데이터셋을 다루고 있다.
[그림 1] 을 보면 이상치와 노이즈가 꽤 있는 데이터셋임을 확인이 가능하다.
위 [그림 2] 데이터셋을 단일 결정 트리 모델과 500개의 분류기를 사용한 배깅 모델에 학습시켰다.
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
#훈련 데이터세트 만들기 및 훈련/테스트 데이터 분할
X,y = make_moons(n_samples= 1000, noise = 0.3,random_state=2021)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2, shuffle=True, random_state=2021)
#단일 결정 트리 모델과 배깅을 활용한 모델 생성 및 훈련
model_tree = DecisionTreeClassifier(random_state=2021)
model_tree.fit(X_train,y_train)
model_bagging = BaggingClassifier(base_estimator=DecisionTreeClassifier(),bootstrap=True,max_samples=100,n_estimators=500,random_state=2021,oob_score=True)
model_bagging.fit(X_train,y_train)
#정확도 비교
y_pred1 = model_tree.predict(X_test)
y_pred2 = model_bagging.predict(X_test)
print("================모델 별 정확도================")
print("단일 결정 트리 모델:",accuracy_score(y_test,y_pred1),"\n배깅 앙상블 모델",accuracy_score(y_test,y_pred2))
print("================배깅 oob 점수==================")
print("배깅 앙상블 모델 oob 점수:",model_bagging.oob_score_)
실행 결과, [그림 3]와 같이 배깅을 통해 만든 모델이 좀 더 성능이 좋은 것을 확인이 가능하다.
또한, [그림 4]의 결정 경계를 확인하면 배깅 모델의 결정경계가 단일 결정 트리 모델 보다 매끄럽게 구성되었으며 일반화에 유리함을 확인이 가능하다.
이번 시간에는 배깅과 페이스팅에 관해 살펴보았다.
다음 시간에는 배깅과 페이스팅과 관련해 몇 가지를 좀 더 알아보고 부스팅에 관해 알아보도록 하자.
혹시 모르거나 잘못된 부분이 있다면 자유롭게 댓글을 통해 알려주세요!
참조
Geron Aurelien, 박해선 역, 핸즈온 머신러닝, 한빛미디어, 2020
'수업내용정리 > 인공지능' 카테고리의 다른 글
[SckitLearn]앙상블 학습의 개념과 사용법(3)_부스팅 (0) | 2023.02.23 |
---|---|
[SckitLearn]앙상블 학습의 개념과 사용법(3)_랜덤포레스트 (0) | 2023.02.22 |
[SckitLearn]앙상블 학습의 개념과 사용법(1)_투표방식 (0) | 2023.02.17 |
[SckitLearn]지도학습 알고리즘(4)_SVM 회귀의 특징과 사용법 (0) | 2023.02.15 |
[SckitLearn]지도학습 알고리즘(3)_비선형 SVM 분류기의 특징과 사용법 (0) | 2023.02.14 |