앙상블 : 여러 예측기를 이용해 예측함
랜덤 포레스트(random forest)는 여러 결정트리를 이용한 것.
7.1 투표 기반 분류기
여러 분류기들이 같은 test data 를 가지고 결과를 투표를 해서 결과를 내는적. 이렇게 다수결 투표로 정해지는 분류기를 직접 투표(hard voting) 분류기 하고 한다.
실제로 다양한 분류기중 가장 높은것보다 결과는 더 좋은 결과를 내놓기도 한다고 한다.
약한 학습기 -> 강한 학습기
이는 큰 수의 법칙(law of large number) 때문인데 즉 수행횟수가 늘어날 수록 더 실제와 점점더 가까워진다는 의미이다.
7.2 배깅과 페이스팅
이제 여러 분류기를 만들어야하는데 사장 쉬운방법은 여러 알고리즘을 사용하는 것이다. 또 같은 알고리즘이더라도 전체 데이터중 다른 일부분을 사용해서 훈련을 하는 것이다. 이때 전체 데이터에서 중복을 허용하여 샘플링하는 방식을
배깅(bagging) bootstrap aggregating 이라고 한다. 중복을 허용하지 않는 경우에는 페이스팅(pasting) 이라고 한다.
결과가 분류일때는 통계적 최빈값(statistical mode) 로 하고 회귀의 경우에는 평균을 사용한다. 이런 경우에는 평향과 분산이 모두 감소한다. 그래서 CPU코어나 서버에서 병렬로 학습하는 배깅, 페이스팅이 자주 사용된다.
7.2.1 사이킷런의 배깅과 페이스팅
배깅을 사용한 결과가 안 사용한것보다 더 좋은것을 확인할 수 있다. 이상치에대해서도 덜 민감하게 작용한듯 하다.
부트스트래핑은 서브셋의 다양성을 증가시키므로 편향이 조금더 높다. 하지만 예측기들관의 상관관계를 줄인다. 즉 비슷한 예측기가 적어진다. 그래서 분산을 감소시킨다.
7.2.2 oob 평가
배깅을 사용하면 어떤샘플은 여러번 사용되고 어떤것은 선택이 안될수도 있음.
BaggingClassifier 는 기본적으로 63 프로의 샘플을 사용한다 이때 나머지 37프로를 oob(out-of-bag) 라고함. 이걸 이용해서 평가를 할 수 있음. 그냥 validation set 이라고 생각하면 될듯함. 즉 앙상블의 여러 모델들의 val_acc 를 확인할 수 있다고 생각하면 편함.
7.3 랜덤 패치와 랜던 서브스페이스
BaggingClassifier 는 특성 샘플링도 함. max_features, bootstarp_feature 를 이용해서 조절함. 이건 샘플 즉 데이터에 대해서가 아니라 feature 에 대해서 샘플링을 한다는 뜻임. 이는 특성이 매우 많을때 유용함.
모두 사용하는것을 램덤 패치 방식(random patched method) 라 하고-> bootstrap=False, max_samples=1.0
일부만 사용하는것을 랜덤 서브스페이스 방식(random subspaces method) 이라고 함.
7.4 랜덤 포레스트
랜덤 포레스트는 일반적으로 배깅을 적용한 결정트리의 앙상블임. RandomForestClassifier 는 분류기용 RandpmForestRegressor 는 회귀용이다.
트리의 노드를 분할할 떄 전체특성중 최선의 특성을 찾는대신 무작위로 선택한 특성후보중 최선을 특성을 찾는식으로 무작위성을 더 주입한다. 이로인해 여러 종류의 트리가 만들어 지게 되고 편향을 손해보는 대신 분산을 낮추어 좋은 모델로 평가된다.
7.4.1 엑스트라 트리
트리를 만들 때 각 노드의 특성의 서브셋을 무작위로 만들어 분할에 사용함. 트리의 더 무작위하게 만들기 위해 최적의 임계값을 찾는게 아니라 후보 특성을 사용해 무작위로 분한 후 그중에서 최상의 분할을 선택해서 무작위성을 높여주는데 이와같은 방법을 익스트림 랜덤 트리(extremely randomized tree) 앙상블 또는 엑스트라 트리(extra-tree) 라고 부른다.
말했듯이 최상의 임계값을 찾는게 아니기에 일반 랜덤포리스트보다 엑스트라 트리가 훨씬 빠르다.
7.4.2 특성 중요도
랜덤 포리스트의 또다른 장점은 특성의 상대적 중요도를 측정하기가 쉽다. 사이킷런에서 어떤 특성이 평균적으로 분순도를 얼마나 감소시키는지 확인해서 특성의 중요도를 확인할 수 있다. 훈련이 끝나면 점수를 계산하고 중요도 전체합이 1 이 되도록 normalize 하고 feature_importances_ 에 저장한다. 즉 바로 볼수 있다.
7.5 부스팅
부스팅(boosting) (가설 부스팅 hypothesis boosting) 은 약한 학습기 여러개로 강한 학습기를 만드는 앙상블임.
7.5.1에이다부스트(AdaBoost)
이건 언더피팅했던 훈련샘플들에 가중치를 더 높이는 방법이다. 이렇게하면 새로운 예측기는 학습하기 어려운 샘플에 더 잘 맞춰진다는 장점이 있다.
이처럼 훈련된 분류기를 더욱더 보완해가는 방식이다.
학습 알고리즘을 보면 T 번 반복하며 ht를 고르고 가중치가 적용된 에러율을 계산한다.
h_t(x_i) 는i 번째 데이터에 대한 t 번째 모델의 예측값이다. 즉 틀린 샘플의 가중치들의 합에서 전체 가중치의 합으로 나눈 비율을 에러율이라고 정의한 것이다.
t 번째 모델에대한 가중치 alpha_t 를 만든다. 위 식에서 학습률 부분은 없지만 사이킷런에서는 default 값은 1이다.
이제 W 를 update 해준다. 그리고 정규화를 해준다.
A Short Introduction to Boosting
요건 해당 논문
잘못 분류된 샘플의 가중치는 반복마다 절반 정도만 높아진다고 한다.
아쉬운 점이 있다면 이방법은 예측기를 훈련하고 평가된 후 update를 하기에 병렬화를 할수 없다고 함.
책에서 나온 방법으로 한번더 보자.
초기 w 의 값은 다 동일하게 작용한다. 첫번째 학습을 하고 가중치가 적용된 에러율 r1 이 해당 훈련에 대해 계산이 된다.
이렇게 가중치가 적용된 에러율이 계산된다.
여기서 예측기의 가중치는 alpha_j 로 계산된다. 여기서 \eta는 learning rate 고 default 는 1 이다.
이제 샘플의 가중치를 업데이트 한다. 즉 잘못 분류된 샘플의 가중치가 증가하게 된다.
잘 예측한거는 그대로, 잘못 예측한거는 exp(alpha) 를 곱해주게 된다.
이걸 이젠 모든 W 의 합을 구해서 정규화를 해준다.
예측할때 모든 예측기의 예측을 계산하고 예측기 가중치 alpha_j 를 더해 예측결과를 만든다. 이때 가장추합이 가장 큰 클래스가 예측 결과가 된다.
(N 은 예측기수)
사이킷런은 SAMME 라는 다중 클래스 버전 에이다 부스트를 사용한다. 클래스가 2개일떄는 동일하다. 예측기가 확률을 추정할수있다면 SAMME.R 이라는 변종을 사용하고 이는 예측값대신 클래스확률에 기반해서 일반적으로 성능이 더 좋다.
7.5.2 그레디언트 부스팅(gradient boosting)
그레디언트 부스팅은 샘플의 가중치를 수정하는 에이다부스트와 달리 이전 예측기가 만든 잔여오차(residual error)에 새로운 학습기를 학습시킨다.
결정트리를 기반으로 하는 회귀 문제를 풀때 그레디언트 트리 부스팅(gradient tree boosting) 또는 그레디언트 부스티드 회귀 트리 (gradient boosted regression tree) GBRT 라고 부른다.
먼저 DecisionTreeRegressor 를 학습시키고 여기서 나온 잔여오차에 두번째 DecisionTreeRegressor 에 훈련시킨다. 이런식으로 반복한다. 이러면 앙상블 모델이 생기고 새로운 샘플(test) 에 예측할떄는 모든 트리의 예측을 더하면 된다.
learning_rate 로 각 트리의 기여도를 조절한다. 0.1 정도로 낮게 하면 학습시키기위해 많은 트리가 필요하게 되지만 예측 성능은 좋아진다. 이를 축소(shrinkage) 라고 부르는 규제 방법이다.
이와 같이 estimators 의 차이로 언더피티이나 오버피팅이 나기도 한다.
쉽게 쓰려면 staged_predict() 를 스면 되는데 이 메소드는 훈련의 각 단계에서 앙상블에 의해 만들어진 예측기를 순회하는 반복자를 반환한다. 그리고 여러개의 트리로 GBRT 앙상블 훈련시키고 최적의 트리수를 찾기위해 각 훈련단계에서 val error 를 측정한다. 마지막에 최적의 트리수를 사용해 새로운 GBRT 앙상블을 훈련시키면 된다.
팁으로 warm_start=True 를 하면 fit() 할때 기존트리를 유지하고 룬련을 추가할수 있게 해준다.
GradientBoostingRegressor 는 트리훈련때 훈련샘플비율을 지정할수 있는데 subsample = 0.25 이런식으로 사용하면 된다. 0.25시 푠향은 높아지고 분산이 작아지는데 훈련속도가 높아진다. 이런 기법을 확률적 그레디언트 부스팅(stochastic gradient boosting) 이라고 한다.
7.6 스태킹
스태킹(stacking) 은 stacked generalization 의 줄임말이다. 얘는 앙상블에 속한 모든 예측기의 예측을 취합하는 간단한 함수를 사용하는 대신 취합하는 모델을 훈련시킬수 없을까라는 아이디에서 출발한다.
즉 마지막 예측기가 판단을 한번 더하는것. 이것을 블렌더(blender) 또는 메타 학습기(meta learner) 라고 한다.
일반적인 블랜더 학습기는 홀드 아웃(hold-out) 세트를 이용하는 것이다.
먼저 training set 을 두개의 subset 으로 나누고 첫 서브셋으로 훈련을 하고 두번째 서브셋에대한 예측을 만든다. 각 모델들은 3가지 다른 결과가 나올 것이다.
이제 그 나온결과들을 취합해 하나의 결과를 만들고 blender 는 그걸로 학습을 진행하게 된다.
블렌더를 하나만 쓰는것이 아니라 블렌더를 여러개를 쓰는것도 가능하다. (다른 종류의 모델로 랜덤 포리스트~회귀) 그러면 블렌더만의 레이어가 만들어지게 된다.
이것이 스태킹이다.
'공부 > 핸즈온 머신러닝' 카테고리의 다른 글
핸즈온 머신러닝 2 chap 9 비지도 학습 (0) | 2021.02.26 |
---|---|
핸즈온 머신러닝 2 chap 8 차원 축소 (1) | 2021.02.26 |
핸즈온 머신러닝 2 chap 6 decision tree (0) | 2021.02.24 |
SVM 추가 (0) | 2021.02.23 |
핸즈온 머신러닝 2 chap 5 SVM (0) | 2021.02.23 |