My Data Story
[모델 알고리즘][앙상블 학습] 배깅, 페이스팅 본문
◈ '앙상블 학습' 목차 ◈
1. 배깅, 페이스팅
투표 기반의 분류기 종류에 대해 살펴보고 배깅과 페이스팅에 대해 이해해보자.
1. 투표 기반 분류기
1.1 직접 투표 분류기
더 좋은 분류기를 만드는 방법은 여러 분류기의 예측을 모아서 가장 많이 선택된 클래스를 예측하는 것이다.
약한 학습기(랜덤 추측보다 조금 더 높은 성능을 내는 분류기) 일지라도 충분히 많고 다양하다면 앙상블은 강한 학습기가 될 수 있다.
하지만 이러한 가정은 모든 분류기가 독립적이고 오차에 상관관계가 없어야 가능하다.
앙상블 방법은 예측기가 가능한 서로 독립일 때 최고의 성능을 발휘한다.
다양한 분류기를 얻는 한 가지 방법은 각기 다른 알고리즘으로 학습시키는 것이다.
그러면 다른 종류의 오차를 만들어 낼 가능성이 높기 때문에 앙상블 모델의 정확도는 높아질 것이다.
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import LogisticRegression
from sklearn.svm improt SVC
log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC()
voting_clf = VotingClassifier(estimators=[('lr', log_clf),
('rf', rnd_clf),
('svc', svm_clf)], voting='hard')
voting_clf.fit(X_train, y_train)
1.2 간접 투표 분류기
모든 분류기가 클래스의 확률을 예측할 수 있다면 (predict_prob() 메소드 존재), 개별 예측기의 예측을 평균내어 확률이 가장 높은 클래스를 예측할 수 있다. 간접 투표 분류기는 직접 투표 분류기보다 성능이 더 좋다.
간전 투표 분류기를 사용하려면 VotingClassifier 의 매개변수 voting = 'soft' 로 설정하면 된다.
이때 SVC 는 default 로 predict_prob() 를 제공하지 않아, SVC(probablity=True) 설정하면 predict_prob() 제공한다.
log_clf = LogisticRegression()
rnd_clf = RandomForestClassifier()
svm_clf = SVC(probablity = True)
voting_clf = VotingClassifier(estimators=[('lr', log_clf),
('rf', rnd_clf),
('svc', svm_clf)], voting='soft')
voting_clf.fit(X_train, y_train)
for clf in voting_clf.estimators_ + [voting_clf] :
print(clf.__class__.__name__, clf.score(X_test, y_test)
2. 배깅과 페이스팅
앙상블을 구현하는 방법은 다양하다.
앞서 살펴본 것처럼 같은 데이터로 서로 다른 알고리즘으로 학습시켜 직접 투표 또는 간접 투표 분류기를 생성할 수 있고, 같은 알고리즘을 사용하고 훈련 세트의 서브셋을 무작위로 구성하여 분류기를 각기 다르게 훈련시켜 다양한 분류기를 만들 수도 있다.
훈련 세트의 서브셋 구성 방식에 따라 배깅과 페이스팅이 있다. 배깅은 Bootstrap Aggregation 의 약자로, 매번 부트스트랩 재표본에 대해 새로운 모델을 만든다.페이스팅은 중복을 허용하지 않고 랜덤하게 추출하여 새로운 모델을 만든다.
배깅과 페이스팅 동작 과정은 다음과 같다.
step1
훈련 세트의 서브셋을 무작위로 구성하고 동일 알고리즘을 적용하여 예측기를 훈련시킨다.
[샘플링 방식]
배깅 - 훈련 세트에서 중복을 허용한 샘플링 방식 bootstrap aggregation
페이스팅 - 훈련 세트에서 중복을 허용하지 않는 샘플링 방식
step2
모든 예측기의 예측을 모아 새로운 샘플에 대한 예측을 생성한다.
수집 함수는 전형적으로 분류일 때 통계적 최빈값이고, 회귀일 때는 평균을 계산한다.
개별 예측기는 원본 훈련 세트에서 훈련시킨 것보다 훨씬 편향되지만, 여러 예측기를 수집 함수에 통과시키면 편향과 분산이 모두 감소한다. 즉 앙상블의 결과는 원본 데이터 셋으로 훈련시킨 것과 비교했을 때, 편향은 비슷하지만 분산은 줄어든다고 할 수 있다. (훈련 세트의 오차 수는 비슷하지만, 결정 경계가 덜 불규칙하다.)
배깅과 페이스팅 예측기는 모두 동시에 다른 CPU 코어나 서버에서 병렬로 학습시킬 수 있다.
부트스트래핑은 각 예측기가 학습하는 서브셋에 다양성을 증가시키므로 배깅이 페이스팅보다 편향이 더 높을 수 있다.
하지만 다양성을 추가한다는 것은 예측기들의 상관관계를 줄이므로 앙상블의 분산을 감소시킨다.
전반적으로 배깅이 페이스팅보다 더 나은 모델을 생성하기에 일반적으로 더 선호한다.
2.1 모델 구현
사이킷런은 배깅과 페이스팅을 위한 간편 API 로 구성되어 있다.
분류일 경우 BaggingClassifier, 회귀일 경우 BaggingRegressor 를 제공한다.
BaggingClassifier 의 주요 매개 변수를 살펴보자.
n_estimators : 앙상블 훈련시킬 예측기 갯수
max_samples : 예측기 훈련에 넣을 훈련 샘플 최대수 (정수, 비율 지정 가능)
bootstrap : True면 배깅, False면 페이스팅
n_jobs : 훈련과 예측에 사용할 CPU 갯수
from sklearn.ensemble import BaggingClassifier
form sklearn.tree import DecisionTreeClassifier
bag_clf = BaggingClassifier(DecisionTreeClassifier,
n_estimators = 500,
max_samples = 100,
bootstrap = True,
n_jobs =1 )
bag_clf.fit(X_train, y_train)
y_pred = bag_clf.predict(X_test)
BaggingClassifier 는 기본이 되는 분류기가 결정 트리처럼 클래스 확률을 주정할 수 있으면 (predic_prob() 함수 존재), 자동으로 간접 투표 방식으로 집계한다.
부트스트래핑 bootstrap 은 각 예측기가 학습하는 서브셋에 다양성을 증가시킨다. 그래서 배깅이 페이스팅보다 편향이 조금 높다. 하지만 다양성을 증가시킨다는 것은 예측기의 상관관계를 줄이므로 앙상블의 분산을 줄인다. 따라서 전반적으로 배깅이 더 나은 모델을 만든다.
시간과 CPU 파워에 여유가 있다면, 교차 검증으로 배깅과 페이스팅을 모두 평가해봐도 좋다.
2.2 oob 평가
배깅 사용 시, 어떤 샘플은 한 예측기에서 여러 번 샘플링되고, 어떤 샘플은 아예 선택되지 않을 수 있다.
훈련 세트 크기만큼 m개의 샘플을 선택할 때, 각 예측기에서 훈련 샘플의 63% 정도만 샘플링 되고 나머지 37%는 선택되지 않는다. 선택되지 않은 37%를 oob (Out Of Bag) 샘플이라고 한다.
예측기가 훈련되는 동안 oob 샘플을 사용하지 않으므로 별도의 검증 세트를 사용하지 않고, oob 샘플을 사용해 모델 평가할 수 있다. 앙상블의 평가는 각 예측기의 oob 평가를 평균하여 얻는다. 사이킷런에서 매개 변수 oob_score = True 로 설정한다.
bag_clf = BaggingClassifier(DecisionTreeClassifier(),
n_estimators = 500,
bootstrap = True,
n_jobs = 1,
oob_score = True)
bag_clf.fit(X_train, y_train)
print(bag_clf.oob_score_) #0.9013332
oob 평가 점수와 테스 세트에 대한 평가를 비교해보면, 비슷한 정확도를 얻는다.
from sklearn.metrics import accuracy_score
y_pred = bag_clf.predict(X_test)
print(accuracy_score(y_test, y_pred)) #0.912
배깅의 기반이 되는 예측기가 결정 트리처럼 predict_prob() 메서드를 가지고 있다면, oob_decision_funcion_ 변수를 통해 oob 샘플에 대한 결정 함수 값도 구할 수 있다. 해당 결정 함수 값은 각 훈련 샘플의 클래스 확률값이다.
print(bag_clf.oob_decision_function_)
3. 랜덤 패치와 랜덤 서브스페이스
사이킷런에서 BaggingClassifier 클래스는 샘플 뿐 아니라, 특성에 대한 샘플링도 지원한다.
BaggingClassifier 클래스의 매개 변수 max_features, bootstrap_features로 조절할 수 있다.
작동 방식은 매개 변수 max_samples 와 bootstrap 와 동일하지만, 샘플이 아니라 특성에 대한 샘플링이다.
따라서 각 예측기는 무작위로 선택한 입력 특성의 일부분으로 훈련된다.
이 기법은 이미지와 같은 고차원의 데이터 셋을 다룰 때 유용하다.
˙ 랜덤 패치 방식
훈련 샘플과 특성을 모두 샘플링
(샘플 샘플링) max_samples < 1.0 그리고/ 또는 bootstrap=True
(특성 샘플링) max_features<1.0 그리고/또는 bootstrap_feature=True
˙랜덤 서브스페이스 방식
훈련 샘플 모두 사용하고
(훈련 샘플 모두 사용) max_samples=1.0, bootstrap=False
(특성 샘플링) max_features<1.0 그리고/또는 bootstrp_feature=True) 것을 랜덤 서브스페이스 방식이라고 한다.
특성 샘플링은 더 다양한 예측기를 만들며 편향을 늘리는 대신 분산을 낮춘다.
'Machine Learning > 2. 지도 학습 알고리즘' 카테고리의 다른 글
[모델 알고리즘][앙상블 학습] 에이다부스트 (0) | 2021.08.13 |
---|---|
[모델 알고리즘][앙상블 학습] 랜덤포레스트 (0) | 2021.08.13 |
[회귀] 결정 트리 회귀 모델 (0) | 2021.08.13 |
[분류] 결정 트리 분류 모델 (0) | 2021.08.13 |
[모델 알고리즘] 서포트 벡터 머신 - SVM 이론 (0) | 2021.08.09 |