본문 바로가기

Machine Learning/Ensemble

Ensemble Member Selection

1. 정의

Ensemble Member Selection이란, 앙상블 내 모델 조합을 최적화시키는 알고리즘이다.

2. 특징

  • 앙상블의 성능 저하를 최소화하면서 앙상블 모델을 축소하고 이를 통해 앙상블의 계산 복잡도(computational complexity)를 감소시킨다.
  • 단순히 voting과 stacking ensemble로 어떤 조합의 모델이 최고의 성능을 내는지 알 수 없기 때문에 ensemble member selection을 수행한다.

3. 종류

  • Ensemble Growing : 탐욕적 방법(Greedy manner)으로 더 이상의 성능 개선이 없을 때까지 앙상블에 모델을 추가
  • Ensemble Pruning : 탐욕적 방법(Greedy manner)으로 더 이상의 성능 개선이 없을 때까지 전체 앙상블에서 모델을 제거 -> 회귀분석에서의 backward feature selection(후진제거법)과 유사.
    • 탐욕적 방법 알고리즘 : 현재 상황에서 가장 좋은 것을 고르는 알고리즘. 언제나 최적일 수 없다는 특징을 가지고 있음.

4. 앙상블의 크기

앙상블의 크기를 작게 하는 데에는 2가지 주요 원인이 존재한다.
첫째, Computational Overhead(계산적 오버헤드) 감소이다. 더 작은 크기의 앙상블은 더 적은 계산적 오버헤드를 발생한다.
둘째, accuracy(정확도) 향상이다. 앙상블의 일부 모델들은 성능을 감소시키는 원인 모델이다. 때로는 성능이 조금 저하되더라도 모델 복잡도를 크게 감소시키면 바람직하다고 간주한다.

[사용할 모델 선정]

def get_models():
    models = list()
    models.append(('lr', LogisticRegression()))
    models.append(('knn', KNeighborsClassifier()))
    models.append(('tree', DecisionTreeClassifier()))
    models.append(('nb', GaussianNB()))
    models.append(('svm', SVC(proabability=True)))
    
    return models

[평가지표]

def evaluate_ensemble(models, X, y):
    
    if len(models) == 0:
        return 0.0
    
    # create the ensemble
    ensemble = VotingClassiifer(estimators=models, voting='soft')
    
    # define the evaluation procedure
    
    cv = StratifiedKFold(n_splits=10, shuffle=True)
    
    ## evaluate the ensemble
    scores = cross_val_score(ensemble, X, y, scoring='f1_score', cv=cv)
    
    return scores

[어떤 모델을 제거할 때 정확도가 향상되는지 확인할 수 있는 함수 정의]

def prune_round(models_in, X, y):
    
    ## 전체 모델을 넣은 voting ensemble 성능 평가
    baseline = evaluate_ensemble(modesl_in, X, y)
    best_score, removed = baseline, None
    
    ## voting ensemble을 구성하는 각 모델를 하나씩 제거해보고 성능이 향상되면 제거
    
    for m in models_in:
        
        dup = model_in.copy()
        
        dup.remove(m) #m번째 model 삭제
        
        result = evaluate_ensemble(dup, X, y) #m번째 model을 제거한 voting ensemble 성능 평가
        
        if result > best_score:
            best_score, removed = result, m
            
            # print("제거되는 모델 : ", m)
            
    return best_score, removed

  • 앙상블에서 한 모델을 제거 - 평가 -> 반복
  • 제거될 경우, 성능이 가장 개선되는 모델은 앙상블에서 영구적으로 제거
  • 더 이상 개선이 이루어지지 않을 때까지 계속
def prune_ensemble(models, X, y):
    
    best_score = 0.0
    
    
    while True:
        score, removed = prune_round(models, X, y) # 한 가지 모델을 제거하고 돌린 voting ensemble 성능 및 제거된 모델
        
        if removed is None:
            print("> no further improvement")
            break
            
        best_score = score
        
        models.remove(removed)
        
        print(">%.3f (removed: %s)" % (score, removed[0]))
    
    return best_score, models

'Machine Learning > Ensemble' 카테고리의 다른 글

Stacking Ensemble  (1) 2022.10.17
Voting Ensemble & Weighted Average Ensemble  (1) 2022.10.17