앙상블 방법 소개

Dec 31 2022
scikit-learn에서 구현
기계 학습 모델을 설계 및 개발할 때 정확도가 예상 또는 요구 사항보다 낮을 수 있습니다. 따라서 앙상블 방법은 약한 학습자를 특정 접근 방식과 결합하여 정확도를 높입니다.
Unsplash의 Markus Spiske 사진

기계 학습 모델을 설계 및 개발할 때 정확도가 예상 또는 요구 사항보다 낮을 수 있습니다. 따라서 앙상블 방법은 약한 학습자를 특정 접근 방식과 결합하여 정확도를 높입니다. 이 접근 방식은 군중의 지혜 라는 이론을 기반으로 합니다 .

앙상블 방법은 이러한 방법으로 예측할 수 있는 광범위한 문제로 인해 최근에 통용되었습니다. 이러한 방법은 분류 및 회귀 문제에 활용될 수 있습니다.

앙상블 방법의 유형

  • 다수결 투표
  • 배깅
  • 붙여넣기
  • 부스팅
  • 스태킹

주어진 정확도를 가진 세 명의 약한 학습자를 가정합니다.

  1. 로지스틱 회귀: 89.06%
  2. 결정 트리 분류기: 87.66%
  3. 서포트 벡터 머신: 88.28%
  4. from sklearn.svm import SVC
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.linear_model import LogisticRegression
    log_clf = LogisticRegression(solver='lbfgs', max_iter=30000, random_state = 42)
    dt_clf = DecisionTreeClassifier(random_state = 42)
    svm_clf = SVC(random_state = 42)
    

    from sklearn.ensemble import VotingClassifier
    hard_voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('dt', dt_clf), ('svc', svm_clf)])
    
           
                    
    Majority voting (Hard Voting) . Photo by Author

    
    soft_voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', dt_clf), ('svc', svm_clf)], voting='soft')
    
           
                    
    Majority Voting . Photo by Author

from sklearn.ensemble import BaggingClassifier
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=2000, max_samples=400, bootstrap=True, n_jobs=-1)

붙여넣기는 Bagging과 유사한 높은 접근 방식입니다. 주요 차이점은 붙여넣기 방식에서는 대체 기능을 사용할 수 없다는 것입니다. 따라서 이 방법은 방대한 양의 데이터를 사용할 수 있을 때 자주 사용됩니다.

bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=2000, max_samples=400, bootstrap=False, n_jobs=-1)

부스팅은 여러 약한 모델로 구성된 앙상블 방법이며 순차적 예측을 제공합니다. 각 단계에서 입력은 이전 모델의 성능을 기반으로 가중치를 부여했습니다. 최종 예측은 모든 모델 예측의 가중 평균을 계산하여 계산됩니다.

가장 많이 사용되는 부스팅 유형은 다음과 같습니다.

  • 적응형 부스팅(AdaBoost)
  • 그라디언트 부스트( XGBoost , CatBoost , LightGBM )

AdaBoost에서 첫 번째 모델은 입력으로 학습되고 나머지는 업데이트된 입력으로 순차적으로 학습됩니다.

에이다부스트. 원천

AdaBoost를 구현하기 위한 두 가지 알고리즘이 있습니다.

  • AdaBoost-SAMME
  • AdaBoost-SAMME.R

이것은 AdaBoost의 기본 및 기본 알고리즘이며 종종 SAMME.R보다 빠릅니다. 하지만; 일반적으로 SAMME.R에 비해 정확도가 낮습니다.

from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200, algorithm="SAMME", learning_rate=0.5)
ada_clf.fit(x_train, y_train)
y_pred = ada_clf.predict(x_test)
accuracy_score(y_test, y_pred)

SAMME.R 알고리즘은 모델의 확률을 사용하여 샘플의 가중치를 업데이트합니다.


from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200, algorithm="SAMME.R", learning_rate=0.5)
ada_clf.fit(x_train, y_train)
y_pred = ada_clf.predict(x_test)
accuracy_score(y_test, y_pred)

Gradient Boost는 AdaBoost처럼 작동합니다. 그러나 차이점은 Gradient Boost에서 모든 반복에서 샘플의 가중치를 조정하는 대신 이전 모델의 오류를 제거하고 새 예측자를 잔여 오류에 맞추려고 한다는 것입니다.

Gradient Boost 수동 구현:

tree_cl1 = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_cl1.fit(x_train, y_train)

y2 = y_train - tree_cl1.predict(x_train)
tree_cl2 = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_cl2.fit(x_train, y2)

y3 = y2 - tree_cl2.predict(x_train)
tree_cl3 = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_cl3.fit(x_train, y3)

y_pred = sum(tree.predict(x_test) for tree in (tree_cl1, tree_cl2, tree_cl3))
accuracy_score(y_test, y_pred)

from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier(max_depth=2, n_estimators=5, random_state=42, learning_rate=1.0)
gbc.fit(x_train, y_train)
y_pred = gbc.predict(x_test)
accuracy_score(y_test, y_pred)

Early Stopping 접근 방식은 검증 오류를 최소화하기 위해 모델에 대한 최적화된 수를 찾는 데 사용됩니다. Gradient Boost와 관련하여 이 접근 방식은 다음과 같이 구현될 수 있습니다.

from sklearn.metrics import mean_squared_error
from sklearn.ensemble import GradientBoostingClassifier
result={}
for count_of_estimators in range(1, 70):
  gbc = GradientBoostingClassifier(max_depth=2, n_estimators=count_of_estimators, random_state=42, learning_rate=1.0)
  gbc.fit(x_train, y_train)
  y_pred = gbc.predict(x_test)
  val_error = mean_squared_error(y_test, y_pred)
  result[count_of_estimators]=val_error

      
                
Early Stopping . Photo by Author

스태킹

이 접근 방식에서 메타 학습자는 각 예측 변수의 예측을
입력으로 사용하고 최종 예측을 수행합니다. 기본적으로 모델은 집계를 수행하도록 훈련됩니다.

스태킹 . 원천

예를 들어 세 가지 모델을 포함하는 스태킹 모델을 가정합니다.

  • 랜덤 포레스트
  • 서포트 벡터 머신(SVM)
  • k-최근접 이웃(KNN)

from sklearn.ensemble import StackingClassifier
from sklearn.neighbors import KNeighborsClassifier

rf_clf = RandomForestClassifier(n_estimators=10, random_state=42)
svm_clf = SVC(random_state=42)
knn_clf = KNeighborsClassifier(n_neighbors=3)
stacking_clf = StackingClassifier(estimators=[('rf', rf_clf), ('svc', svm_clf), ('knn', knn_clf)], final_estimator=LogisticRegression())

결론적으로 앙상블 방법은 다양한 기술을 추가하여 약한 학습자의 정확도를 향상시키는 강력한 도구입니다. 본 논문에서는 앙상블 방법을 소개하고 각 방법에 대해 간략히 설명하였다. 또한 이러한 메서드는 Python 프로그래밍 언어로 코딩되었습니다.

참조

  • 세바스찬 라슈카. STAT 451: 기계 학습.https://pages.stat.wisc.edu/~sraschka/teaching/stat451-fs2020/
  • 조교 팀: 기계 학습 소개.https://github.com/asharifiz/Introduction_to_Machine_Learning