Machine Learning/파이썬_데이터사이언스

7. Ensembles [파이썬으로 배우는 데이터 사이언스]

Minwoo 2020. 2. 6.

Data-Learning.tistory.com - 머신러닝 오픈소스 무료 강좌


 

 

 

 

Ensembles

 


앙상블:
다양한 모델들을 합쳐 하나의 모델을 만드는 것. 

 

 

 

Contents: 

1. Bagging(Bootstrap Aggregating) 

2. Boosting 

3. Stacking 

4. Voting 

 

 

 

 


 

 1. Bagging(Bootstrap Aggregating) 

 

  • 모델을 일반화 한다. (high variance -> low variance) 
  • 서로 다른 트레이닝 데이터의 subsamples로 많은 수의 모델들을 만드는 것. 
  • 이러한 subsamples 로부터 분산을 줄여 모델의 Variance를 줄인다. 
  • random sampling. (데이터를 샘플링 할 때, 중복을 허용한다) 
  • 병렬적으로 random sampling된 데이터들을 학습 한다. 
  • overfitting(low bias, high variance) 모델들에 대하여 적합하다. 
  • 모델들을 합칠 때, 카테고리 데이터인 경우 "Voting" / 연속적인 데이터인 경우 "Average". 

 

#Bagged Decision Trees 

from sklearn.model_selection import KFold, cross_val_score 
from sklearn.ensemble import BaggingClassifier 
from sklearn.tree import DecisionTreeClassifier 
 
kfold=KFold(n_splits=10, random_state=6) 
cart=DecisionTreeClassifier() 
model=BagginingClassifier(base_estimator=cart, n_estimators=100, random_state=6) 
results=cross_val_score(model, X, y, cv=kfold) 
print(results.mean()) 

 

 

  • Random Forest 

· 각각의 classifiers 사이에 correlation을 줄이며 트리를 만든다. 

· split 과정에서 랜덤한 features subset이 고려된다. (not a greedily choose for best split) 

 

from sklearn.model_selection import KFold, cross_val_score 
from sklearn.ensemble import RandomForestClassifier 

kfold=KFold(n_splits=10, random_state=6) 
model=RandomForestClassifier(n_estimators=100, max_features=3) 
results=cross_val_score(model, X, y, cv=kfold) 
print(results.mean()) 

 

 

  • Extra Trees 

· 트레이닝 데이터셋의 샘플 들로부터 랜덤 트리들이 만들어진다. 

 

from sklearn.model_selection import KFold, cross_val_score 
from sklearn.ensemble import ExtraTreesClassifier 

kfold=KFold(n_splits=10, random_state=6) 
model=ExtraTreesClassifier(n_estimators=100, max_features=3) 
results=cross_val_score(model, X, y, cv=kfold) 
print(results.mean()) 

 

 


 

2. Boosting 

 

  • 어려운 문제를 푸는데 좋다. (정확도가 높게 나오지만 새로운 데이터에 취약하다) 

 

  • 순차적으로 weak leaners을 학습하여 모델을 만든다. 각각의 weak learner들에 대하여 그 이전의 잘못 예측한 데이터들에 대하여 가중치를 주어 학습한다. 그 이후 최종 모델이 만들어지면 결과에 따라서 가중치를 재분배 한다.  

 

ex) 

· 먼저 weak leaner 1번 으로 전체 데이터를 학습시킨다. 

· 1번에서 에러가 큰 데이터에 대하여 weak learner 2 번으로 학습시킨다. 

· 이렇게 쭉 반복하여 순차적으로 weak learner들을 학습시킨다. 

 

 

  • 순차적인 특성에 의해 bagging에 비해 속도가 많이 느리다.  
  • 가중치를 선형 결합하고 데이터가 많을 때 좋다. 

 

#AdaBoost 

from sklearn.model_selection import KFold, cross_val_score 
from sklearn.ensemble import AdaBoostClassifier 

kfold=KFold(n_splits=10, random_state=6) 
model=AdaBoostClassifier(n_estimators=100, random_state=6) 
results=cross_val_score(model, X, y, cv=kfold) 
print(results.mean()) 

 

 

#Stochastic Gradient Boosting 

from sklearn.model_selection import KFold, cross_val_score 
from sklearn.ensemble import GradientBoostingClassifier 

kfold=KFold(n_splits=10, random_state=6) 
model=GradientBoostingClassifier(n_estimators=100, random_state=6) 
results=cross_val_score(model, X, y, cv=kfold) 
print(results.mean()) 

 

 

#XGBoost 

CART 개념도입, 각 tree와 lead에 CART를 넣고 lead 별로 점수를 주고 이를 이용해 학습. 

 

 

 

 


 

3. Stacking 

 

 

 

  •  서로 다른 모델들을 합쳐서 새로운 모델을 만드는 것.(Bagging / Boosting은 동일 한 모델을 subsampling 을 통한 방법으로 합쳤었다.) 
  • 많은 computation이 필요하다.(오래 걸린다) 
  • StackNet: Stacking을 Neural Network 방식으로 여러 Layer로 구성한 방법이다. 

 

스태킹(stacking)의 과정: 

 

1) 트레이닝 데이터에서 샘플링을 통해 subset-1을 만들고,  이걸로 각 모델을 학습시킨다. 

2) subset-2로 a에서 만들어진 모델들을 예측하고 각각의 예측 값을 합친다. 

3) 위에서 만들어진 예측 값의 합을 input으로 하는 최종적인 모델(meta learner)을 학습시킨다. 

 

 

 

 


 

3. Voting 

 

  • 서로 다른 알고리즘의 모델들을 간단한 통계학(평균)을 사용하여 예측 값을 합치는 것. 
  • 여러개 M.L 알고리즘 모델 학습 → 새로운 데이터에 모델 예측 값을 가지고 
  • 다수결 투표("hard voting")를 통해 최종 클래스 예측. 
  • 앙상블 기법에서 독립적인 모델을 만들어 주기 위해서 다른 M.C 알고리즘으로 학습시키는 것이 좋다. (모델별로 서로 다른 종류의 오차를 가짐으로 상관관계가 작아지기 때문) 

· voting='hard'인 경우, 각 classifier의 "레이블"을 가지고 voting. 

· voting='soft'인 경우, 각 classifier의 "확률"을 가지고 평균이 가장 높은 클래스를 최종 ensemble 예측. 

 

from sklearn.model_selection import KFold, cross_val_score 
from sklearn.svm import SVC 
from sklearn.tree import DecisionTreeClassifier 
from sklearn.linear_model import LogisticRegression 

kfold=KFold(n_splits=10, random_state=6) 
estimators=[] 
model1=LogisticClassifier(solver='liblinear') 
model2=DecisionTreeClassifier() 
model3=SVC(gamma='auto') 
estimators.append( ('logistic',model1) ) 
estimators.append( ('cart',model2) ) 
estimators.append( ('svm',model3) ) 

ensemble=VotingClassifier(estimators) 
results=cross_val_score(ensemble, X, y, cv=kfold) 
print(results.mean()) 

 

 


 

밑바닥부터 시작하는 데이터 러닝

데이터 사이언스, 머신 러닝 오픈소스 무료 강좌.

data-learning.tistory.com

* 해당 게시물은 첫번째 배너 및 출처를 첨부하면 상업적 용도를 제외하고 사용하실수 있습니다.

 

 

 

댓글