Machine Learning/Advanced (hands on machine learning)

19. 앙상블 학습과 랜덤 포레스트 - 배깅과 페이스팅

jwjwvison 2021. 5. 22. 17:47

다양한 분류기를 만드는 한가지 방법은 각기 다른 훈련 알고리즘을 사용하는 것이다. 또 다른 방법은 같은 알고리즘을 사용하고 훈련 세트의 서브셋을 무작위로 구성하여 분류기를 각기 다르게 학습시키는 것이다. 훈련 세트에서 중복을 허용하여 샘플링 하는 방식을 배깅(bagging, bootstrap aggregating의 줄임말)이라 하며, 중복을 허용하지 않고 샘플링 하는 방식을 페이스팅(pasting)이라고 한다.


모든 예측기가 훈련을 마치면 앙상블은 모든 예측기의 예측을모아서 새로운 샘플에 대한 예측을 만든다. 수집 함수는 전형적으로 분류일 때는 통계적 최빈값이고, 회귀에 대해서는 평균을 계산한다. 개별 예측기는 원본 휸련 세트로 훈련시킨 것보다 훨씬 크게 편향되어 있지만 수집 함수를 통과하면 편향과 분산이 모두 감소한다. (편향이 크면 과소적합, 분산이 크면 과대적합). 일반적으로 앙상블의 결과는 원본 데이터셋으로 하나의 예측기를 훈련시킬 때와 비교해 편향은 비슷하지만 분산을 줄어든다.

사이킷런은 배깅과 페이스팅을 위해 간편한 API로 구성된 BaggingClassifier(회귀인 경우에는 BaggingRegressor)를 제공한다. 다은은 결정 트리 분류기 500개의 앙상블을 훈련시키는 코드이다. 각 분류기는 훈련 세트에서 중복을 허용하여 무작위로 선택된 100개의 샘플로 훈련된다.(이는 배깅의 경우이고, 대신 페이스팅을 사용하려면 bootstrap=False로 지정하면 된다). n_jobs 매개변수는 사이킷런이 훈련과 예측에 사용할 CPU 코어 수를 지정한다. (-1로 지정하면 가용한 모든 코어를 사용한다).

from sklearn.ensemble import BaggingClassifier from 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) print(accuracy_score(y_test,y_pred))

앙상블은 비슷한 편향에서 더 작은 분산을 만든다(훈련 세트의 오차 수가 거의 비슷하지만 결정 경계는 덜 불규칙하다).

부트스트래핑은 각 예측기가 학습하는 서브셋에 다양성을 증가시키므로 배깅이 페이스팅보다 평향이 조금 더 높다. 하지만 다양성을 추가한다는 것은 예측기들의 상관관계를 줄이므로 앙상블의 분산을 감소시킨다. 전반적으로 배깅이 더 나은 모델을 만들기 때문에 일반적으로 더 선호한다.

<oob 평가>

배깅을 사용하면 평균적으로 각 예측기에 훈련 샘플의 63% 정도만 샘플링된다는 것을 의미한다. 선택되지 않은 훈련 샘플의 나머지 37%를 ocb(out-of-bag) 샘플이라고 부른다. 예측기 마다 남겨진 37%는 모두 다르다.
예측기가 훈련되는 동안에는 oob 샘플을 사용하지 않으므로 별도의 검증 세트를 사용하지 않고 oob 샘플을 사용해 평가할 수 있다. 앙상블의 평가는 각 예측기의 oob 평가를 평균하여 얻는다.

사이킷런에서 BaggingClassifier를 만들 때 oob_score=True로 지정하면 훈련이 끝난 후 자동으로 oob 평가를 수행한다. 다음 코드는 이 과정을 보여준다. 평가 점수 결과는 oob_score_ 변수에 저장되어 있다.

bag_clf=BaggingClassifier( DecisionTreeClassifier(),n_estimators=500,max_samples=100, bootstrap=True,n_jobs=-1,oob_score=True) bag_clf.fit(X_train,y_train) bag_clf.oob_score_
y_pred=bag_clf.predict(X_test) accuracy_score(y_test,y_pred)


oob 샘플에 대한 결정 함수의 값도 oob_decision_function 변수에서 확인할 수 있다. 이 경우 결정 하수는 각 훈련 샘플의 클래스 확률을 반환한다(기반이 되는 예측기가 predict_proba() 메서드를 가지고 있기 때문에). 다음 예를 보면 oob 평가는 첫 번째 훈련 샘플이 양성 클래스에 속활 확률은 68.25%로 추정하고 있다(그리고 음성 클래스에 속할 확률은 31.75% 이다).

bag_clf.oob_decision_function_


BagClassifier는 특성 샘플링도 지원한다. 샘플링은 max_features, bootstrap_features 두 매개변수로 조절된다. 샘플이 아니고 특성에 대한 샘플링이다. 따라서 각 예측기는 무작위로 선택한 입력 특성의 일부분으로 훈련된다.

이 기법은 특히 (이미지와 같은) 매우 고차원의 데이터셋을 다룰 대 유용하다. 훈련 특성과 샘플을 모두 샘플링 하는 것을 랜덤 패치 방식(random patches method)라고 한다. 훈련 샘플을 모두 사용하고(bootstrap=False이고 max_samples=1.0으로 설정) 특성을 샘플링하는 (bootstrap_features=True 그리고/또는 max_features는 1.0보다 작게 설정) 것을 랜덤 서프스페이스 방식(random subspaces method)이라고 한다.

특성 샘플링은 더 다양한 예측기를 만들며 편향을 늘리는 대신 분산을 낮춘다.