저번시간에는 서포트 벡터 머신을 활용한 회귀에 대해 알아보았다.
이번시간에는 앙상블 학습이 무엇이며 왜 사용하는지, 그리고 사용은 어떻게 하는지 알아볼 예정이다.
앙상블 학습이란?
앙상블 학습이란 여러 개의 모델들이 예측을 하여 예측들을 가지고 최적의 결과를 뽑아내는 것을 앙상블 학습이라고 한다.
이러한 앙상블 학습에는 투표방식, 배깅과 페이스팅, 부스팅, 그리고 스태킹 등의 여러 방식이 존재한다.
한번 천천히 알아보도록하자.
투표방식
투표방식은 아래처럼 여러 예측기를 사용해 나온 예측(클래스) 중 가장 많이 나온 예측을 그 결과로 삼는 것이다.
이렇게 예측(클래스)을 다수결 투표로 정하는 것을 직접 투표(hard voting)라고 한다.
하드 보팅의 동작 방식을 아래 [그림 1]과 함께 살펴보도록 하자.
각각의 분류기들이 3,2,3,3의 예측을 내놓으며 가장 많은 예측인 3을 결과로 삼는 것을 볼 수가 있다.
혹은 클래스의 확률이 계산 가능한 경우, 나온 예측 값(클래스)이 아니라 각 클래스의 확률을 평균 내어 클래스를 예측할 수도 있다.
이를 간접 투표(soft voting)이라고 한다. 각 클래스의 확률들을 사용하므로 직접투표보다는 성능이 좋다.
소프트 보팅의 동작 방식을 [그림 2]와 함께 살펴보도록 하자.
각 분류기들의 예측은 3,2,3,3으로 3이 제일 많지만 각 클래스별 확률 평균 내어 살펴보면 2가 가장 높은 확률을 가지며 이를 결과로 삼는 모습을 볼 수가 있다.
투표방식 앙상블 사용방법
사이킷런에서는 투표방식의 앙상블을 쉽게 사용할 수 있도록 VotingClassifier()을 제공한다.
투표 방식의 앙상블 분류기를 사용하고자 한다면 sklearn.ensemble.VotingClassifier()를 사용해 모델을 만들고 학습을 하면 된다.
사용 방법은 미리 사용할 분류 모델들을 만들고 모델들을 VotingClassifier()의 estimators 파라미터에 넣어주면 된다.
sklearn.ensemble.VotingClassifier() 파라미터
estimators | 사용할 모델을 입력하는 곳이다. [('별칭1',모델 이름1), ('별칭2',모델 이름2), ....] 꼴의 튜플을 원소로가진 리스트로 넣어주면 된다. |
voting | hard/soft 방식을 결정. 기본값은 'hard'. (단, soft 방식을 사용할 경우, 각 모델들이 클래스별 확률을 예측할 수 있어야한다.) |
from sklearn.datasets import make_moons
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#훈련 데이터세트 만들기 및 훈련/테스트 데이터 분할
X,y = make_moons(n_samples= 1000, noise = 0.2,random_state=2021)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2, shuffle=True, random_state=2021)
#사용할 분류기들(앙상블) 만들기
model_svc = SVC(kernel='linear',probability=True,random_state=2021)
model_randforest = RandomForestClassifier(random_state=2021)
model_logistic = LogisticRegression(random_state=2021)
#하드 보팅 방식의 앙상블 학습
model_voting = VotingClassifier(estimators=[('svc',model_svc),('randomforest',model_randforest),('logistsic',model_logistic)],voting="hard")
model_voting.fit(X_train,y_train)
#소프트 보팅 방식의 앙상블 학습
model_voting2 = VotingClassifier(estimators=[('svc',model_svc),('randomforest',model_randforest),('logistsic',model_logistic)],voting="soft")
model_voting2.fit(X_train,y_train)
#각 모델 및 하드 보팅 방식의 앙상블 학습의 정확도 비교
print("========================하드 보팅==========================")
for model in (model_svc,model_randforest,model_logistic,model_voting):
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
print(model.__class__.__name__,accuracy_score(y_test,y_pred))
print("\n========================소프트 보팅==========================")
#각 모델 및 소프트 보팅 방식의 앙상블 학습의 정확도 비교
for model in (model_svc,model_randforest,model_logistic,model_voting2):
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
print(model.__class__.__name__,accuracy_score(y_test,y_pred))
위 코드 실행결과, 아래[그림 3]과 같이 소프트 보팅 방식이 정확도가 더 높게 나오는 것을 확인이 가능하다.
이번 시간에는 투표 방식의 앙상블의 개념과 사용방법을 알아보는 시간을 가졌었다.
배깅과 페이스팅, 부스팅, 그리고 스태킹 등에 관해서는 다음시간에 자세히 알아보도록 하자.
참조
Geron Aurelien, 박해선 역, 핸즈온 머신러닝, 한빛미디어, 2020
https://stackoverflow.com/questions/57882219/how-to-use-predict-proba-at-svm-sentiment-analysis
How to use predict_proba at SVM Sentiment Analysis
I applied predict_proba on classfication problem. I have some experience with building classification models in R but it's my first time with Python's sklearn. So the the problem is: In sklearn af...
stackoverflow.com
'수업내용정리 > 인공지능' 카테고리의 다른 글
[SckitLearn]앙상블 학습의 개념과 사용법(3)_랜덤포레스트 (0) | 2023.02.22 |
---|---|
[SckitLearn]앙상블 학습의 개념과 사용법(2)_배깅, 페이스팅 방식 (0) | 2023.02.18 |
[SckitLearn]지도학습 알고리즘(4)_SVM 회귀의 특징과 사용법 (0) | 2023.02.15 |
[SckitLearn]지도학습 알고리즘(3)_비선형 SVM 분류기의 특징과 사용법 (0) | 2023.02.14 |
[SckitLearn]지도학습 알고리즘(2)_선형 SVM 분류기의 특징과 사용법 (0) | 2023.02.13 |