앙상블
여러개의 알고리즘을 사용하여, 그 예측을 결합함으로써 보다 정확한 예측을 도출하는 기법
단일의 강력한 알고리즘보다 복수의 약한 알고리즘이 더 뛰어날수 있다는 생각에 기반을 두고 있음
보팅(Voting), 배깅(Bagging), 부스팅(Boosting)등의 유형으로 나눌 수 있음
보팅(Voting)
여러 모델에서 구해진 예측값을 투표를 통하여 결정하는 방식
서로 다른 알고리즘 여러개를 결합하셔 사용
하드 보팅(Hard Voting)
다수의 분류기가 예측한 결과값을 최종 결과로 선정(다수결 원칙과 유사)
소프트 보팅(Soft Voting)
각 알고리즘이 예측한 레이블 값 결정 확률의 평균을 구한 뒤 가장 확률이 높은 레이블 값을 최종 결과로 선정
위 그림에서 레이블값 예측의 평균
1일 확률 = (0.7+0.2+0.8+0.9)/4 = 0.65
2일 확률 = (0.3+0.8+0.2+0.1)/4 = 0.35
배깅(Bagging)
Bootstrap Aggregating의 약자
각각의 샘플(Bootstrap)을 여러 번 뽑아 각 모델을 학습시켜 결과를 집계(Aggregating)하는 방법
모두 같은 유형의 알고리즘을 사용
배깅의 대표적인 방식이 랜덤 포레스트(Random Forest)
Bootstrap
복원추출을 통해 원래 데이터의 수만큼 크기를 같도록 하는 샘플링 방법
하나의 모델에 대하여 데이터를 추출할 경우 중복된 데이터가 있을 수 있다.
# 복원추출 - 추출한 데이터를 다시 모집단에 복원해 추출하는 것
부스팅(Boosting)
여러개의 약한 학습기(weak learner)를 순차적으로 학습, 예측하면서 잘못 예측한 데이터에 가중치를 부여해 오류를 개선하는 학습 방식
대표적인 부스팅 알고리즘으로는 AdaBoost, GBM, XGBoost, LightGBM, CatBoost이 있음.
AdaBoost(에이다부스트)
Adaptive Boost의 줄임말
속도나 성능적인 측면에서 decision tree를 약한 학습기로 사용함.
+를 파란색, -를 빨간색 영역으로 분류한다고 가정했을때 Box에서 오른쪽에 있는 +는 제대로 분류되지 않았기 때문에 가중치를 키워(크기를 늘려) 다음 약한 학습기가 더 잘 분류할 수 있도록 진행한다.
이전의 학습기를 모두 결합한 예측을 하여 정확도가 높아지는 것을 알 수 있다.
Bagging VS Boosting
배깅은 병렬로 학습, 부스팅은 순차적으로 학습.
한번 학습이 끝나고 결과에 따라 가중치를 부여하고, 가중치가 다음 모델의 결과 예측에 영향을 줌.
부스팅은 배깅에 비해 error가 적음. 즉, 성능이 더 좋음. 하지만 순차적으로 학습하기때문에 속도가 느린 단점이 있음
보팅 분류기(Voting Classifier)
1. Voting, KNN, 로지스틱 회귀, 데이터셋 등의 모듈을 불러온다.
from sklearn.ensemble import VotingClassifier #Voting
from sklearn.linear_model import LogisticRegression #로지스틱 회귀
from sklearn.neighbors import KNeighborsClassifier #KNN
from sklearn.datasets import load_breast_cancer #유방암 데이터
from sklearn.model_selection import train_test_split #테스트셋, 트레이닝셋 분리
from warnings import filterwarnings #에러 삭제
filterwarnings('ignore')
cancer = load_breast_cancer()
logistic_regression = LogisticRegression() #로지스틱
knn = KNeighborsClassifier(n_neighbors=13) #인접 원소 개수 13
2. 개별 모델을 소프트 보팅 기반의 모델로 구현한다.
voting_model = VotingClassifier(
estimators=[ ('LogisticRegression', logistic_regression), ('KNN', knn)], voting='soft')
3. 각각의 모델을 학습시키고 그 결과를 비교한다.
logistic_regression.fit(X_train, y_train)
knn.fit(X_train, y_train)
svm.fit(X_train, y_train)
voting_model.fit(X_train, y_train)
print("로지스틱 : {}".format(logistic_regression.score(X_test, y_test)))
print("KNN : {}".format(knn.score(X_test, y_test)))
print("Voting : {}".format(voting_model.score(X_test, y_test)))
--출력--
로지스틱 : 0.8947368421052632
KNN : 0.9210526315789473
Voting : 0.9473684210526315
로지스틱, KNN의 결과에 비하여 Voting모델의 결과가 조금더 정확한 것을 알 수 있다.(항상 그런것은 아니다.)
AdaBoost
1. AdaBoost, 데이터셋 등의 모듈을 불러온다.
from sklearn.ensemble import AdaBoostClassifier #AdaBoost
from sklearn import datasets #데이터 셋
from sklearn.model_selection import train_test_split
2. 데이터를 할당하고 트레이닝셋과 테스트 셋으로 나눈다.
iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
3. AdaBoostClassifier으로 모델의 개수(n_estimators)와 learning rate를 설정한다.
AdaBoost = AdaBoostClassifier(n_estimators=50, learning_rate=0.01) #n_estimators = 모델의 개수
4. fit()으로 학습시킨후 정확도를 출력해본다.
model = AdaBoost.fit(X_train, y_train)
print(model.score(X_test, y_test))
--출력--
0.9333333333333333
0.93으로 꽤 정확한 것을 알 수 있다.
##예제코드##
'Emotion > 인공지능 기초' 카테고리의 다른 글
Opencv 얼굴 인식(영상) (0) | 2020.11.27 |
---|---|
Opencv 얼굴 인식(사진) (0) | 2020.11.27 |
로지스틱 회귀(Logistic Regression) (0) | 2020.09.29 |
SVM(Support Vector Machine) 알고리즘 (0) | 2020.09.24 |
선형회귀(linear regression) (0) | 2020.09.24 |