XGBoost Documentation — xgboost 1.7.2 documentation
Python API Reference — xgboost 2.0.0-dev documentation
캐글을 하다보니 feature를 가지고 성능을 올리는 것에 제한을 느껴 이번에는 모델의 성능을 높이고자 하여 XGBoost에 대해 조금 알아보고자 적게 되었다.
1. XGBoost란?
XGBoost는 Extreme Gradient Boost의 준말.
XGBoost는 기존 Gradient Tree Boosting 알고리즘에 과적합 방지를 위한 기법이 추가된 지도 학습 알고리즘
Gradient Tree Boosting의 한 종류로 XGBoost는 기본 학습기를 의사결정나무(Decision Tree)로 하며 Gradient Boosting과 같이 잔차(Gradient)를 이용하여 이전 모형의 약점을 보완하는 방식으로 학습.
XGBoost는 Gradient Tree Boosting에 과적합 방지를 위한 파라미터가 추가된 알고리즘.
Regression, Classification 문제를 모두 지원, 성능과 자원 효율이 좋아서 자주 사용되는 알고리즘
2. 장단점
- 장점
과적합 방지
- 기존의 Gradient Boosting의 약점인 과적합을 방지하기 위해 알고리즘에 이를 방지하기 위한 장치를 마련.
예측 성능 상승
- 과적합에 대한 방지가 되어 있어 성능이 상승.
GBM 대비 빠른 수행시간.
- 병렬 처리로 학습, 분류 속도 빠름.
분류와 회귀에서 뛰어난 예측 성능 발휘
- 즉, CART(Classification and Regression Tree) 앙상블 모델을 사용
조기 종료(Early Stopping) 기능 탑재
Customizion 가능
- 다양한 옵션을 제공
- 단점
적은 데이터에 대한 과적합 가능성
- XGBoost가 충분한 성능을 보이기 위해서는 많은 데이터가 필요.
해석이 어려움
- 모든 앙상블 계열 알고리즘의 문제인 입력 변수에 대한 출력 변수가 어떻게 변하는지 해석이 어려움.
3. 하이퍼 파라미터 튜닝
- XGBoost는 위에 언급했듯이 다양한 옵션(하이퍼파라미터)이 존재, 다음 세가지 범주로 나뉜다.
- 일반 파라미터 (General parameter)
- 일반적으로 실행 시 스레드의 개수나 silent 모드 등의 선택을 위한 파라미터.
- 부스팅을 수행할 때 트리를 사용할지, 선형 모델을 사용할지 등을 고름.
- default 값을 바꾸는 일은 거의 없음.
- 일반 파라미터 (General parameter)
-
- 부스터 파라미터 (Booster parameter)
- 트리 최적화, 부스팅, regularization 등과 관련된 파라미터.
- 모델 성능에 가장 영향을 미치는 파라미터
- 모델 과적합 등의 이슈 발생 시, 주로 튜닝의 대상이 되는 파라미터
- 선택한 부스터에 따라서 적용할 수 있는 파라미터 종류가 다름.
-
- 학습 과정 파라미터 (Learning Task parameter)
- 학습에 활용되는 객체 함수, 모형의 평가를 위한 지표 등을 설정하는 파라미터
- 학습 시나리오를 결정
- 학습 과정 파라미터 (Learning Task parameter)
- 일반 파라미터 (General parameter)
- booster [기본값 = gbtree]
- 어떤 부스터 구조를 쓸지 결정
- 의사결정기반모형(gbtree), 선형모형(gblinear), dart가 있음.
- booster [기본값 = gbtree]
-
- silent [기본값 = 1]
- 출력 메시지 설정 관련 인수
- 출력 메시지를 나타내고 싶지 않은 경우 1
-
- nthread [기본값 = 전체다]
- CPU 실행 스레드 개수 조정
- 멀티코어/스레드 CPU 시스템에서 일부 CPU만 사용할 때 변경
- nthread [기본값 = 전체다]
- 부스터 파라미터 (Booster parameter)
- eta [기본값 = 0.3] =>learning_rate
- 일반적으로 학습률로 불리는 파라미터
- 각 단계에서 가중치를 줄임으로써 모델을 더 강건하게 만든다.
- 일반적으로 0.01 ~ 0.2, 클수록 모델 업데이트 속도가 빨라짐.
- 클수록 과적합 가능성 상승.
- 범위 : 0 ~ 1
- eta [기본값 = 0.3] =>learning_rate
-
- num_boost_around [기본값 = 10]
- 학습에 활용될 weak learner의 반복 수
-
- min_child_weight [기본값 = 1] (Should be tuned using CV)
- leaf node에 포함되는 최소 관측치의 수
- over-fitting vs under-fitting을 조정하기 위한 파라미터.
- 작은 값을 가질수록 과적합 발생 가능성 높음 (과적합 조절 용도)
- 큰 값을 가질수록 under-fitting.
- 범위 : 0 ~
- min_child_weight [기본값 = 1] (Should be tuned using CV)
-
- gamma [기본값 = 0]
- leaf node의 추가분할을 결정할 최소 손실 감소값.
- 알고리즘을 보수적으로 만듦. loss function에 따라 조정
- 해당값보다 손실이 클게 감소할 때 분리
- 값이 클수록 과적합 감소
- 범위 : 0 ~
- gamma [기본값 = 0]
-
- max_depth [기본값 = 6] (Should be tuned using CV)
- 트리의 최대 깊이.
- 0을 지정하면 깊이의 제한이 없음
- 과적합에 가장 민감하게 작용하는 파라미터
- 너무 크면 과적합
- 일반적으로 3 ~ 10
- max_depth [기본값 = 6] (Should be tuned using CV)
-
- max_leaf_nodes
- 최종 노드의 최대 개수. (max number of terminal nodes)
- 이진 트리가 생성되기 때문에 max_depth가 6이면 max_leaf_nodes는 2^6개가 됨.
- max_leaf_nodes
-
- subsample [기본값 = 1]
- 각 트리마다의 관측 데이터 샘플링 비율.
- 학습 시 데이터 샘플링 비율을 지정
- 값을 적게 주면 over-fitting을 방지하지만 값을 너무 작게 주면 under-fitting.
- 일반적으로 0.5 ~ 1
- 범위 : 0 ~ 1
- subsample [기본값 = 1]
-
- colsample_bytree [기본값 = 1]
- 각 트리마다의 feature 샘플링 비율.
- 트리 생성에 필요한 feature의 샘플링에 사용
- feature가 많을 대 과적합 조절에 사용
- 일반적으로 0.5 ~ 1
- colsample_bytree [기본값 = 1]
-
- lambda [기본값 = 1] =>reg_lambda
- L2 Regularization 적용 값
- feature 개수가 많을 때 적용 검토
- 클수록 과적합 감소 효과
- lambda [기본값 = 1] =>reg_lambda
-
- alpha [기본값 = 0] =>reg_alpha
- L1 Regularization 적용 값
- featrure 개수가 많을 때 적용 검토
- 클수록 과적합 감소 효과
- alpha [기본값 = 0] =>reg_alpha
-
- scale_pos_weight [기본값 = 1]
- 불균형 데이터 셋의 균형 유지
- 불균형한 경우 더 빠른 수렴(convergence)에 도움되므로 0보다 큰 값을 쓸 것.
- scale_pos_weight [기본값 = 1]
- gbtree Booster의 파라미터
- learning_rate [ 기본값 : 0.3 ]
- learning rate이다.
- learning rate가 높을수록 과적합 하기 쉽다.
- n_estimators [ 기본값 : 100 ]
- 생성할 weak learner의 수
- learning_rate가 낮을 땐, n_estimators를 높여야 과적합이 방지된다.
- max_depth [ 기본값 : 6 ]
- 트리의 maximum depth이다.
- 적절한 값이 제시되어야 하고 보통 3-10 사이 값이 적용된다.
- max_depth가 높을수록 모델의 복잡도가 커져 과적합 하기 쉽다.
- min_child_weight [ 기본값 : 1 ]
- 관측치에 대한 가중치 합의 최소를 말한다.
- 값이 높을수록 과적합이 방지된다.
- gamma [ 기본값 : 0 ]
- 리프노드의 추가분할을 결정할 최소손실 감소값이다.
- 해당값보다 손실이 크게 감소할 때 분리한다.
- 값이 높을수록 과적합이 방지된다.
- subsample [ 기본값 : 1 ]
- weak learner가 학습에 사용하는 데이터 샘플링 비율이다.
- 보통 0.5 ~ 1 사용된다.
- 값이 낮을수록 과적합이 방지된다.
- colsample_bytree [ 기본값 : 1 ]
- 각 tree 별 사용된 feature의 퍼센테이지이다.
- 보통 0.5 ~ 1 사용된다.
- 값이 낮을수록 과적합이 방지된다.
- lambda [기본값 = 1, 별칭 : reg_lambda]
- 가중치에 대한 L2 Regularization 적용 값
- 피처 개수가 많을 때 적용을 검토
- 이 값이 클수록 과적합 감소 효과
- alpha [기본값 = 0, 별칭 : reg_alpha]
- 가중치에 대한 L1 Regularization 적용 값
- 피처 개수가 많을 때 적용을 검토
- 이 값이 클수록 과적합 감소 효과
- learning_rate [ 기본값 : 0.3 ]
- 학습 과정 파라미터 (Learning Task parameter)
- objective [ 기본값 : reg = squarederror ]
- reg : squarederror
- 제곱 손실이 있는 회귀
- reg : squarederror
- objective [ 기본값 : reg = squarederror ]
-
-
- binary : logistic (binary-logistic classification)
- 이항 분류 문제 로지스틱 회귀 모형으로 반환값이 클래스가 아니라 예측 확률
-
- multi : softmax
- 다항 분류 문제의 경우 소프트맥스(Softmax)를 사용해서 분류하는데 반횐되는 값이 예측확률이 아니라 클래스임. 또한 num_class도 지정해야함.
- multi : softmax
-
- multi : softprob
- 각 클래스 범주에 속하는 예측확률을 반환함.
- multi : softprob
-
- count : poisson (count data poison regression) 등 다양하다.
-
-
- eval_metric
- 모델의 평가 함수를 조정하는 함수다.
- 설정한 objective 별로 기본설정값이 지정되어 있다.
- rmse: root mean square error
- mae: mean absolute error
- logloss: negative log-likelihood
- error: Binary classification error rate (0.5 threshold)
- merror: Multiclass classification error rate
- mlogloss: Multiclass logloss
- auc: Area under the curve
- map (mean average precision)등, 해당 데이터의 특성에 맞게 평가 함수를 조정한다.
- eval_metric
-
- seed [ 기본값 : 0 ]
- 재현가능하도록 난수를 고정시킴.
- seed [ 기본값 : 0 ]
- 민감하게 조정해야하는 것
- booster 모양
- eval_metric(평가함수) / objective(목적함수)
- eta
- L1 form (L1 레귤러라이제이션 폼이 L2보다 아웃라이어에 민감하다.)
- L2 form
- 과적합 방지를 위해 조정해야하는 것
- learning rate 낮추기 → n_estimators은 높여야함
- max_depth 낮추기
- min_child_weight 높이기
- gamma 높이기
- subsample, colsample_bytree 낮추기
Sample code 1. XGBClassifier
import xgboost as xgb
import matplotlib.pyplot as plt
# 모델 선언
model = xgb.XGBClassifier()
# 모델 훈련
model.fit(x,y)
# 모델 예측
y_pred = model.predict(X_test)
Sample code 2. XGBRegressor
import xgboost as xgb
# 모델 선언
my_model = xgb.XGBRegressor(learning_rate=0.1,max_depth=5,n_estimators=100)
# 모델 훈련
my_model.fit(X_train, y_train, verbose=False)
# 모델 예측
y_pred = my_model.predict(X_test)
'@@@ 데이터분석 > Kaggle' 카테고리의 다른 글
[Kaggle] Titanic XGBoost 조정해보기 (0) | 2023.01.05 |
---|---|
[Kaggle] Titanic 성능 향상(23.01.04) (0) | 2023.01.04 |
[Kaggle] Titanic 연습해보기 (1) | 2022.12.30 |
[Kaggle] Kaggel 자주 사용하는 함수 (0) | 2022.12.27 |
[Kaggle] 분류 문제 - Titanic - Machine Learning from Disaster (2) (0) | 2022.12.26 |