- 하나의 모델만을 학습시켜 사용하지 않고 여러 모델을 학습시켜 결합하는 방식으로 문제를 해결하는 방식
- 하나의 데이터 셋에 대해 여러 모델들이 서로 다른 부분들을 학습하며 데이터의 서로 다른 패턴을 학습한 후 모든 모델들의 결과 중 확률적으로 높은 결과를 선택
- 과적합을 막고 일반화 성능을 향상
- 방식
- Bagging
- 같은 유형의 알고리즘을 각각 다른 데이터를 이용해 학습
- Voting
- 서로 다른 종류의 알고리즘들을 결합
- 참고 : https://velog.io/@sung-ik-je/Voting-of-Ensemble-Scikit-Learn
- Boosting
- 약한 학습기(Weak Learner)들을 결합해서 오류를 줄이는 방향으로 학습해 정확하고 강력한 학습기(Strong Learner) 생성
- 단순하고 약한 학습기(Weak Learner)들를 결합해서 보다 정확하고 강력한 학습기(Strong Learner)를 만드는 방식
- 약한 학습기들은 순서대로 일을 하며 뒤의 학습기들은 앞의 학습기가 찾지 못한 부분을 추가적으로 찾는다
- GradientBoosting
- 개별 모델로 Decision Tree 사용
- depth가 얕은 Decision Tree를 사용해 오차를 보정해 나가는 방식
- 오차 보정 방식은 Gradient descent 사용
- 깊은 경우 Overfitting 가능성 큼
- 첫번째 모델은 target을, 그 이후로는 잔차를 예측
- 잔차를 줄여가며 학습하는 방식
- 예측한 잔차를 그대로 사용하면 train set에 과적합되는 문제 발생하기에 천천히 줄여감
- 훈련시간이 길며 트리기반 모델의 특성상 희소한 고차원 데이터에서는 성능이 안좋은 단점이 있다
- 이를 개선한 것이 XGBoost(Extra Gradient Boost)
- parameter
from sklearn.ensemble import GradientBoostingClassifier # defalut : learning_rate : 0.1(학습율), n_estimators=100 (Decision Tree 갯수) gb = GradientBoostingClassifier(random_state=0) gb = GradientBoostingClassifier(random_state=0, max_depth=1, learning_rate=0.1, n_estimators=1000) # 학습 gb.fit(Feature, Label)
- Random Forest
- Bagging 방식
- 서로다른 데이터를 학습해야 하기에 Decision Tree 개수만큼 dataset sampling
- Bootstrap sampling : 중복을 허용하며 랜덤하게 샘플링
- 데이터의 수는 같지만 일부는 누락되고 일부는 중복된다
- Decision Tree를 기반
- N개의 Decision Tree 생성하고 입력데이터를 각각 추론하게 한 뒤 가장 많이 나온 추론결과를 최종결과로 결정
- 분류의 경우 다수결 투표 결과, 회귀에 경우 평균으로 결정
- parameter
- Decision Tree의 개수
- Decision Tree에 대한 hyper parameter
from sklearn.ensemble import RandomForestClassifier rf = RandomForestClassifier(n_estimators=500, # DecisionTree 모델의 갯수 max_depth=5, # DecisionTree들의 하이퍼파리미터인 max_depth를 5로 설정 random_state=0, max_features=10, # 10개의 컬럼만 사용(sampling시 random하게 선택) n_jobs=-1) rf.fit(X_train, y_train) # 학습 - 500개의 DecisionTree 모델들을 학습(X_train, y_train을 이용해서)
- XGBoost(Extra Gradient Boost)
- Gradient Boost 알고리즘을 기반으로 개선해서 분산환경에서도 실행할 수 있도록 구현 나온 모델
- Gradient Boost의 단점인 느린수행시간을 해결하고 과적합을 제어할 수 있는 규제들을 제공하여 성능을 높임
from xgboost import XGBClassifier xgb = XGBClassifier(n_estimators=500, learning_rate=0.01, max_depth=2, random_state=0) # 학습 xgb.fit(Feature, Label)
- 상관관계가 높은 모델을 앙상블에 포함시키는 것은 바람직하지않다
- 모델간의 상관관계가 높다는 것은 두 모델이 동일한 예측을 한다는 것
- 특히 Voting 방식의 경우 각각 좋은 성능을 내지만 다른 예측을 하는 다양한 모델을 모아서 하는 것이 좋다
- 참고 : https://velog.io/@sung-ik-je/Voting-of-Ensemble-Scikit-Learn
- 대부분이 동일한 예측이라면 새로운 모델을 추가해 얻는 이득이 적다
- 0~1로 표현
- 1일수록 상관관계 높다 : 같은 모델이라고 볼 수 있따
- 0일수록 다르다
- 평가 결과를 테이블 형태로 만들어 확인 가능
import numpy as np import pandas as pd # 각 model 결과들 합치기 # SVM, KNN, RandomForest, LogisticRegression, XGBoost model로 학습시킨 모델들의 평가 결과 비교목적 df = pd.DataFrame(np.c_[pred_train_svc,pred_train_knn,pred_train_rf ,pred_train_lr,pred_train_xgb], columns=["SVM", "KNN", 'RandomForest', 'LogisticRegression', 'XGBoost']) # 상관관계 표시 df.corr()
from sklearn.model_selection import RandomizedSearchCV param = { 'n_estimators':range(500, 1001, 100), 'learning_rate':[0.001, 0.05, 0.01, 0.1, 0.5], 'max_depth':[1,2,3], 'subsample':[0.5, 0.7, 0.9, 1] } rs = RandomizedSearchCV(GradientBoostingClassifier(random_state=0), param, cv=4, n_iter=60, scoring='accuracy', n_jobs=-1)