한 전문가의 의견보다 여러 사람의 종합된 의견이 더 나은 경우가 많다
= 하나의 좋은 예측기보다 보통 예측기 집단의 예측이 더 낫다
방법
👍 Bagging (Majority Voting / Bagging / Random forest)
👍 Boosting (AdaBoost, Gradient Boost)
👍 Stacking
앙상블을 통한 변동성 축소
분류기들의 오류가 각 샘플에 대해 다른 오류를 발생시키지만 옳은 분류에 대해서는
일반적으로 일치한다고 가정할 때, 앙상블의 분류기 출력을 Averaging 하는 것은 오류
요소들이 averaging out 되게 만들어 앙상블 모델 오류를 감소시킴
Soft Voting Classifier
확률의 평균에 의한 선택
➡ B 선택
Weak Learner와 Strong Learner
👍 각 분류기가 모두 weak learner이더라도 앙상블은 strong learner가 될 수 있음
🤷♀️ 큰 수의 법칙 때문
앞 면이 나올 확률이 51%인 동전을 1000번 던질 때, 앞 면이 과반일 확률 = 75%
10000번 던지면 97%
실험횟수가 무한히 증가할수록 표본 평균은 모집단 평균에 가까워짐
무작위로 훈련 데이터 셋을 잘게 나눈 후 나누어진 훈련 데이터 셋을 여러 개의 모델에 할당하여 학습 후, 각 샘플의 모델링을 통해 나온 예측 변수들을 결합해서 최종 모델 생성
ex) {1,2,3,1,2,1,1,1} (n = 8) 배깅하기
• {1,2,1,2,1,1,3} (n = 8); mean = 1.375
• {1,1,2,2,3,1,1} (n = 8); mean = 1.375
• {1,2,1,2,1,1,2} (n = 8); mean = 1.25
로 부트스트래핑 하기
그렇다면, 최종적으로 (1.375+1.375+1.25)/3 = ~1.3333
Bootstrapping 은 각 predictor 가 훈련하는 부분집합의 다양성을 증가시키므로 Bagging 이 Pasting 보다 Bias 가 약간 더 높아짐(predictor 들 간의 상관관계를 줄여줌) ⟹ 앙상블의 variance 를 줄여줌.
일반적으로 Pasting 보다 Bagging 의 결과가 더 나음.
✅ Bootstrap에서 평균적으로 63%의 사례만 추출되고 나머지 37%는 훈련에 사용되지 않고 남아 있게 됨
🤷♀️ m개의 샘플 중에서 무작위로 하나를 추출할 때 선택되지 않고 남아 있을을 확률은
따라서, m번 추출해도 선택되지 않을 확률은
✅ 별도의 validation set 또는 cross validation없이 oob 사례들로 앙상블을 평가할 수 있음
✅ 트레이닝 데이터를 선택하는 방법에 따라 다음과 같이 부르기도 한다.
다음 두개는 가용한 feature 들의 서로 다른 부분집합을 사용하여 다양성 확보하는 방법, Bias 는 약간 커지는 대신 variance 를 낮출 수 있음, 이미지 처럼 고차원 입력 데이터를 다룰 때 유용
✅ 배깅에서 Decision Tree를 사용할 때의 한계
Bagging (또는 Pasting) 방법을 적용한 Decision Tree 의 Ensemble
✔ bagging 테크닉이다 (not a boosting technique)
이렇게 계속 반복하여 여러 개의 결정 트리를 만들 수 있고, 결정 트리 하나마다 예측 값을 내놓을텐데 여러 결정 트리들이 내린 예측 값들 중 가장 많이 나온 값을 최종 예측값으로 정함. 바로, 다수결의 원칙에 따르는 것.
이렇게 의견을 통합하거나 여러 가지 결과를 합치는 방식을 앙상블(Ensemble)이라고 함
즉, 하나의 거대한 (깊이가 깊은) 결정 트리를 만드는 것이 아니라 여러 개의 작은 결정 트리를 만드는 것이고, 여러 개의 작은 결정 트리가 예측한 값들 중 가장 많은 값(분류일 경우) 혹은 평균값(회귀일 경우)을 최종 예측 값으로 정함. 문제를 풀 때도 한 명의 똑똑한 사람보다 100 명의 평범한 사람이 더 잘 푸는 원리
✅ Bias 는 약간 높아지지만 variance 는 낮아짐
Extremely Randomized Tree ensemble
여러 개의 weak learner를 결합하여 하나의 strong learner를 만들 수 있는 앙상블 방법
✔ Predictor들을 순차적으로 훈련시키되, 현재 predictor는 이전 predictor 의 잘못을 바로 잡으려고 하는 것이 특징(hypothesis boosting)
✔ AdaBoost(Adaptive) - Gradient(GBM) - XGboost - Light GBM 순으로 좋음
이전 예측기가 오분류한 사례들에 더 주의를 기울임으로써 이전 예측기를 바로 잡는 방법
1. 첫 번째 예측기가 오분류한 사례들의 상대적 가중치를 높이고 (boosting)
2. 두 번째 예측기는 1단계를 거친 후, 가중치가 높아진 사례들을 더 잘 분류할 수 있게 됨
3. 다시 두 번째 예측기가 오분류한 사례들의 상대적 가중치를 높이고
⁞
반복
단점
Bagging 이나 Pasting 처럼 병렬 처리에 의한 고속 처리를 할 수 없다.
알고리즘
SAMME
(Stagewise Additive Modeling using a Multiclass Exponential loss function)
- Scikit-Learn 에서 사용되는 AdaBoost 의 multiclass version 알고리즘
- Binary class 인 경우에는 AdaBoost 와 동일
- SAMME.R : SAMME의 변형으로서, Predictor 가 클래스 확률을 출력할 수 있는 경우(즉, predict_proba() 메소드) 사용할 수 있으며, SAMME 보다 결과가 더 좋다.
AdaBoostClassifier with Decision Stump
- Decision Stump
max_depth = 1 인 decision tree (한 개의 root node와 두 개의 leaf node)로서 AdaBoostClassifier의 base classifier (Regression 인 경우: AdaBoostRegressor)
AdaBoost 가 Overfitting 하는 경우
1. 맨 처음 가중치는 모두 1/8
2. Chest Pain과 Heart Disease 관계 모델
3. Blocked Arteries와 Heart Disease의 관계
4. Patient Weight와 Heart Disease의 관계
5. 그렇게 각 stump의 지니계수를 구해보니, Patient Weight가 Gini Index가 가장 작아, forest의 첫 stump로 지정
6. Amount of Say 구하기
최종 분류에 있어서 해당 Stump가 얼마만큼의 영향을 주는가
x축은 Total Error, y축은 Amount Of Say로, Total Error가 0이면(=정확성이 높으면) Amount of Say가 큼
이를테면, Weight에서 한개 틀렸으니까 Total Error는 1/8이라서
7. 잘못분류한 것에 대해서,
가중치를 위의 식처럼 높여줌
(이전 stump에서 잘못 분류된 sample의) New Sample Weight = (1/8) x e^(0.97) = (1/8) x 2.64 = 0.33 기존의 sample weight = 1/8 = 0.125였는데 이보다 더 높아진 것
8. 잘 분류한 것에 대해서,
amount of say에 - 부호만 붙이면 됨.
(이전 stump에서 잘 분류된 sample의) New Sample Weight = (1/8) e^(-0.97) = (1/8) 0.38 = 0.05. 기존의 weight인 0.125보다 더 작아진 것.
9. Weight의 합은 항상 1이어야 하므로, 정규화 시켜줌
10. 최종분류
이렇게 여러 차례 진행을 하면 각 Stump마다의 Amount of Say가 나옴. 왼쪽은 Heart Disease가 있다고 판단한 Stump이고, 오른쪽은 Heart Disease가 없다고 판단한 Stump
각 Stump의 Amount of Say를 더하면 Total Amount of Say가 나오고, 이 예시의 경우 Heart Disease가 있다는 것의 Total Amount of Say가 2.7로 더 크므로, 최종적으로 Heart Disease가 있다고 분류를 할 수 있음.
😒 Adaboost와 Gradient Boost 차이점
AdaBoost는 stump로 구성되어 있음. 하나의 stump에서 발생한 error가 다음 stump에 영향을 주고, ... 이런식으로 여러 stump가 순차적으로 연결되어 최종 결과를 도출함
반면, Gradient Boost는 stump나 tree가 아닌 하나의 leaf (single leaf)부터 시작
이 leaf는 타겟 값에 대한 초기 추정 값을 나타내고, 보통은 초기 추정 값을 평균으로 정함.
그 다음은 AdaBoost와 동일하게 이전 tree의 error는 다음 tree에 영향을 줌. 하지만 AdaBoost와 다르게 stump가 아닌, tree로 구성
보통은 leaf가 8개에서 32개되는 tree로 구성
🤔 Regression model (비용 함수: Sum of Squared Error)에서 최상의 결과는 residual sum 이 0 이 되는 것이다.
🤔 Residual 분포의 패턴을 안다면, 그 패턴을 이용해서 model 을 data 에 더 잘 fit 할 수 있지 않을까? 즉, 처음의 regression model 에다가 residual 들에 fit 시킨 별도의 model 을 더하면 더 정확한 예측이 될 것 같다.
tree 1을 통해 예측하고 남은 잔차를 tree2를 통해 예측하고, 이를 반복함으로서 점점 잔차를 줄여나감. 이 때, 각각의 모델 tree1,2,3 을약한 분류기 (weak learner), 이를 결합한 분류기를 강한 분류기 (strong learner)라고도 함
그래디언트 부스팅(Gradient Boosting)도 아다부스트 처럼 이전 예측기의 오차를 보정하도록 예측기를 순차적으로 추가하지만, 반복마다 샘플의 가중치를 수정하는게 아니라, 이전 예측기가 만든 잔여오차(residual error)에 새로운 예측기를 학습시킨다.
(88 + 76 + 56 + 73 + 77 + 57) / 6 = 71.2
따라서, single leaf로 몸무게를 예측한다면 모든 사람은 71.2kg이라고 할 것
1. 먼저 training set을 2개의 subset으로 나눈다. (hold-out-set)
2. subset1은 첫번째 레이어의 예측기들을 훈련시키는데 사용
3. 훈련된 첫번째 레이어의 예측기로 subset2에 대한 예측을 생성
(subset이지만 훈련에 사용이 안됐으므로 test셋처럼 사용 가능)
1. 세개의 예측값 생성
2. 타겟값(y)은 그대로 쓰고 앞에서 예측한 3개의 값(y_hat)을 입력 변수로 사용하는 새로운 훈련세트 생성
(즉, 새로운 훈련세트는 3차원이 된다)
3. 블렌더가 새로운 훈련 세트로 학습
(즉, 첫번째 레이어의 예측 3개를 이용해 y를 예측하도록 학습되는 것이다.)
Blender 들 만의 층을 따로 두는 방법
즉, subset1은 첫번째 레이어의 예측기들을 훈련시키고,
subset2로 첫번째 예측기들의 예측을 만들어 블렌더 레이어의 예측기를 위한 훈련세트를 생성하고,
subset3로 두번째 예측기들의 예측을 만들어 세번째 레이어를 훈련시키기 위한 훈련세트를 만드는데 사용된다.