이전의 글에서 언급한 것과 같이 XGBoost의 장점 중에는 오버핏에 강하고 다양한 파라미터 조정으로 최적화된 모델을 만들 수 있다고 했다.
이번 글에서는 이런 장점을 가능하게 해주는 XGBoost의 파라미터, 그중에서도 Tree Booster를 사용하기 위한 파라미터를 설명하고자 한다. (가장 많이 쓰이기도 하고, 다른 건 잘 안 써서 잘 모르기도 함)
Tree Booster를 사용하기 위해서는 세 가지 유형의 파라미터를 설정해야 한다.
- General parameter : 일반적으로 트리 또는 선형 모델에서 부스팅을 수행하는 데 사용하는 부스터와 관련된 파라미터이다.
- Booster parameter : 선택한 부스터의 파라미터에 따라 다름. 이글에서는 Tree Booster parameter를 설명할 예정
- Learning task parameter : 학습 시나리오를 결정한다. Regression은 Ranking 같은 파라미터와 다른 것들을 함께 사용할 수 있다.
검은색 글은 공식문서나 타 블로그 등에서 일반적으로 언급되는 객관적인 특성이나 설명이고
파란색 글은 내가 해보면서 느낀 주관적인 의견이다.
General Parameters
- booster
- 기본값 : gbtree
- 어떤 부스터를 쓸지 고른다. [gbtree, gblinear, dart] 중 하나
- verbosity
- 기본값 : 1
- 출력 메시지 레벨
- [0 (silent), 1 (warning), 2 (info), 3 (debug)] 중 하나
- validate_parameters
- 기본값 : false
- 파라미터 유효성 검사
- 설정. 여러 파라미터들을 설정하다 보면 서로 모순되는 값들을 넣는 실수를 하는 실수를 방지해준다.
- 아직 실험단계이다. 파이썬에선 지원되지 않기 때문에 나는 사용해본 적 없음.
- nthread
- 기본값 : 최대
- 학습에 사용할 thread수.
- ML전용 컴퓨터를 사용하기 때문에 따로 건드린 적 없이 기본값으로 최대만 사용해보았음.
- disable_default_eval_metric
- 기본값 : 0
- 0이면 기본 metric 사용, 아니면 기본 metric을 사용하지 않는다.
- 커스텀 metric을 사용할 경우 설정한다.
- num_pbuffer
- 기본값 : 자동으로 설정
- 마지막 부스팅 단계의 예측 결과를 저장하는 버퍼의 크기
- 자동으로 설정되기에 건드린 적 없음.
- num_feature
- 기본값 : 인풋 피쳐의 수와 동일하게 설정됨
- 부스팅에 사용되는 피쳐 수.
- 자동으로 설정되기에 건드린 적 없음.
Tree booster Parameter
- eta [alias: learning_rate]
- 기본값 : 0.3 / 범위 : [0,1]
- 학습률. 낮은 값일수록 모델이 견고해지고 오버 피팅 방지에 좋다.
- 일반적으로 0.01 ~ 0.3 정도로 설정하는데, 제한된 리소스를 가진 기계에 모델을 올려야 할 경우 Step 수를 줄이기 위해 0.9까지 올려 모델 크기를 최소화한 적도 있다. 일반적인 상황이라면 권장하지 않는다.
- gamma [alias: min_split_loss]
- 기본값 : 0 / 범위 : [0,∞]
- 이전 글에서 언급한 gain 값이 gamma 이상일 경우 자식 노드를 생성하도록 한다.
- Overfitting 방지에 좋으나 너무 높으면 underfitting 이 생길 수가 있음.
- lambda, alpha 값에도 영향을 받기 때문에, 파라미터 튜닝 시 세 가지를 동시에 바꿔가며 grid search를 하는 편
- max_depth
- 기본값 : 6 / 범위 : [0,∞]
- 최대 트리의 깊이. N이라고 가정하면 2^N개의 리프 노드가 생긴다. 10일 때 최대 1024개의 리프 노트가 생긴다.
- 일반적으로 Feature 수에 따라 3~6으로 세팅한 후 성능이 증가하고, 오버 피팅이 나지 않을 때까지 늘려간다.
- 제한된 리소스에 모델을 올려야 할 경우 울며 겨자 먹기로 약간의 성능을 포기하고 depth를 줄이기도 한다.
- subsample
- 기본값 : 1 범위: (0,1]
- 각각의 스탭마다 사용할 샘플의 비율. 1 이하의 값을 사용하면 오버 피팅을 방지할 수 있다.
- 개인적으로 cross validation을 주로 쓴다면 크게 중요한 파라미터가 아닌 것 같다.
- sampling_method
- 기본값 : uniform
- subsample을 1 이하로 설정한다면 샘플을 뽑는지 정의한다.
- [uniform, gradient_based] 중 하나
subsample은 data자체를 샘플링하는 것이고 colsample_* 파라미터는 feature를 샘플링하는 것이다.
colsample_* 파라미터는 feature가 너무 많거나 소수의 feature에 지나치게 의존적일 때 사용하면 좋음.
- colsample_bytree
- 기본값 : 1 / 범위 : (0,1]
- 각각의 트리(스탭)마다 사용할 칼럼(Feature)의 비율
- 개인적으로 colsample_* 파라미터 둘 중에 가장 효과가 좋은 것 같음.
- colsample_bylevel
- 기본값 : 1 / 범위 : (0,1]
- 각각의 트리 depth 마다 사용할 칼럼(Feature)의 비율
- colsample_bynode
- 기본값 : 1 / 범위 : (0,1]
- 각각의 노드 depth 마다 사용할 칼럼(Feature)의 비율
- colsample_bylevel와 비슷해 보이지만 이 경우 좌, 우 리프 노드가 서로 다른 feature를 사용하게 된다.
- lambda [alias: reg_lambda]
- 기본값 : 1 / 범위 : [0,∞]
- L2 정규화(규제) 파라미터이다.
- 커질수록 보수적인 모델을 생성하고 오버 피팅을 방지해준다. 지나치게 클 경우 언더 피팅이 난다.
- 너무 큰 가중치를 그 크기에 비례하여 줄여준다.
- noise나 outlier 같은 애들이나 너무 크게 튀는 데이터들을 어느 정도 잡아준다고 보면 된다.
- gamma, alpha와 함께 튜닝함.
- alpha [alias: reg_alpha]
- 기본값 : 0 / 범위: [0,∞]
- L1 정규화(규제) 파라미터이다.
- 커질수록 보수적인 모델을 생성하고 오버 피팅을 방지해준다.
- 불필요한 가중치를 0으로 만들어서 무시하도록 한다.
- sparse feature 가 있거나 feature수가 지나치게 많을 때 효과적이다.
- gamma, lambda와 함께 튜닝함.
- scale_pos_weight
- [default=1]
- 데이터 클래스(레이블) 불균형이 있을 때 레이블 가중치를 조절해주는 파라미터
- 권장 값 : sum(negative instances) / sum(positive instances)
- 왜 끝에 설명하는지 모르겠지만 굉장히 중요한 파라미터. 데이터 불균형이 심한 경우 꼭 설정해주는 게 좋다.
Learning Task Parameters
학습 목표에 관련된 파라미터는 다음과 같다.
- objective
- 기본값 : reg:squarederror
- 목적함수이다. 이 함수를 통해 나온 값이 최소화되는 방향으로 학습된다.
- 종류가 너무 다양해 자주 쓰는 것들만 설명하자면
- reg:squarederror / reg:squaredlogerror : 오차 제곱 / 오차 로그 제곱
- binary:logistic : 이항 분류(binary class)에 사용. 이항 분류는 대부분 이놈만 쓴다.
- multi:softmax / multi:softprob : 다항 분류(multi class)에 사용.
- rank:pairwise / rank:ndcg / rank:map : l2r에 사용
- base_score
- 기본값 : 0.5
- 초기 편향치(bias)이다.
- 범위가 0~1 사이가 아닌 값을 예측하는 경우 이 값을 그 중간 값으로 설정해주면 가끔 성능이 좋아지거나 빨리 종료되기도 한다.
- eval_metric
- 기본값 : objective에 따라 다름.
- 평가 지표이다. 각 스텝마다 완성된 모델을 이 지표를 통해서 평가한다.
- 이것도 너무 많으므로 자주 쓴 것들만 설명.
- rmse / rmsle : 글자 그대로 역순으로 해석하면 된다. 에러 (로그) 제곱 평균의 루트 값
- mae : 오차 절댓값 평균
- error / error@t : 이항 분류(binary class)에서 error는 0.5 이상을 1 미만을 0이라고 판단하고 error@t는 t 이상을 1 미만을 0이라고 판단한다.
- merror : error의 다항 분류(multi class) 버전
- auc : auc는 area under curve의 약자로 즉 곡선 아래의 면적 이란 뜻이다. 보통 auc라고 하면 roc auc을 뜻한다. FPR과 TPR에 민감한 데이터 셋 일 경우 사용한다.
- aucpr : auc뒤에 붙은 pr은 preicison recall을 뜻한다. f-score나 precision, recall에 민감할 때 사용한다.(error나 rmse가 더 잘 나오는 경우도 많으니 다 해봐야 함.)
- seed
- 기본값 : 0
- 랜덤 시드이다. 같은 데이터 셋으로 여러 모델을 비교할 때는 같은 값으로 설정하고 비교해야 한다.
기타
쓰고 보니 가장 중요한 파라미터가 왜 공식문서에 없는지 모르겠다.
- num_boost_round
- 기본값 : 의무 설정 / 범위: [0,∞]
- 몇 회의 step을 반복할지 지정한다. 너무 높은 값을 사용하면 오버 피팅이 생기고 모델의 사이즈가 커진다.
- early_stopping_rounds
- 기본값 : 설정하지 않을 경우 비활성화. / 범위: [0,∞]
- 조기 종료 조건이다.
- eval_metric이 결과가 early_stopping_rounds 횟수 동안 개선되지 않으면 num_boost_round에 도달하기 전에 종료한다.
코드상으로 보면 기껏해야 10개 내로 설정하는 것 같은데, 이렇게 설명해보니 엄청나게 많다.(이것도 많이 건너뛴 거라는 거..) 결국에 자신이 만들려는 모델에 맞은 파라미터들을 고르다 보면 자연스럽게 이해된다.
외우거나 정독하려고 애쓰지 말자. 아 ~ 이런 게 있구나 정도로만 이해하면 된다.
REFERENCE
개인적인 의견이 많이 섞여있는 설명이기에 다른 의견이 있으시면 댓글 남겨주세요. 환영합니다!!
'ML | DL | Big data > ML' 카테고리의 다른 글
VAR(Vector Auto Regression)을 이용한 다변량 시계열 분석 및 예측 (6) | 2020.09.26 |
---|---|
시계열 예측을 지도 학습으로 바꾸는 방법 - Time Series to Supervised Learning with Sliding window (1) | 2020.09.11 |
Python Prophet - 자동차 판매량 시계열 데이터 예측하기(Time Series Forecasting) (3) | 2020.08.28 |
XGBoost (4) - 머신러닝으로 부동산 가격 예측 실습하기 / Tutorial (0) | 2020.07.14 |
XGBoost (3) - Python 가상 환경에 설치하기 (0) | 2020.07.13 |
XGBoost (1) - 입문용 예제로 개념 쉽게 이해하기 (0) | 2020.07.08 |
댓글