Ensemble-1
앙상블 - 1
앙상블이란 여러 머신 러닝 모델을 결합하여 각 모델에서 발생할 수 있는 오류를 줄이고 전체적인 예측 성능을 향상시키는 기법이다.
앙상블의 주요 장점으로는 성능 개선, 과적합 감소, 일반화 능력의 향상을 대표적으로 꼽을 수 있다. 여러 모델의 예측을 결합함으로써 단일 모델보다 높은 정확도와 신뢰성을 달성할 수 있으며, 각 모델이 특정 데이터에 과적합되는 경향을 줄일 수 있다.
보팅Votting
보팅은 여러 머신러닝 모델의 예측을 결합해 최종적 예측을 도출하는 앙상블 기법이다. 보팅은 각 모델이 독립적으로 예측을 수행하고, 그 결과를 ‘투표’에 의해 종합한다.
장점 | 단점 |
---|---|
다양한 모델이 서로 다른 방식으로 데이터를 학습해 개별 모델에 비해 더 정확하게 예측할 수 있다. | 다양한 모델 중 성능이 낮은 모델이 최종 결과에 부정적인 영향을 끼칠 수 있다. |
단일 모델이 특정 데이터에 과적합 되는 것을 방지하고, 일반화 능력을 향상시킨다. | 비슷한 유형의 오류가 발생하는 모델이 많다면, ‘투표’가 해당 오류를 반영할 가능성이 높다. |
단일 모델에 비해 계산 비용이 상대적으로 크다. |
하드 보팅
하드 보팅은 여러 머신러닝 모델로부터 얻은 예측값들을 투표하여 가장 많은 표를 얻은 클래스를 최종 예측 결과로 선정하는 방법이다. 각 모델은 동일한 데이터셋에 대해 독립적으로 학습하고 예측을 수행한다.
# 모델 예측값 획득
rf_pred = rf_model.predict(x_test)
gb_pred = gb_model.predict(x_test)
et_pred = et_model.predict(x_test)
# 하드보팅을 위한 데이터 프레임 생성
pred_df = pd.DataFrame(
{'pred1':rf_pred, 'pred2':gb_pred, 'pred3':et_pred}
)
# 각 모델별 예측한 분류결과
display(pred_df.head())
# pred_df의 각 행에서 등장 빈도가 가장 높은 값을 제출 파일에 할당
submission['answer'] = pred_df.mode(axis = 1)[0]
mode() 메서드는 주어진 데이터셋에서 가장 빈번하게 등장하는 값을 찾는 함수이다. ‘axis=1’ 파라미터를 통해각 행 별로 가장 빈도가 높은 값을 찾아내 그 값을 반환한다.
소프트 보팅
소프트 보팅은 여러 개의 머신러닝 모델의 예측 확률을 평균내어 가장 확률이 높은 클래스를 최종 예측 결과로 선정하는 학습 기법이다.
소프트 보팅은 각 모델의 확신도를 고려하므로 하드보팅에 비해 더 세밀하고 정확한 결정을 내릴 수 있게 된다.
# 모델별 클래스 예측 확률
rf_soft = rf_model.predict_proba(x_test)
gb_soft = gb_model.predict_proba(x_test)
et_soft = et_model.predict_proba(x_test)
soft_pred_mean = pd.DataFrame((rf_soft + gb_soft + et_soft) / 3)
display(soft_pred_mean.head())
print(f'모델에 매핑된 클래스는 : {rf_model.classes_} 입니다.')
# 최대값을 가지는 칼럼을 반환하는 idxmax() 메서드
soft_max_col = soft_pred_mean.idxmax(axis = 1)
# soft_max_col의 값이 0부터 시작하므로 3을 더해서 값을 맞춰줍니다.
submission['answer'] = soft_max_col + 3
submission.head()
predict_proba() 메서드를 통해 각 클래스에 속할 확률을 받아 평균을 내어 각 샘플에 대한 종합적인 확률을 얻는데, 반환된 확률은 0부터 클래스 수 -1까지의 인덱스에 매핑된다.
idxmax()메서드는 각 행에서 가장 높은 값을 지닌 인덱스를 찾아 해당 인덱스를 반환한다. soft_max_col에는 soft_pred_mean의 인덱스가 0부터 시작하는 클래스 번호를 가지기에 실제 데이터셋의 클래스 레이블에 맞게 조정하기 위해 3을 더한다.
sklearn을 활용한 보팅 앙상블 적용
sklearn의 VotingClassifier는 앙상블 모듈에 속한 클래스로 다양한 모델들을 결합해 보팅 기반의 앙상블 학습을 가능하게 한다. 하드 보팅과 소프트 보팅 간의 전환도 유연하며 간단하게 다양한 시도를 수행할 수 있다는 장점을 가진다.
from sklearn.ensemble import VotingClassifier
rf_model = RandomForestClassifier(n_estimators = 10)
gb_model = GradientBoostingClassifier(n_estimators = 10)
et_model = ExtraTreesClassifier(n_estimators = 10)
voting_clf = VotingClassifier(estimators=[
('rf', rf_model),
('gb', gb_model),
('et', et_model)],
voting='hard',
weights = [3,2,2])
voting_clf.fit(x_train, y_train)
y_pred = voting_clf.predict(x_test)
submission['quality'] = y_pred
submission.head()
VotingClassifier 파라미터 | 설명 |
---|---|
estimators | 모델의 리스트를 튜플 형태로 입력하며 튜플은 (이름, 모델) 형식으로 구성되어있다. |
voting | 보팅 방식을 선택한다. ‘hard’는 하드 보팅, ‘soft’는 소프트 보팅을 수행한다. |
weights | 각 분류기의 투표에 가중치를 부여할 수 있다. 기본값은 모든 분류기에 동일한 가중치를 부여한다. |
VotingClassifier는 numpy.argmax()함수를 이용하여 최댓값을 찾는데, 이 함수는 배열 내에 같은 값의 최댓값이 여럿 있으면 첫 번째로 발견되는 위치의 값을 반환한다. 따라서 동일한 표를 얻은 여러 클래스가 있을 경우, 이들 중 배열에서 가장 앞에 위치하는 클래스를 최종 예측 결과로 선택한다.
스태킹Stacking
스태킹은 여러 개의 기본 모델의 예측을 입력으로 사용하여, 새로운 모델을 학습시키는 앙상블 기법이다. 스태킹은 각기 다른 알고리즘이 가진 모델들이 서로 다른 관점에서 데이터를 확인하고 이로 인한 다양성을 바탕으로 한층 더 정교한 예측을 가능하게 한다.
스태킹은 일반적으로 다음과 같은 과정을 거친다.
- 개별 모델 정의
- 각 개별 모델을 학습 데이터로 학습
- 학습된 개별 모델을 사용하여 검증 데이터와 테스트 데이터에 대한 클래스별 예측 확률 획득
- 개별 모델의 검증 / 테스트 데이터의 예측 결과를 합쳐 스태킹 학습 데이터 생성
- 메타 모델 정의 및 학습
- 최종 예측
스태킹 구현
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, ExtraTreesClassifier
rf = RandomForestClassifier(n_estimators = 10)
gb = GradientBoostingClassifier(n_estimators = 10)
et = ExtraTreesClassifier(n_estimators = 10)
# 학습 데이터로 모델 학습
rf.fit(x_train, y_train)
gb.fit(x_train, y_train)
et.fit(x_train, y_train)
# 스태킹 학습에 사용할 데이터
pred1 = rf.predict_proba(x_valid)
pred2 = gb.predict_proba(x_valid)
pred3 = et.predict_proba(x_valid)
# 스태킹 예측에 사용할 데이터
test_pred1 = rf.predict_proba(x_test)
test_pred2 = gb.predict_proba(x_test)
test_pred3 = et.predict_proba(x_test)
import numpy as np
# shape = (학습/ 테스트데이터의 개수, 모델의 수)
train_stack = np.column_stack((pred1,pred2,pred3))
test_stack = np.column_stack((test_pred1,test_pred2,test_pred3))
print(train_stack)
print(train_stack.shape)
# 메타 모델 정의 및 학습
meta_model = RandomForestClassifier(n_estimators = 10, random_state = 42)
meta_model.fit(train_stack, y_valid)
# 학습된 메타 모델을 사용하여 최종 예측 수행
final_pred = meta_model.predict(test_stack)
submission['answer'] = final_pred
submission.head()
sklearn을 활용한 스태킹 구현
from sklearn.ensemble import StackingClassifier
estimators = [
('rf', RandomForestClassifier(n_estimators = 10)),
('gb', GradientBoostingClassifier(n_estimators = 10)),
('et', ExtraTreesClassifier(n_estimators = 10))
]
meta_model = RandomForestClassifier(n_estimators = 10, random_state = 42)
stacked_model = StackingClassifier(estimators = estimators,
final_estimator = meta_model,
cv = 3)
# train_x, train_y는 전체 train 데이터를 의미합니다.
stacked_model.fit(train_x, train_y)
stack_pred = stacked_model.predict(x_test)
submission['answer'] = stack_pred
submission.head()
Enjoy Reading This Article?
Here are some more articles you might like to read next: