[AI] Ensemble : Scikit - Learn

Ik·2022년 7월 17일
0

Data

목록 보기
9/34

Ensemble

Ensemble?

  • 하나의 모델만을 학습시켜 사용하지 않고 여러 모델을 학습시켜 결합하는 방식으로 문제를 해결하는 방식
  • 하나의 데이터 셋에 대해 여러 모델들이 서로 다른 부분들을 학습하며 데이터의 서로 다른 패턴을 학습한 후 모든 모델들의 결과 중 확률적으로 높은 결과를 선택
    • 과적합을 막고 일반화 성능을 향상
  • 방식

Ensemble Model

  • 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)

Ensemble 상관관계

  • 상관관계가 높은 모델을 앙상블에 포함시키는 것은 바람직하지않다
    • 모델간의 상관관계가 높다는 것은 두 모델이 동일한 예측을 한다는 것
    • 특히 Voting 방식의 경우 각각 좋은 성능을 내지만 다른 예측을 하는 다양한 모델을 모아서 하는 것이 좋다
    • 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()                 

Ensemble - GridSearchCV

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)

0개의 댓글