본문 바로가기
Learning-driven Methodology/ML (Machine Learning)

[Machine Learning] Boosting Methods (1)

by goatlab 2023. 7. 11.
728x90
반응형
SMALL

Boosting Methods

 

 

앙상블 학습에서는 여러 학습 알고리즘으로 모델을 가장 성공적으로 훈련시키는 것을 목표로 한다. 앙상블 학습 중 하나인 배깅 방법에서는 동일한 데이터 세트의 서로 다른 하위 샘플에 두 개 이상의 모델을 병렬로 적용했다. 또한, 다른 방법이며 실제로 자주 사용되는 부스팅은 병렬 대신 순차적으로 구축되며 모델 훈련뿐만 아니라 알고리즘 훈련을 목표로 한다. 약한 알고리즘은 모델을 훈련시킨 다음 훈련 결과에 따라 재구성되고 학습하기 쉬워진다. 이 수정된 모델은 다음 알고리즘으로 전송되고 두 번째 알고리즘은 첫 번째 알고리즘보다 쉽게 학습된다.

 

AdaBoost

 

Adaptive Boost (Adaboost)는 의사 결정 나무에 기반한 분계점이 할당되고 분계점에 따라 예측이 이루어진다. 그러나 이 방법은 Adaboost에서 맹목적으로 반복되지 않는다. 여러 알고리즘이 구축되고 이러한 알고리즘은 가중치를 순차적으로 업데이트하여 가장 정확한 추정을 하는 데 별도의 역할을 한다. 오류율은 각 알고리즘에서 계산된다. 가중치가 업데이트되므로 두 번째 알고리즘을 참조한다. 두 번째 알고리즘은 모델을 분류하고 첫 번째 모델처럼 가중치를 업데이트한 후 세 번째 알고리즘으로 전송한다. 이러한 프로세스는 n_estimators의 수 또는 오류가 0에 도달할 때까지 계속된다. 이 과정에서, 이 알고리즘은 가중치가 이전 알고리즘에 의해 업데이트되고 다른 알고리즘으로 전송됨에 따라 분류를 더 쉽고 성공적으로 만든다.

 

빨간색과 파란색 두 개의 레이블이 있다고 가정한다면, 첫 번째 알고리즘 (약한 분류기 1)은 레이블을 구분하며, 결과적으로 파란색 표본 2개와 빨간색 표본 1개가 잘못 분류된다. 이러한 잘못된 분류의 가중치는 증가하고 올바른 분류의 가중치는 그 이후에 낮아져 학습하기 위해 다음 모델로 전송된다. 이전 모델에 의해 편향이 증가한 잘못 분류된 샘플과 편향이 감소한 정확한 분류된 샘플이 이전 알고리즘에 비해 더 쉽게 학습되는 새로운 모델이 된다. 다음 단계에서 동일한 프로세스가 반복된다. 요약하자면, 약한 분류의 협력으로 강한 분류가 발생한다. 분류에 사용되므로 AdaBoostRegressor를 가져와 회귀 분석에도 사용할 수 있다. 하이퍼파라미터는 다음과 같다.

 

base_estimators 순차적으로 개선되는 알고리즘 (기본값=  DecisionTreeClassifier)
n_estimators 프로세스가 수행할 최대 단계 수를 결정한다 (기본값 = 50).
learning_rate 가중치의 변동을 결정한다. 너무 작으면 n_estimators 값이 매우 높아야 한다. 너무 크게 선택하면 최적 값에 도달하지 못할 수 있다 (기본값 = 1).
import numpy as np
from time import time
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification 
from sklearn.model_selection import cross_val_score,train_test_split
from sklearn.model_selection import KFold

x,y = make_classification(n_samples=100000, n_features=30, n_informative=10, 
                          n_redundant=5, random_state=2023)

start_ada = time()
ada = AdaBoostClassifier()

kf=KFold(n_splits=5, shuffle=True, random_state=2023)
ada_score=cross_val_score(ada, x, y, cv=kf, n_jobs=-1)
print("ada", np.round(time() - start_ada, 5), "sec")
print("acc", np.mean(ada_score).round(3))
ada 143.9156 sec
acc 0.889

 

Gradient Boost

 

Adaboost는 의사 결정 나무 (1개의 노드를 2개의 리프로 분할)로 가중치를 업데이트함으로써 자체적으로 개선되었다. 또 다른 순차적 방법인 그레디언트 부스트는 8 ~ 32개의 잎을 생성하여 손실을 최적화하는 것으로, 이는 나무가 그레디언트 부스트에서 더 크다는 것을 의미한다 (손실: 선형 모델의 잔차). y_test - y_testion은 잔차 오차를 나타내고 각 데이터 점의 제곱합은 손실을 나타낸다. 음수 값은 편차가 있더라도 손실 값을 작게 만들기 때문에 제곱된다. 즉, 값을 0에 가깝게 함으로써 잔차 값이 다음 알고리즘으로 전송되므로 손실 값이 최소화된다.

 

from sklearn.ensemble import GradientBoostingClassifier

GB = GradientBoostingClassifier()

start_gb = time()
kf=KFold(n_splits=5, shuffle=True, random_state=2023)
GB_score=cross_val_score(GB, x, y, cv=kf, n_jobs=-1)

print("gb", np.round(time() - start_gb, 5), "sec")
print("acc", np.mean(GB_score).round(3))
print("***************************")
gb 586.4749 sec
acc 0.936
from sklearn.metrics import mean_squared_error

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2023)
gbr = GradientBoostingRegressor(max_depth=5, n_estimators=150)
gbr.fit(x_train, y_train)
error_list = [mean_squared_error(y_test, y_pred) for y_pred in gbr.staged_predict(x_test)]
728x90
반응형
LIST