앙상블 기법: 학습 알고리즘 여러개를 함께 사용해서 더 나은 예측 성능을 얻는 방법
종류: 배깅, 랜덤포레스트, 부스팅, 스태킹, 혼합모형(Mixture of experts and hierarchical mixture of experts), Bayesian methods
배깅: tree를 parallel하게 합함. 과적합이 잘 안 돼서 막 쓰기에 좋음. 가지치기(pruning)할 필요도 없음.
부스팅: tree를 sequential하게 모아줌 (성능이 안 좋은 것을 모아서 가중치를 높여 훈련). 좋을 땐 랜덤포레스트보다 성능이 훨씬 좋음. 반면 단점은 과적합 가능성이 높은 편
배깅은 tree기반 모형이긴 하지만 사용 모형이 꼭 tree가 아니어도 됨.
기본적으로 tree기반 모형의 특징이 모형의 분산이 크고 예측 정확도가 높지 않지만 해석력이 좋음.
배깅은 이러한 tree들을 여러개 만드는데 각 트리에 부트스트랩 샘플 B개를 집어넣어서 B개의 모형을 구하고 이를 평균낸 모형을 쓰는데, 그렇게 하면 Bias는 하나의 트리 모형에서의 편향과 똑같이 유지되면서, B개의 부트스트랩 샘플을 평균낸 덕에 모형의 분산은 줄어들어서 MSE가 작아지는 효과가 있음.
그 B개 모형의 평균의 분산은 B라는 부트스트랩 횟수가 많을수록, 모형 간의 상관관계가 낮을수록, 작아짐.
위에서 설명한 것은 회귀문제인 경우니까 B개 샘플로 평균을 낸 것이고, 분류문제에서는 평균을 내는 것이 아니라 Majority Vote 혹은 클래스에 따른 사후확률을 평균내어 사용함.
B개의 tree는 그 수가 아무리 많아져도 과적합이 되지 않는데 그 이유는 평균을 내기 때문임. 또한 가지치기도 필요가 없음.
tree 모델 하나만 썼을 때의 장점인 해석력이 배깅에서는 사라지게 되는데 왜냐면 여러 개의 트리를 쓰게 되면서 첫번째 중요한 변수로 꼽는 가지가 모형마다 다른데 이를 알아낼 방법이 없어지기 때문에 해석이 어려움.
배깅은 Boostrap Aggregation의 약자로 BAGGing을 쓰는 것임.
배깅은 부트스트랩 샘플을 쓰는데 부트스트랩 샘플의 특징이 n개의 표본에서 replacement를 허용하여 샘플을 n개 뽑는 것임. 이 경우 각 부트스트랩 샘플에는 전체 샘플 n개 중에서 보통 2/3 샘플만 재추출되고, 1/3에 해당하는 샘플은 추출되지 않음 (확률적으로 계산해보면 (n-1)^n / n^n이 n이 무한대로 수렴해가면서 1/3으로 계산됨). 그래서 이 부트스트랩 샘플 안에 사용되지 않은 표본들을 활용해서 validation set으로 활용하는 방법을 Out-of-Bag Error Estimation이라고 함.
랜덤포레스트는, 부트스트랩 샘플 B개를 써서 B개의 모형을 만들고 평균을 낸 것의 분산을 구할 때 B가 클수록, 상관관계가 작을수록 그 분산이 작아진다고 했는데, 상관관계를 낮추는 방법으로 고안된 것임.
배깅은 트리의 predictor로 같은 것을 사용하되 샘플만 다르게 사용한 것이어서 모형이 서로 비슷비슷한 경향이 있음.
하지만 랜덤포레스트는 predictor를 전체를 쓰지 않고, 몇개만 꼽아서 그것을 이용해 각각의 트리를 만들게 하고, 그런 트리를 B개 만드는 것. 여기서 몇개만 꼽은 predictor 개수를 하이퍼파라미터 mtry로 지정함. (Decorrelating the trees)
이렇게 만든 B개의 트리는 서로 다른 predictor를 써서 만든 트리이므로 트리 모형 자체가 서로 다른 모형이 되고 모형 간의 상관관계가 낮아짐.
이때문에 하나의 트리만 보면 예측 성능이 떨어질 수 있는데 이를 B개의 트리로 확장하여 평균을 내기 때문에 그 성능은 배깅보다 거의 대부분의 경우 좋게 나타남.
하이퍼파라미터 mtry는 보통 전체 predictor 개수에 제곱근을 씌운 값으로 지정하는 것이 가장 최적이라고 말함. 만일 mtry = p로 설정하면 이렇게 만들어진 랜덤포레스트 모형은 배깅과 같음. 그래서 배깅이 랜덤포레스트 안에 포함되어 있다고들 표현함.
이렇게 트리를 모아서 만든 모형은 기존 트리보다 해석력이 떨어지는데, 이를 보완할 겸해서 변수중요도라는 것을 확인함.
변수중요도를 구하는 방법으로 대표적인 두가지가 있는데 첫째는 OOB Permutation 방법이 있고, 둘째는 MSE를 가장 많이 줄이는 변수나, Gini Index를 가장 많이 줄이는 변수를 찾는 방법이 있음.
배깅이나 랜덤포레스트에 사용한 모든 트리에서 각 predictor가 빠졌을때 Gini Index 혹은 MSE의 변화량을 확인해서 가장 그 차이가 큰 것이 중요한 변수라고 할 수 있겠음.
OOB Permutatiojn은 먼저 각 트리에서 Out-of-Bag error를 구해놓고난 다음, predictor j를 변경하고(permute) 나머지 predictor만 사용해서 OOB error를 다시 계산하여 비교하여 변수중요도를 판단함.
랜덤포레스트를 지원하는 패키지로 R에서는 'randomforest' 패키지가 있으며 randomforest(Y ~ ., data = data, mtry = sqrt(p), importance = T)와 같은 식으로 적합 가능.
여기서 옵션 importance는 변수중요도도 확인하는 옵션
변수중요도를 확인하는 함수는 varImpPlot(fit)임
caret의 train함수로도 학습이 가능한데, method = 'rf'로 두면 되고, 랜덤포레스트에서는 preProcess 옵션을 안 써도 되는데 왜냐하면 트리 기반이다보니 굳이 표준화가 필요없고, 데이터의 순서가 바뀌지 않는 전처리는 영향이 없음. nzv도 필요없는게 애초에 분산이 0이면 고려가 되지 않아서 알아서 빼고 진행함. 이런 연유로 랜덤포레스트가 막 쓰기에 좋고 베이스라인으로 자주 사용되는 것.
참고로, train함수에 tuneLength를 지정하고자 할 때 표본크기가 클수락 크게 지정해야하고 작을수록 작게 지정해야함.
부스팅도 짧게 하고 끝났는데, 간단하게 말하면 부스팅은 잘 학습되지 않은 (잘못 예측된) 데이터포인트들에 가중치를 크게 줘서 해당 포인트들 위주로 학습이 되도록 유도하고 그 때 또 잘 학습되지 않은 포인트를 모아서 가중치를 크게 주고 그 위주로 학습을 진행하고... 이를 반복하여 여러 모형을 만들고 이를 한번에 고려함.
부스팅의 이러한 학습 알고리즘 덕에 성능이 엄청 좋아지는데, 과적합도 엄청 잘 됨.
'언어 > 참고' 카테고리의 다른 글
11/24 데이터 마이닝 정리 (서포트 벡터 머신) (0) | 2022.11.24 |
---|---|
11/17 데이터마이닝 (부스팅, 스태킹) (0) | 2022.11.17 |
11/03 데이터 마이닝 간단히 정리 (Imbalanced data) (0) | 2022.11.03 |
[참고] 사용자 계정 컨트롤 창 끄기 (0) | 2020.08.22 |
[참고] '관리자 권한으로 실행' 자동 실행 (0) | 2020.08.22 |