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 |