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

[Machine Learning] Histogram-Based Gradient Boosting Ensembles

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

Gradient Boosting Ensembles

 

부스팅은 트리 모델을 순차적으로 앙상블에 추가하는 앙상블 학습 알고리즘의 클래스를 말한다. 앙상블에 추가된 각 트리 모델은 앙상블에 이미 존재하는 트리 모델에 의해 발생한 예측 오류를 수정하려고 시도한다.

그레이디언트 부스팅은 AdaBoost와 같은 부스팅 알고리즘을 통계 프레임워크로 일반화하는 것으로, 훈련 과정을 가법 모델로 처리하고 임의 손실 함수를 사용할 수 있게 하여 기술의 능력을 크게 향상시킨다. 이와 같이 그레이디언트 부스팅 앙상블은 대부분의 구조화된 (ex: 표 형식 데이터) 예측 모델링 작업에 사용되는 기술이다.

그레이디언트 부스팅이 실제로 매우 잘 수행되지만 모델의 교육 속도가 느릴 수 있다. 이는 여러 CPU 코어를 활용하여 앙상블 멤버를 병렬로 교육할 수 있는 랜덤 포레스트와 같은 다른 앙상블 모델과 달리 트리를 순차적으로 생성하고 추가해야 하기 때문이다. 이와 같이 기울기 부스팅 훈련 알고리즘의 효율성을 향상시키는 기술에 많은 노력이 기울여졌다.

그레이디언트 부스팅 알고리듬을 훈련하기 위한 많은 최신 효율 기술을 마무리하는 두 가지 주목할 만한 라이브러리에는 Extreme Gradient Boost (XGBoost)와 LightGBM이 있다.

가속화할 수 있는 훈련 알고리듬의 한 측면은 각 의사 결정 트리의 구성이며, 그 속도는 훈련 데이터 세트의 예제 (행) 및 특징 (열)의 수에 의해 제한한다. 예를 들어 수만 개 이상의 예제와 같은 대규모 데이터 세트는 트리를 구성하는 동안 각 기능을 고려해야 하기 때문에 각 값에 대한 분할 지점으로 트리를 매우 느리게 구성할 수 있다.

그레이디언트 부스팅의 주요 문제는 모델을 훈련시키는 것이 느리다는 것이다. 이는 수만 개의 예제 (행)가 있는 대규모 데이터 세트에서 모델을 사용할 때 특히 문제가 된다.

앙상블에 추가되는 트리를 훈련하는 것은 연속 입력 변수를 수백 개의 고유한 값으로 이산화 (바인딩)함으로써 극적으로 가속화될 수 있다. 이 기술을 구현하고 이 변환에서 입력 변수를 중심으로 훈련 알고리듬을 조정하는 그레이디언트 부스팅 앙상블을 히스토그램 기반 그레이디언트 부스팅 앙상블이라고 한다.

 

Histogram-Based Gradient Boosting Ensembles

 

의사 결정 트리 구성은 연속 입력 기능의 값 수를 줄임으로써 속도를 크게 높일 수 있다. 이는 이산화 또는 고정된 수의 버킷에 값을 바인딩하여 수행할 수 있다. 이를 통해 각 피쳐의 고유 값 수를 수만 개에서 수백 개로 줄일 수 있다.

이를 통해 의사 결정 트리는 교육 데이터 세트의 특정 값 대신 순서형 버킷 (정수)에서 작동할 수 있다. 입력 데이터의 이러한 대략적인 근사치는 종종 모델 기술에 거의 영향을 미치지 않으며, 모델 기술이 향상되지 않으면 의사 결정 트리의 구성을 크게 가속화한다.

또한 효율적인 데이터 구조를 사용하여 입력 데이터의 결합을 나타낼 수 있다. 예를 들어, 히스토그램을 사용할 수 있고 트리 구성 알고리즘을 각 트리를 구성할 때 히스토그램을 효율적으로 사용할 수 있도록 추가로 조정할 수 있다.

이러한 기술은 원래 대규모 데이터 세트에서 단일 의사 결정 트리를 개발하는 효율성을 위해 1990년대 후반에 개발되었지만 그라데이션 부스팅과 같은 의사 결정 트리의 앙상블에 사용될 수 있다.

이와 같이, 현대 기계 학습 라이브러리에서 "히스토그램"을 지원하는 그레이디언트 부스팅 알고리듬을 히스토그램 기반 그레이디언트 부스팅이라고 부르는 것이 일반적이다.

 

히스토그램 기반 알고리즘은 정렬된 형상 값에서 분할점을 찾는 대신 연속 형상 값을 별개의 빈으로 버킷하고 이러한 빈을 사용하여 훈련 중 형상 히스토그램을 구성한다. 히스토그램 기반 알고리즘은 메모리 소비와 훈련 속도 모두에서 더 효율적이다.

 

Histogram Gradient Boosting With Scikit-Learn

 

사이킷 기계 학습 라이브러리는 히스토그램 기술을 지원하는 그레이디언트 부스팅의 실험적 구현을 제공한다. HistGradientBoostingClassifier 및 HistGradientBoostingRegressor 클래스에서 제공된다. 이러한 클래스를 사용하려면 이러한 실험 기술을 사용할 수 있으며 라이브러리의 후속 릴리스에 따라 해당 동작이 변경될 수 있음을 나타내는 줄을 프로젝트에 추가해야 한다.

from sklearn.experimental import enable_hist_gradient_boosting

 

사이킷 학습 문서는 이러한 히스토그램 기반 그라데이션 부스팅 구현이 라이브러리에서 제공하는 기본 그레디언트 부스팅 구현보다 훨씬 빠르다고 주장한다. 이러한 히스토그램 기반 추정기는 샘플 수가 수만 개보다 클 때 GradientBoostingClassifier 및 GradientBoostingRegressor보다 몇 배 더 빠를 수 있다.

 

기본적으로 앙상블은 각 연속 입력 피쳐에 대해 255개의 빈을 사용하며, 이는 "max_bins" 인수를 통해 설정할 수 있다. 이 값을 50 또는 100과 같이 더 작은 값으로 설정하면 모델 기술이 다소 희생되기는 하지만 효율성이 더욱 향상될 수 있다.

트리 수는 "max_iter" 인수를 통해 설정할 수 있으며 기본값은 100이다.

 

# define the model
model = HistGradientBoostingClassifier(max_bins=255, max_iter=100)

 

10,000개의 예제와 100개의 특징을 가진 합성 분류 데이터 세트에서 히스토그램 기울기 부스팅 알고리즘을 평가하는 방법을 보여준다. 반복적인 계층화된 k-폴드 교차 검증을 사용하여 모델을 평가하고 모든 접힘 및 반복에 대한 평균 정확도를 보고한다.

 

# evaluate sklearn histogram gradient boosting algorithm for classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier

# define dataset
X, y = make_classification(n_samples=10000, n_features=100, n_informative=50, n_redundant=50, random_state=1)

# define the model
model = HistGradientBoostingClassifier(max_bins=255, max_iter=100)

# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)

# evaluate the model and collect the scores
n_scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)

# report performance
print('Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
Accuracy: 0.943 (0.007)

 

또한, bins 수가 모델 성능에 미치는 영향을 살펴볼 수 있다. 아래 예제에서는 각 연속형 입력 피쳐에 대해 서로 다른 bins 수를 사용하여 모델의 성능을 50에서 250 사이의 증분으로 평가한다.

 

# compare number of bins for sklearn histogram gradient boosting
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.experimental import enable_hist_gradient_boosting
from sklearn.ensemble import HistGradientBoostingClassifier
from matplotlib import pyplot

# get the dataset
def get_dataset():
	X, y = make_classification(n_samples=10000, n_features=100, n_informative=50, n_redundant=50, random_state=1)
	
    return X, y

# get a list of models to evaluate
def get_models():
	models = dict()
	
    for i in [10, 50, 100, 150, 200, 255]:
		models[str(i)] = HistGradientBoostingClassifier(max_bins=i, max_iter=100)
	
    return models

# evaluate a give model using cross-validation
def evaluate_model(model, X, y):
	# define the evaluation procedure
	cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
	
    # evaluate the model and collect the scores
	scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)
	
    return scores

# define dataset
X, y = get_dataset()

# get the models to evaluate
models = get_models()

# evaluate the models and store results
results, names = list(), list()

for name, model in models.items():
	# evaluate the model and collect the scores
	scores = evaluate_model(model, X, y)
	
    # stores the results
	results.append(scores)
	names.append(name)
	
    # report performance along the way
	print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))

# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
pyplot.show()

 

이 경우 bins 수를 늘리면 이 데이터 세트에서 모델의 평균 정확도가 저하될 수 있음을 알 수 있다. bins의 수가 증가하면 추가 분할 지점이 모델에 의해 효과적으로 탐색되고 활용될 수 있도록 트리 (max_iter)의 수가 증가해야 할 수도 있다. 중요한 것은 트리가 변수당 10개 또는 50개의 bins을 사용하는 앙상블을 적합시키는 것이 입력 변수당 255개의 bins보다 훨씬 빠르다는 것이다.

 

>10 0.945 (0.009)
>50 0.944 (0.007)
>100 0.944 (0.008)
>150 0.944 (0.008)
>200 0.944 (0.007)
>255 0.943 (0.007)

 

상자 그림과 whisker 그림을 사용하여 각 구성의 정확도 점수 분포를 비교하는 그림이 생성된다. 이 경우 히스토그램에서 bins 수를 늘리면 모형의 평균 성능이 저하될 수 있지만 분포의 확산이 감소하는 것으로 나타난다.

 

 

https://machinelearningmastery.com/histogram-based-gradient-boosting-ensembles/

728x90
반응형
LIST