티스토리 뷰
XGBoost는 트리 기반의 앙상블 학습에서 가장 각광받고 있는 알고리즘 중 하나입니다. 압도적인 수치는 아니지만, 분류 태스크에 있어서 일반적으로 다른 머신러닝 알고리즘보다 뛰어난 예측 성능을 보입니다. XGBoost는 GBM에 기반하고 있지만, GBM의 단점인 느린 수행 시간 및 과적합 규제 부재 등의 문제를 어느정도 해결합니다. 특히 병렬 CPU 환경에서 병렬 학습이 가능합니다.
- 뛰어난 예측 성능
- GBM에 비하면 빠른 수행 시간
- 과적합 규제(Regulalization) 기능
- 더 이상 긍정 이득이 없는 분할을 가지치기하여 분할 수를 줄이는 Tree pruning
- 자체 내장된 교차 검증을 통한 조기 중단 기능
- 결손값 자체 처리 기능
XGBoost의 핵심 라이브러리는 C/C++로 작성되었습니다. XGBoost의 개발 그룹은 파이썬에서 해당 라이브러리를 호출할 수 있도록 파이썬 래퍼 XGBoost 모듈을 제공합니다. 하지만 해당 모듈은 사이킷런 고유의 아키텍처(fit(), predict())를 지원하지 않아 사이킷런의 다양한 유틸리티와 함께 사용할 수 없습니다. 그래서 사이킷런과 연동되는 사이킷런 래퍼 클래스 또한 제공합니다. 책에선 파이썬 래퍼 클래스와 사이킷런 래퍼 클래스를 모두 다루지만, 본 글에선 사이킷런 래퍼 클래스만 다루겠습니다.
XGBoost는 GBM과 유사한 하이퍼 파라미터를 가지며, 여기에 조기 중단 및 과적합 규제를 위한 하이퍼 파라미터를 추가로 가집니다. 하이퍼 파라미터를 유형별로 나누면 다음과 같습니다.
- 일반 파라미터 : 실행 시 스레드의 개수나 slient 모드 등의 선택을 위한 파라미터로, 일반적으론 디폴트 파라미터를 사용
- booster : gbtree(트리 베이스 모델) 또는 gblinear. 디폴트는 gbtree.
- slient : 출력 메시지를 표시하지 않으려면 1. 디폴트는 0.
- nthread : CPU의 실행 스레드 개수. 디폴트는 모든 CPU를 사용.
- 부스트 파리미터 : 트리 최적화, 부스팅, 정규화 등과 관련된 파라미터
- learning_rate : 학습률. 0 ~ 1사이의 값을 지정하며 디폴트는 0.1. 보통 0.01 ~ 0.2를 선호.
- n_estimators
- min_child_weight : 트리에서 추가로 가지를 나눌지를 결정하기 위해 필요한 데이터의 가중치 총합. 클수록 과적합 자제. 디폴트는 1.
- gamma : 트리의 리프 노드를 추가적으로 나눌지를 결정할 최소 손실 감소 값. 클수록 과적합 자제. 디폴트는 0.
- max_depth
- sub_sample
- max_features
- 이외의 다양한 파라미터가 존재.
- 학습 태스크 파라미터 : 학습 수행시 객체 함수, 평가 지표 설정 파라미터
- objective : 최솟값을 가져야 할 손실 함수를 정의(주로 이진 분류인지 다중 분류인지에 따라 달라짐).
- binary:logistic : 이진 분류일 때 적용.
- multi:softmax : 다중 분류일 때 적용
- multi:softprob : softmax와 유사하나, 개별 레이블의 예측 확률을 반환.
- eval_metric : 검증할 때 사용할 함수를 정의. 회귀는 rmse, 분류는 error가 디폴트. 이외의 다양한 값 존재.
모델의 과적합이 심하다면 learning_rate 값을 낮추거나(n_estimators는 반대로 높여줍니다), max_depth, min_child_weight, gamma, subsample, max_features 파라미터의 조정을 고려할 수 있습니다.
GBM의 경우 n_estimators로 지정한 횟수만큼 반복적으로 학습 오류를 감소시키며 학습을 진행합니다. XGBoost와 앞으로 소개할 LightGBM은 조기 중단 기능이 있어서 지정한 부스팅 횟수에 도달하지 않더라도, 검증 데이터에 대한 예측 오류가 더 이상 개선되지 않으면 반복을 멈춰 수행 시간에서 이득을 볼 수 있습니다.
예를들어, n_estimators가 200이고 조기 중단 파라미터 값을 50으로 설정하면, 200회동안 부스팅을 반복하다가 50회를 반복할 동안 학습 오류가 감소한 적이 없으면 부스팅을 종료합니다. 이러한 XGBoost의 장점이 있지만, CPU 코어가 많지 않은 개인용 PC에서는 수행시간 향상을 경험하기 어려울 수 있습니다.
XGBoost 알고리즘으로 위스콘신 유방암 데이터 세트를 학습하고 예측해봅시다.
먼저 사이킷런에서 제공하는 위스콘신 유방암 데이터 세트를 가져온 뒤 DataFrame 객체로 만들어줍시다. 양성 종양을 뜻하는 malignant는 레이블 0이고, 악성 종양인 benign은 레이블 1입니다. 레이블의 분포를 보니, 두 레이블 데이터가 꽤 균등하게 분포한 것을 확인할 수 있습니다. 테스트 데이터를 20%로 설정한 뒤 XGBoost로 학습을 진행해봅시다.
사이킷런 래퍼 XGBoost는 분류를 위해 XGBClassifier, 회귀를 위해 XGBRegressor 클래스를 제공합니다. n_estimators=400, learning_rate=0.1, max_depth=3으로 지정한 뒤 바로 학습을 진행했습니다.
이전에 분류 모델을 다양한 평가 지표로써 평가하는 get_clf_eval() 메서드를 통해 XGBoost 모델의 예측 성능을 평가했습니다. 위스콘신 데이터 세트가 워낙 작기 때문에, 검증 데이터를 따로 분리하거나 교차 검증을 수행하면 성능 수치가 불안정한 경향을 보이기에 검증은 따로 수행하지 않았습니다. 데이터가 많다면 검증을 통한 조기 중단을 이용하여 과적합을 개선할 수 있어 모델 성능이 조금 더 향상될 수 있습니다.
이번에는 XGBoost의 조기 중단 기능을 사용해봅시다. 조기 중단과 관련된 파라미터는 fit() 메서드에 입력하면 됩니다. 평가 지표가 향상되기를 기대하는 반복 횟수인 early_stopping_rounds, 조기 중단을 위해 검증 데이터 세트를 평가할 지표인 eval_metric, 검증 데이터 세트인 eval_set을 지정하면 됩니다.
학습 데이터 세트를 다시 학습 데이터와 검증 데이터로 분리했습니다. XGBoost 객체의 fit() 메서드에 입력할 eval_set 객체에는 위의 코드에서 보이는 바와 같이 구성하면 됩니다. 첫 번째 튜플이 학습 데이터 세트, 두 번째 튜플이 검증 데이터 세트입니다.
n_estimators가 400이지만, 160번째 반복에서 학습이 종료되었습니다. 이는 60번째 반복 이후 100회 동안 validation_1-logloss가 개선된 적이 없기 때문에 조기 중단되었기 때문입니다.
조기 중단으로 학습된 XGBoost Classififie의 예측 성능을 평가해봤습니다. 위스콘신 데이터 세트가 워낙 작기 때문에, 검증 데이터 구성을 위해 실제 학습에 쓰이는 데이터의 개수가 더욱 작아졌기 때문에 오히려 검증을 하지 않은 모델보다 테스트 데이터에 대한 예측 성능이 떨어졌습니다.
조기 중단값을 너무 크게 줄이면 예측 성능이 오히려 저하될 우려가 크다는 점을 주의합시다.
XGBoost 역시 학습시 피처의 중요도를 시각화하는 모듈을 가집니다. plot_importance() API에 사이킷런 XGBoost 모델 객체와 matplotlib의 ax 객체를 입력하면 됩니다. 피처의 중요도의 기본 평가 지표는 f스코어이며, f스코어는 해당 피처가 트리 분할 시 얼마나 자주 사용되었는 지를 나타내는 값입니다.
뿐만 아니라 결정 트리에서 보여준 트리 기반 규칙 구조도도 시각화할 수 있으며, GridSearchCV와 유사하게 데이터 세트에 대한 교차 검증을 수행한 후 최적 파라미터를 구하는 API인 cv()를 제공합니다.
'파이썬 머신러닝 완벽 가이드' 카테고리의 다른 글
파이썬 머신러닝 완벽 가이드 : 베이지안 최적화 기반의 하이퍼 파라미터 튜닝 (0) | 2023.05.03 |
---|---|
파이썬 머신러닝 완벽 가이드 : LightGBM (0) | 2023.05.03 |
파이썬 머신러닝 완벽 가이드 : 그라디언트 부스팅 머신(GBM) (0) | 2023.05.02 |
파이썬 머신러닝 완벽 가이드 : 앙상블 학습 (0) | 2023.05.02 |
파이썬 머신러닝 완벽 가이드 : 결정 트리 실습 - 사용자 행동 인식 데이터 세트 (1) | 2023.05.01 |