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

[Machine Learning] Boosting Methods (2)

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

XGBoost

 

https://www.nvidia.com/en-us/glossary/data-science/xgboost/

 

XGBoost (Extreme Gradient Boost)는 2014년 Tianqi Chen에 의해 처음 개발되었으며 그레디언트 부스트보다 훨씬 빠르기 때문에 선호되는 부스팅 방법이다. XGBoost는 확장 가능하고 매우 정확한 그레디언트 부스팅 구현으로 트리 알고리듬을 강화하기 위한 컴퓨팅 성능의 한계를 푸시하며 주로 기계 학습 모델 성능 및 계산 속도를 활성화하기 위해 구축된다. XGBoost를 사용하면 GBDT와 같이 순차적으로 트리가 아닌 병렬로 구축된다. 그것은 그레디언트 값을 스캔하고 이러한 부분 합계를 사용하여 훈련 세트에서 가능한 모든 분할에서 분할의 품질을 평가하는 level-wise (수준별) 전략을 따른다.

 

포함된 하이퍼파라미터 덕분에 정규화 하이퍼파라미터가 과적합을 방지와 같이 많은 것을 조정할 수 있다.

 

learning_rate&eta 가중치 값을 곱하여 사용한다. 이 방법의 목적은 피쳐 가중치를 배열하여 프로세스를 보다 보수적으로 만드는 것이다. default=0.3 (대부분 0.01–0.3)
max_depth 트리의 최대 깊이이다. 값이 증가하면 모형이 과적합되기 쉽다. 기본값=6이며 growing_policy=lossguide, max_value=0인 경우에만 해당된다.
n_estimators 앙상블 나무의 수
alpha 가중치에 대한 L1 정규화이며 작은 가중치를 권장한다. 기본값 = 1
gamma 복잡성의 정규화를 위한 하이퍼 파라미터 중 하나, 잎에서 분할이 발생하는 데 필요한 최소 손실이다. 기본값 = 0, 감마가 클수록 모형이 더 보수적이다.
lambda 가중치에 대한 L2 정규화이며 작은 가중치를 권장한다. 기본값 = 1
subsample 얼마나 많은 데이터 샘플을 훈련할지 결정한다. 기본값=1은 100% 백분율을 의미하며, 0.5로 설정된 경우 데이터의 50%가 랜덤하게 선택된다.
colsample_bytree 각 트리를 구성할 때 열의 하위 샘플 비율이다. 기본값은 1이며 하위 샘플링은 구성된 모든 트리에 대해 한 번씩 수행된다.
colsample_bylevel 각 수준에 대한 열의 부분표본 비율이다. 기본값은 1이며 트리에서 새 깊이 레벨에 도달할 때마다 서브샘플링이 한 번씩 발생한다. 열은 현재 트리에 대해 선택된 열 집합에서 하위 샘플링된다.
colsample_node 각 노드에 대한 열의 하위 샘플 비율이다. 새 분할을 평가할 때마다 하위 샘플링이 한 번씩 수행된다. 열은 현재 수준에 대해 선택된 열 집합에서 하위 샘플링된다.
min_child_weight 과적합을 제어하는 데 사용된다. 값이 너무 높으면 적합도가 낮아질 수 있다. 기본값 = 1
grow_policy 트리에 새 노드를 추가하는 방법을 제어한다. LGBM 출시 후 XGBoost에 추가되었다 (wise-leaf로 인해) LGBM의 빠른 속도 때문에 wise-leaf가 XGBoost 작업에 추가된다. 활성화하려면 grow_policy=lossguide, default=depthwise
objective 학습 과제를 지정한다 ('regsquarederror' : 손실 제곱을 갖는 회귀 분석, 'reglogistic' : 로지스틱 회귀 분석 등)
eval_metric test_data (validation_data)에 대한 평가 메트릭이다 ('rmse': 루트 평균 제곱 오차; 'mae' : 평균 절대 오차, 'mape' : 평균 절대 백분율 오차)
import numpy as np
from time import time
from sklearn.datasets import make_classification 
from sklearn.model_selection import cross_val_score,train_test_split
from sklearn.model_selection import KFold
from xgboost import XGBClassifier

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

xgb = XGBClassifier()

start_xgb = time()
kf = KFold(n_splits=5, shuffle=True, random_state = 2023)
xgb_score = cross_val_score(xgb, x, y, cv=kf, n_jobs=-1)

print("xgboost", np.round(time() - start_xgb, 5))
print("acc", np.mean(xgb_score).round(3))
xgboost 318.45566
acc 0.968

 

Histogram-Based Gradient Boost

 

https://www.analyticsvidhya.com/blog/2022/01/histogram-boosting-gradient-classifier/

 

데이터를 데이터 전처리 방법인 binning (분리)으로 그룹화하는 방법으로 예를 들어, '연령' 열이 주어졌을 때, 이러한 데이터를 30–40, 40–50, 50–60으로 세 그룹으로 나눈 다음 수치 데이터로 변환하는 것이 매우 효과적인 방법이다. 이 binning 방법을 의사 결정 트리에 적용하면 피쳐 수를 줄임으로써 알고리즘 속도를 높인다. 이 방법은 히스토그램으로 그룹화하여 각 트리를 구성할 때 앙상블로 사용할 수도 있다.

 

from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier

HGB = HistGradientBoostingClassifier()

start_hgb = time()
kf = KFold(n_splits=5, shuffle=True, random_state=2023)
HGB_score = cross_val_score(HGB, x, y, cv=kf, n_jobs=-1)

print("hist", np.round(time() - start_hgb, 5), "sec")
print("acc", np.mean(HGB_score).round(3))
print("***************************")
hist 32.87899 sec
acc 0.964
728x90
반응형
LIST