앙상블 학습에는 크게 배깅(Bagging)과 부스팅(Boosting)이 있다.
Bagging은 Bootstrap Aggregation의 약자이다. 배깅은 샘플을 여러 번 뽑는 Bootstrap을 통해 각 모델을 학습시켜 결과물을 집계(Aggregation)하는 방법이다.
위의 그림처럼 데이터를 부트스트랩한 후 부트스트랩한 데이터로 모델을 학습시키고, 각 모델들의 결과를 집계하여 최종 결과값을 구한다.
이 때 각 Decision Tree 모델들의 결과 예측은 독립적으로 시행된다.
기존에 있는 표본에서 추가적으로 표본을 복원 추출하고 각 표본에 대한 통계량을 다시 측정하는 방식이다.
ex) 1억개의 모집단에서 200개의 표본을 추출했다고 가정하자.
=> 모수에서 균등하게 뽑은 표본의 분포 사이사이를 메워서 더 정확한 추정이 가능해진다.
R값이 클수록 신뢰구간의 추정이 더 정확해진다.
의사결정 트리라고도 하며, 분류(Classification)과 회귀(Regression) 모두 가능한 지도 학습 모델이다. 특정 기준이나 질문에 따라 데이터를 구분하는 모델을 결정 트리 모델이라고 한다.
위의 그림은 결정 트리 모델의 예시이다.O / X로 나뉘도록 설계되어 있다.
처음의 분류 기준이나 질문을 Root Node, 마지막 노드들을 Terminal Node 또는 Leaf Node라고 한다. 위의 예시에서는 '날개가 있나요?'가 Root Node, '매', '펭귄, '돌고래', '곰'이 Terminal Node라고 볼 수 있다.
이처럼 데이터를 가장 뚜렷하게 구분할 수 있는 기준으로 먼저 데이터를 분류해준다.
분류된 데이터들을 잘 나눌 수 있는 기준을 다시 세워준다. 이 과정을 반복한다.
지나치게 많이 할 경우 위 그림과 같이 Overfitting이 될 수 있다. 결정 트리에 아무 Parameter를 주지 않고 모델링할 경우에 Overfitting이 나타난다.
오버피팅을 줄이기 위한 전략이다. 오버피팅은 트리에 가지가 지나치게 많을 때 나타나기에 최대 깊이나 Terminal Node의 최대 개수 등을 제한하는 작업을 해주는 것이다.
결정트리는 다음 글에서 더 자세히 다루도록 하겠다.
배깅을 활용한 모델 -> 랜덤 포레스트
Boosting은 가중치를 활용하여 약 분류기와 강 분류기로 나누어주는 방법이다. Bagging과는 다르게 한 모델들의 예측이 다른 모델의 예측에 영향을 줄 수 있다.
하나의 모델이 예측을 하면 예측값에 따라 데이터에 가중치가 부여되고, 그 가중치가 다른 모델의 예측에 영향을 준다.
위의 그림의 살펴보자.
1. 중간보다 살짝 위에 가로선을 그어 데이터를 분류했다.
위에서 설명한 내용이 에이다 부스트에 관한 것이다. 각 weaker model을 순차적으로 적용하며 제대로 분류된 샘플은 가중치를 낮추고 잘못 분류된 샘플은 가중치를 높이는 방식이다.
각 weaker model을 순차적으로 적용하며 잘못 분류된 샘플의 에러를 optimization하는 방식이다.
Bagging은 각 모델들이 독립적이어서 병렬로 학습이 되지만 Boosting은 모델들의 학습이 다른 모델에 영향을 주기에 순차적으로 학습된다. 오답에는 높은 가중치, 정답에는 낮은 가중치를 주는 것이다.
Boosting이 Bagging에 비해 에러가 적고, 성능이 뛰어나다. 그러나 속도가 느려 시간이 오래 걸리고, 오버피팅이 될 수 있다.
=> 상황에 맞게 선택해서 쓰도록 한다.
(성능문제->Boosting, 오버피팅문제-> Bagging)
Bagging은 모델의 bias를 유지하고 variance를 줄여준다.
class sklearn.ensemble.VotingClassifier(estimators, *, voting='hard', weights=None,
n_jobs=None, flatten_transform=True, verbose=False)
배깅의 파라미터와 코드는 아래의 링크를 참고하라.
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html
class sklearn.ensemble.AdaBoostClassifier(base_estimator=None, *,
n_estimators=50, learning_rate=1.0, algorithm='SAMME.R', random_state=None)
class sklearn.ensemble.GradientBoostingClassifier(*, loss='deviance',
learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse',
]min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None,
random_state=None, max_features=None, verbose=0, max_leaf_nodes=None,
warm_start=False, presort='deprecated', validation_fraction=0.1,
n_iter_no_change=None, tol=0.0001, ccp_alpha=0.0)
이전 knn실습에 추가로 진행했다. 그러나 데이터가 워낙 적어서 정확도는 대부분 같게 나왔다.