- [핸즈온머신러닝] 앙상블(Ensemble) 학습 (1) [보팅 ~ 랜덤 포레스트]2022년 11월 29일
- Cat_Code
- 작성자
- 2022.11.29.오후08:22
목차
- 앙상블 기법이란?
- 앙상블 기법의 종류
- 보팅
- 배깅, 페이스팅
- 랜덤 포레스트
- 부스팅
- 스태킹
1. 앙상블 기법이란?
여러개의 학습 모델(분류, 회귀 ...) 을 학습하여 학습된 각 모델에서 예측을 만들어 낸 후
그 예측들을 결합하여 보다 정확도가 높은 예측을 만들어 내는 기법이다
이러한 앙상블기법에는 보팅 (하드, 소프트), 배깅, 페이스팅, 부스팅 등 다양한 기법들이 존재하고 있
2. 앙상블 기법의 종류
2.1 Voting 보팅 (투표 기반 분류기)
보팅 보팅은 말 그대로 같은 데이터셋을 통해서 각 모델들을 학습시키고 이들의 예측을 투표를 통해서 최적의 예측으로 만들어 내는 방법으로 하드 보팅과 소프트 보팅이 있다.
2.1.1 하드 보팅(Hard voting)과 소프트 보팅(Soft voting)
하드 보팅 Hard Voting : 각 모델 예측 결과를 단순 다수결로 결정하여 최적의 예측을 만드는 앙상블 기법
소프트 보팅 Soft Voting : 각 모델의 예측 확률을 평균하여 최적의 예측을 만드는 앙상블 기법
쉽게 설명하자면 하드 보팅은 단순 다수결로 결과를 결정하고 소프트 보팅은 각 모델의 확률을 평균하여 결과를 결정한다
*일반적으로 소프트보팅이 하드 보팅보다 조금 더 높은 정확성을 내는 반면 학습 시간이 조금 더 걸린다
2.1.2 코드
import pandas as pd from sklearn.ensemble import VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier #각 모델들 정의 lr_clf = LogisticRegression(solver='liblinear') knn_clf = KNeighborsClassifier(n_neighbors=8) #VotingClassifier정의 및 사용할 모델과 voting 방법 입력 v_clf = VotingClassifier(estimators = [('LR', lr_clf), ('KNN', knn_clf)], voting = 'soft') #학습 v_clf.fit(X_train, y_train) #예측 pred = v_clf.predict(X_test)
보팅은 sklearn의 VotingClassifier를 사용하면 되고
하드보팅과 소프트보팅은 파라미터에 voting ='soft' or ' hard'로 설정해주면 된다
2.2 배깅(Bagging)과 페이스팅(Pasting)
배깅 앞에서 살펴본 보팅은 똑같은 데이터셋을 활용하여 각 모델들을 학습시켰다.
그러나 이는 모델의 과적합을 만들어 낼 가능성을 높인다
따라서 Bootstrap Aggregating의 약자인 배깅은 각 모델마다 다른 데이터 셋을 활용하여 학습을 하는데
이때 훈련 데이터 셋에서 샘플링을 하여 각 데이터셋을 구성해준다
여기서 각 샘플링에 중복을 허용하면 배깅 (복원추출이다)이고 각 샘플링에 중복을 허용하지 않으면 페이스팅이다
배깅은 '분류'일 때 통계적 최빈값(가장 많이 예측한 결과)을 활용하여 최종 결과를 만들어 내고
'회귀'일 경우 평균을 계산하여 최종 결과를 만들어낸다
2.2.1 oob 평가
배깅을 활용하면 어떤 샘플은 한 모델에서 여러 번 사용될 수 있고 어떤 것은 전혀 선택되지 않을 수 있다
즉, 선택받지 못하는 훈련 데이터들이 존재하게 되는데 이를 oob (out-of-bag)샘플이라고 한다
이들을 활용하지 않는다면 오히려 데이터적으로 손해이다
또한 이들을 활용할 수 있다면 굳이 별도의 validation 데이터 셋을 구성할 필요가 없다
따라서 배깅에서 평가할 때 oob 샘플을 활용하는 것이 좋다
oob 평가는 각 모델의 평균으로 만들어 진다
2.2.2 코드
import pandas as pd from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier #BaggingClassifier정의 및 사용할 모델과 oob평가 설정 b_clf = BaggingClassifier( DecisionTreeClassifier(), n_estimators = 500, boostrap =True, n_jobs = -1, oob_score=True) #학습 b_clf.fit(X_train, y_train) #예측 pred = v_clf.predict(X_test)
배깅은 sklearn의 BaggingClassifier를 활용하면된다
여기서 중복 추출을 허용할 거면 boostrap = True로 하고 (배깅) 허용하지 않을 거면 False(페이스팅)로 하면된다
똫나 oob평가 활용 여부는 'oob_score' 파라미터로 설정하면 된다
2.3 랜덤 포레스트(Random Forest)
배깅의 일종으로 사실 배깅안에 포함되는 모델
배깅과 랜덤 포레스트의 차이점은 ? : 랜덤 포레스트는 데이터 셋 뿐만 아니라 '설명 변수'도 무작위로 뽑아서 학습
높은 성능을 내는 모델로 많이 사용되고 있다
장점 :
랜덤 포레스트는 설명변수를 무작위로 추출하여 사용하기 때문에 각 모델의 상관관계를 줄 일 수 있다
즉, 모델의 과적합을 방지할 수 있음
또한 모델의 학습속도가 빠르고 높은 정확성을 낼 수 있다
단점 :
하지만 전형적인 '블랙박스'모델 이기 때문에 해석이 불가능함 즉, 결과의 도달 방법을 해석하기 매우 어려움
2.3.1 코드
import pandas as pd from sklearn.ensemble import RandomForestClassifier #모델정의 rfc = RandomForestClassifier(random_state=0) #학습 rfc.fit(X_train, y_train) #예측 y_pred = rfc.predict(X_test)
랜덤 포레스트는 sklearn의 RandomForestClassifier를 이용하면 된다
'[ML] > 머신러닝 💕' 카테고리의 다른 글
[Deep한 머신러닝] Boosting 부스팅 3편 (GradientBoost Classification) (0) 2022.12.13 [Deep한 머신러닝] Boosting 부스팅 2편(GradientBoosting Regression) (0) 2022.12.12 [Deep한 머신 러닝] Boosting 부스팅 1편(Ada boosting) (2) 2022.12.09 [핸즈온머신러닝] 앙상블(Ensemble) 학습 (2) [부스팅 ~ 스태킹] (0) 2022.11.30 다음글이전글이전 글이 없습니다.댓글